From 39a18e81d8b42eac9af651728c947f175f5ce04d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 17:57:51 -0500 Subject: [PATCH 01/15] test(scripts[source-links]) Cover embedded source routes --- site/test/source-links.test.ts | 107 +++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 site/test/source-links.test.ts diff --git a/site/test/source-links.test.ts b/site/test/source-links.test.ts new file mode 100644 index 00000000..42cdf7df --- /dev/null +++ b/site/test/source-links.test.ts @@ -0,0 +1,107 @@ +import { execFileSync, spawnSync } from 'node:child_process' +import { copyFileSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import type { ApiModel, ApiSymbol } from '../../packages/api-model/src/model.ts' +import { sourceUrl } from '../../packages/api-model/src/products.ts' + +const root = new URL('../../', import.meta.url).pathname +const directories: string[] = [] +afterEach(() => directories.splice(0).forEach((directory) => rmSync(directory, { recursive: true, force: true }))) + +function fixture(port: 'java' | 'kotlin' | 'scala' = 'kotlin', { generated = true } = {}) { + const directory = mkdtempSync(join(tmpdir(), 'libtmux-source-links-')) + directories.push(directory) + const checkout = join(directory, 'checkout') + mkdirSync(join(checkout, 'src'), { recursive: true }) + mkdirSync(join(directory, 'scripts'), { recursive: true }) + mkdirSync(join(directory, 'site/src/lib'), { recursive: true }) + mkdirSync(join(directory, 'site/src/data/api'), { recursive: true }) + copyFileSync(join(root, 'scripts/check-source-links.mjs'), join(directory, 'scripts/check-source-links.mjs')) + writeFileSync(join(directory, 'site/src/lib/ports.ts'), `export const PORTS = ${JSON.stringify([{ slug: port, checkout }])}\n`) + writeFileSync(join(directory, 'package.json'), '{"type":"module"}') + writeFileSync(join(checkout, 'src/Server.java'), 'package fixture;\nclass Server {}\n') + const git = (...args: string[]) => execFileSync('git', ['-C', checkout, ...args], { + encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], + }).trim() + git('init', '-q') + git('add', 'src/Server.java') + git('-c', 'user.name=Fixture', '-c', 'user.email=fixture@example.invalid', '-c', 'commit.gpgsign=false', + 'commit', '-qm', 'Source link fixture') + const revision = git('rev-parse', 'HEAD') + git('update-ref', 'refs/remotes/origin/main', revision) + const native = JSON.parse(readFileSync(join(root, `site/src/data/api/${port}.json`), 'utf8')) as ApiModel + const declaration = structuredClone(native.symbols.find((symbol) => Object.hasOwn(native.generatedSources!, symbol.source.file))!) + const file = declaration.source.file + const content = native.generatedSources![file] + declaration.source = { ...declaration.source, repo: 'fixture/library', revision, extractedRevision: revision } + const ordinary: ApiSymbol = { id: 'Server', name: 'Server', kind: 'class', modifiers: [], signatures: [], + source: { file: 'src/Server.java', line: 2 } } + const model: ApiModel = { port, extractor: 'fixture', repo: 'fixture/library', revision, + symbols: generated ? [ordinary, declaration] : [ordinary], + ...(generated ? { generatedSources: { [file]: content } } : {}), + } + const invoke = () => { + writeFileSync(join(directory, `site/src/data/api/${port}.json`), JSON.stringify(model)) + return spawnSync(process.execPath, [join(directory, 'scripts/check-source-links.mjs'), '--port', port], { + encoding: 'utf8', timeout: 5000, + }) + } + return { model, ordinary, declaration, file, content, git, revision, invoke } +} + +describe('source link audit', () => { + it.fails.each(['java', 'kotlin', 'scala'] as const)('accepts the embedded source route for a real %s declaration', (port) => { + const { model, declaration, file, git, revision, invoke } = fixture(port) + expect(sourceUrl(model, declaration, `/pr-42/en/${port}/v1/reference/`)) + .toBe(`/pr-42/en/${port}/v1/reference/sources/${file}`) + expect(git('ls-tree', '--name-only', revision, '--', file)).toBe('') + const result = invoke() + expect(result.error).toBeUndefined() + expect(result.status, result.stderr).toBe(0) + expect(result.stdout).not.toContain('skipped') + }) + + it('accepts a public Git source and an unspecified line', () => { + const { ordinary, invoke } = fixture('java', { generated: false }) + expect(invoke().status).toBe(0) + delete ordinary.source.line + const result = invoke() + expect(result.status, result.stderr).toBe(0) + expect(result.stdout).toContain('1 without a line') + }) + + it('rejects a commit absent from the source repository', () => { + const { model, invoke } = fixture('java', { generated: false }) + model.revision = '0'.repeat(40) + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('revision 00000000 is not in') + }) + + it('rejects a commit reachable only through the private remote', () => { + const { git, revision, invoke } = fixture('java', { generated: false }) + git('update-ref', '-d', 'refs/remotes/origin/main') + git('update-ref', 'refs/remotes/tony/main', revision) + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('on no public remote (tony)') + }) + + it.each(['src/Missing.java', '../Server.java', '/Server.java'])('rejects the absent or escaping Git path %s', (file) => { + const { ordinary, invoke } = fixture('java', { generated: false }) + ordinary.source.file = file + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('name a path absent at') + }) + + it.each([0, 99])('rejects the out-of-range Git source line %s', (line) => { + const { ordinary, invoke } = fixture('java', { generated: false }) + ordinary.source.line = line + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('point past the end of their file') + }) +}) From a57b66e2f1ae1eee1a55b5e8d44b93bf3f358f8d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 17:59:06 -0500 Subject: [PATCH 02/15] fix(scripts[source-links]) Audit embedded source routes why: Generated declarations link to embedded raw source routes, so requiring their paths in Git rejects valid JVM source links. what: - Validate embedded source text, canonical paths and line bounds - Retain commit, public remote, path and line checks for Git links --- scripts/check-source-links.mjs | 38 +++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/scripts/check-source-links.mjs b/scripts/check-source-links.mjs index 403a3a7c..05a171f4 100755 --- a/scripts/check-source-links.mjs +++ b/scripts/check-source-links.mjs @@ -8,9 +8,9 @@ * normalisation had introduced, and three ports naming a commit that exists * only on a private fork — and both were invisible in a green build. * - * Checked against git rather than HTTP so it runs offline, in CI, and without - * rate limits. git is also the stronger check: it can say the path exists *at - * that commit*, which a 200 from a moved file would not. + * Git links are checked against their commit without HTTP or rate limits. + * Generated sources use owned raw routes, checked against the embedded text + * those routes serve rather than a file that need not be committed. * * Usage: node scripts/check-source-links.mjs [--port py] */ @@ -89,19 +89,51 @@ for (const [port, where] of Object.entries(CHECKOUT)) { } const model = JSON.parse(readFileSync(modelPath, 'utf8')) + const generatedLengths = new Map() + const beforeGenerated = failed + if (model.generatedSources !== undefined) { + if (!model.generatedSources || typeof model.generatedSources !== 'object' || Array.isArray(model.generatedSources)) { + report(port, 'generatedSources must map relative source paths to text') + } else { + for (const [file, content] of Object.entries(model.generatedSources)) { + generatedLengths.set(file, null) + if (!file || /[\\?#%\p{Cc}]/u.test(file) || /^[a-z]:/i.test(file) || + file.split('/').some((part) => !part || part === '.' || part === '..')) { + report(port, `generated source ${JSON.stringify(file)} is not a canonical relative path`) + } else if (typeof content !== 'string' || !content.trim() || content.includes('\0')) { + report(port, `generated source ${JSON.stringify(file)} must contain nonempty text`) + } else { + generatedLengths.set(file, content.split('\n').length) + } + } + } + } const units = new Map() + let generatedLocations = 0 const locations = model.symbols.flatMap((symbol) => [symbol, ...symbol.signatures.filter((signature) => signature.source).map((signature, index) => ({ id: `${symbol.id} signature ${index + 1}`, source: signature.source, })), ]) for (const symbol of locations) { + if (generatedLengths.has(symbol.source.file)) { + const length = generatedLengths.get(symbol.source.file) + const line = symbol.source.line + if (length !== null && line !== undefined && (!Number.isInteger(line) || line < 1 || line > length)) { + report(port, `${symbol.id} points outside embedded generated source ${JSON.stringify(symbol.source.file)}`) + } + generatedLocations++ + continue + } const repository = symbol.source.repo ?? model.repo const revision = symbol.source.revision ?? model.revision const key = `${repository}@${revision}` if (!units.has(key)) units.set(key, { repository, revision, symbols: [] }) units.get(key).symbols.push(symbol) } + if (generatedLengths.size && failed === beforeGenerated) { + console.log(`check-source-links: ${port} ${generatedLocations} generated declaration and method locations, ${generatedLengths.size} embedded files`) + } for (const unit of units.values()) { const repo = expand(PRODUCT_CHECKOUT[unit.repository] ?? where) const rev = unit.revision From f41a5ae639ef8da34f9fc3ab6891469065c4c874 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 18:01:32 -0500 Subject: [PATCH 03/15] test(scripts[source-links]) Enforce generated source checks --- site/test/source-links.test.ts | 111 ++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/site/test/source-links.test.ts b/site/test/source-links.test.ts index 42cdf7df..388e3c3c 100644 --- a/site/test/source-links.test.ts +++ b/site/test/source-links.test.ts @@ -48,11 +48,11 @@ function fixture(port: 'java' | 'kotlin' | 'scala' = 'kotlin', { generated = tru encoding: 'utf8', timeout: 5000, }) } - return { model, ordinary, declaration, file, content, git, revision, invoke } + return { model, native, ordinary, declaration, file, content, git, revision, invoke } } describe('source link audit', () => { - it.fails.each(['java', 'kotlin', 'scala'] as const)('accepts the embedded source route for a real %s declaration', (port) => { + it.each(['java', 'kotlin', 'scala'] as const)('accepts the embedded source route for a real %s declaration', (port) => { const { model, declaration, file, git, revision, invoke } = fixture(port) expect(sourceUrl(model, declaration, `/pr-42/en/${port}/v1/reference/`)) .toBe(`/pr-42/en/${port}/v1/reference/sources/${file}`) @@ -63,6 +63,113 @@ describe('source link audit', () => { expect(result.stdout).not.toContain('skipped') }) + it.each(['java', 'kotlin', 'scala'] as const)('checks every embedded %s catalog location against its emitted text', (port) => { + const { model, native, ordinary, revision, invoke } = fixture(port) + const generated = native.symbols.filter((symbol) => Object.hasOwn(native.generatedSources!, symbol.source.file)) + model.generatedSources = native.generatedSources + model.symbols = [ordinary, ...generated.map((symbol) => ({ ...symbol, + source: { ...symbol.source, repo: model.repo, revision, extractedRevision: revision }, + }))] + const result = invoke() + expect(result.status, result.stderr).toBe(0) + expect(result.stdout).toContain(`${generated.length} generated declaration and method locations, ${Object.keys(native.generatedSources!).length} embedded files`) + expect(result.stdout).not.toContain('skipped') + }) + + it('requires an embedded entry instead of exempting generated-looking paths', () => { + const { model, file, invoke } = fixture() + delete model.generatedSources![file] + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain(`name a path absent at`) + expect(result.stderr).toContain(file) + }) + + it('selects an embedded route by its catalog entry without a path-prefix convention', () => { + const { model, ordinary, invoke } = fixture() + model.symbols = [ordinary] + model.generatedSources = { [ordinary.source.file]: 'package embedded;\nclass Server {}\n' } + expect(sourceUrl(model, ordinary, '/en/kotlin/latest/reference/')) + .toBe('/en/kotlin/latest/reference/sources/src/Server.java') + const result = invoke() + expect(result.status, result.stderr).toBe(0) + expect(result.stdout).toContain('1 generated declaration and method locations') + }) + + it.each([null, [], 'text', 42])('rejects a malformed generated-source catalog: %j', (catalog) => { + const { model, invoke } = fixture() + model.generatedSources = catalog as unknown as Record + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('generatedSources must map relative source paths to text') + }) + + it.each([null, {}, [], 42, true, '', ' \n', 'source\0text'])('rejects missing or non-text embedded content: %j', (content) => { + const { model, file, invoke } = fixture() + model.generatedSources![file] = content as unknown as string + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('must contain nonempty text') + }) + + it('rejects truncated embedded content using the actual declaration line', () => { + const { model, file, declaration, invoke } = fixture() + expect(declaration.source.line).toBeGreaterThan(1) + model.generatedSources![file] = 'truncated source' + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('points outside embedded generated source') + }) + + it.each(['../Outside.kt', '/Outside.kt', 'src/../Outside.kt', 'src/./Outside.kt', 'src//Outside.kt', + 'src\\Outside.kt', 'src/%2e%2e/Outside.kt', 'src/Outside.kt?raw=1', 'src/Outside.kt#fragment', + 'C:/Outside.kt', 'src/Outside\n.kt'])('rejects a generated route path that changes its destination: %j', (file) => { + const { model, declaration, content, invoke } = fixture() + model.generatedSources = { [file]: content } + declaration.source.file = file + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('is not a canonical relative path') + }) + + it('checks unreferenced embedded files because they also become source routes', () => { + const { model, invoke } = fixture() + model.generatedSources!['../Unused.kt'] = 'unreferenced source' + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('generated source "../Unused.kt" is not a canonical relative path') + }) + + it.each([0, -1, 1.5, '2', null, 100000])('rejects an invalid generated declaration line: %j', (line) => { + const { declaration, invoke } = fixture() + declaration.source.line = line as number + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('points outside embedded generated source') + }) + + it('checks generated signature locations independently of the owner source', () => { + const { model, ordinary, declaration, content, invoke } = fixture() + model.symbols = [ordinary] + ordinary.signatures = [{ params: [], source: { ...declaration.source } }] + const valid = invoke() + expect(valid.status, valid.stderr).toBe(0) + expect(valid.stdout).toContain('1 generated declaration and method locations') + ordinary.signatures[0].source!.line = content.split('\n').length + 1 + const invalid = invoke() + expect(invalid.status).toBe(1) + expect(invalid.stderr).toContain('Server signature 1 points outside embedded generated source') + }) + + it('retains ordinary Git signature checks on an owner with embedded source', () => { + const { declaration, invoke } = fixture() + declaration.signatures = [{ params: [], source: { file: 'src/Missing.java', line: 1 } }] + const result = invoke() + expect(result.status).toBe(1) + expect(result.stderr).toContain('name a path absent at') + expect(result.stderr).toContain('src/Missing.java') + }) + it('accepts a public Git source and an unspecified line', () => { const { ordinary, invoke } = fixture('java', { generated: false }) expect(invoke().status).toBe(0) From a7cb7b55657f2533b54b47f4f1829fa3427cf728 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 18:01:40 -0500 Subject: [PATCH 04/15] fix(site[mcp]) Reconcile catalog source revisions why: TypeScript and Julia catalog source links no longer match the reviewed API model pins, so the ordinary freshness check fails. what: - Regenerate advertised revisions and mapped registration lines. - Preserve captured runtime contracts and use generator port ordering. Validation: unchanged ordinary generator fails before and passes after with all ten genuine captured-source checkouts. Runtime capture unchanged. --- site/src/data/mcp-tools.json | 88646 ++++++++++++++++----------------- 1 file changed, 44323 insertions(+), 44323 deletions(-) diff --git a/site/src/data/mcp-tools.json b/site/src/data/mcp-tools.json index e5b86130..a8d46270 100644 --- a/site/src/data/mcp-tools.json +++ b/site/src/data/mcp-tools.json @@ -10192,9187 +10192,6949 @@ } } }, - "ts": { + "ruby": { "tools": [ - "call_read_tools_batch", - "capture_pane", - "capture_since", - "clear_pane_scrollback", - "create_session", - "create_window", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "kill_pane", - "kill_session", - "kill_window", - "list_panes", - "list_sessions", - "list_windows", - "move_window", - "paste_text", - "rename_session", - "rename_window", - "resize_pane", - "resize_window", - "respawn_pane", - "run_shell_command", - "search_panes", - "select_layout", - "select_pane", - "select_window", - "send_keys", - "send_keys_batch", - "set_history_limit", - "set_mouse_enabled", - "set_pane_title", - "set_synchronize_panes", - "show_environment", - "show_hooks", - "show_option", - "signal_channel", - "snapshot_pane", - "split_window", - "swap_pane", - "wait_for_channel", - "wait_for_text" + "capabilities", + "capture", + "close", + "create", + "run", + "send", + "snapshot", + "wait" ], "registrations": [ { - "name": "call_read_tools_batch", - "wireName": "call_read_tools_batch", + "name": "capabilities", + "wireName": "tmux_capabilities", "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 618 + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 249 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. The structured result is capped below 1,000,000 bytes, preserves every operation row, and reports explicit stop and truncation accounting.", + "description": "Discover the fixed endpoint, server binding, enabled tools, criteria schema and limits. Acquires metadata; starts no daemon.", "schemaStatus": "runtime", + "enabledByDefault": true, "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "onError": { - "description": "Whether a failed operation ends the batch. Defaults to stop.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "The read-only tool calls to run, in order, in one approval.", - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_sessions`, exactly the shape it takes when called on its own.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "list_sessions", - "description": "Run `list_sessions` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_windows`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for all sessions.", - "type": "string" - } + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "authored_run": { + "additionalProperties": false, + "properties": { + "authorization": { + "const": "exact_generation_at_queue_grant" }, - "type": "object" - }, - "tool": { - "const": "list_windows", - "description": "Run `list_windows` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_panes`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name.", + "availability": { + "enum": [ + "conditional", + "unsupported" + ] + }, + "descendant_termination": { + "const": "unobserved" + }, + "enrollment": { + "const": "explicit_source" + }, + "persistent_shell_changes": { + "const": false + }, + "requirements": { + "items": { "type": "string" }, - "window": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } + "type": "array" }, - "type": "object" - }, - "tool": { - "const": "list_panes", - "description": "Run `list_panes` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_pane_info`, exactly the shape it takes when called on its own.", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } + "shell_profile": { + "const": "zsh-5.9-zle" }, - "required": [ - "paneId" - ], - "type": "object" + "stdin": { + "const": "closed" + } }, - "tool": { - "const": "get_pane_info", - "description": "Run `get_pane_info` as this step of the batch.", - "type": "string" - } + "required": [ + "availability", + "shell_profile", + "enrollment", + "authorization", + "stdin", + "persistent_shell_changes", + "descendant_termination", + "requirements" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_server_info`, exactly the shape it takes when called on its own.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "get_server_info", - "description": "Run `get_server_info` as this step of the batch.", - "type": "string" - } + "criteria_schema": { + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `capture_pane`, exactly the shape it takes when called on its own.", - "properties": { - "end": { - "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "joinWrapped": { - "description": "Rejoin lines tmux wrapped.", - "type": "boolean" - }, - "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" - }, - "start": { - "description": "First line; negative reaches into scrollback.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane", - "description": "Run `capture_pane` as this step of the batch.", + "enabled_tools": { + "items": { "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `capture_since`, exactly the shape it takes when called on its own.", - "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" }, - "tool": { - "const": "capture_since", - "description": "Run `capture_since` as this step of the batch.", - "type": "string" - } + "type": "array" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `search_panes`, exactly the shape it takes when called on its own.", - "properties": { - "maxMatchesPerPane": { - "description": "Stop after this many matches in each pane. Defaults to the server limit.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "pattern": { - "description": "Non-empty literal text to find.", - "minLength": 1, - "type": "string" - }, - "regex": { - "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "How far above the visible screen to search. Default 0.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Restrict to one session by id or name.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" + "endpoint": { + "type": "string" + }, + "limits": { + "additionalProperties": { + "type": "number" }, - "tool": { - "const": "search_panes", - "description": "Run `search_panes` as this step of the batch.", - "type": "string" - } + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_option`, exactly the shape it takes when called on its own.", - "properties": { - "name": { - "description": "The tmux option to read, such as \"status-left\".", + "observation": { + "additionalProperties": false, + "properties": { + "history_continuity": { + "const": "unknown" + }, + "process_cursor": { + "enum": [ + "conditional", + "unsupported" + ] + }, + "requirements": { + "items": { "type": "string" }, - "scope": { - "description": "Default server.", + "type": "array" + }, + "screen": { + "const": "bounded_rows" + }, + "wait_conditions": { + "items": { "enum": [ - "server", - "session", - "global-session", - "window", - "global-window", - "pane" - ], - "type": "string" + "screen_contains", + "process_exit" + ] }, - "target": { - "description": "Session id/name or pane id, for the matching scope.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" + "type": "array" + } }, - "tool": { - "const": "show_option", - "description": "Run `show_option` as this step of the batch.", - "type": "string" - } + "required": [ + "screen", + "history_continuity", + "process_cursor", + "requirements", + "wait_conditions" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_hooks`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session scope; omit for server scope.", - "type": "string" - } + "owns_daemon": { + "const": false + }, + "resource_subscriptions": { + "const": false + }, + "server_identity": { + "additionalProperties": false, + "properties": { + "generation": { + "type": "string" }, - "type": "object" + "pid": { + "type": "integer" + }, + "start_time": { + "type": "integer" + }, + "tmux_version": { + "type": "string" + } }, - "tool": { - "const": "show_hooks", - "description": "Run `show_hooks` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_environment`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for the server environment.", - "type": "string" - } - }, - "type": "object" - }, - "tool": { - "const": "show_environment", - "description": "Run `show_environment` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" + "required": [ + "generation", + "pid", + "start_time", + "tmux_version" + ], + "type": "object" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_session_info`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "description": "Run `get_session_info` as this step of the batch.", - "type": "string" - } + "required": [ + "endpoint", + "server_identity", + "enabled_tools", + "criteria_schema", + "limits", + "owns_daemon", + "resource_subscriptions", + "authored_run", + "observation" + ], + "type": "object" + }, + "ok": { + "const": true + } + }, + "required": [ + "ok", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_window_info`, exactly the shape it takes when called on its own.", - "properties": { - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "description": "Run `get_window_info` as this step of the batch.", - "type": "string" - } + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `find_pane_by_position`, exactly the shape it takes when called on its own.", - "properties": { - "corner": { - "description": "Which corner of the window's layout to resolve.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } + "maxItems": 3, + "type": "array" }, - "required": [ - "corner", - "windowId" - ], - "type": "object" + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "tool": { - "const": "find_pane_by_position", - "description": "Run `find_pane_by_position` as this step of the batch.", - "type": "string" - } + "required": [ + "state", + "created" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" + "message": { + "type": "string" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_tmux_variables`, exactly the shape it takes when called on its own.", - "properties": { - "names": { - "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array", - "x-libtmux-tmux-format": "validated-variable-name" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } + "required": [ + "code", + "message", + "delivery" + ], + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error" + ], + "type": "object" + } + ] + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + } + }, + { + "name": "capture", + "wireName": "tmux_capture", + "source": { + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 239 + }, + "description": "Read exact-pane screen/history rows preserving LF. Defaults: 200 lines, 65536 bytes, zero history lines, track=false. Limits: 1000 lines/history, 262144 bytes. UTF-8 or base64; truncation is separate from unknown history continuity. Tracked process cursors require tmux>=3.3 and a native process identity backend: Linux peer pidfds with matching PID namespaces, or Darwin kqueue process observation. Continuation returns an exact state row splice, not a live-output journal. Refuses capture after-hooks.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "history_lines": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "max_bytes": { + "maximum": 262144, + "minimum": 1, + "type": "integer" + }, + "max_lines": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "description": "Run `get_tmux_variables` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `snapshot_pane`, exactly the shape it takes when called on its own.", - "properties": { - "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" - } + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" }, - "required": [ - "paneId" - ], - "type": "object" + "kind": { + "const": "pane" + } }, - "tool": { - "const": "snapshot_pane", - "description": "Run `snapshot_pane` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - } - ] + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + }, + "track": { + "type": "boolean" + } }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "failed": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "onError": { - "enum": [ - "stop", - "continue" + "required": [ + "target" ], - "type": "string" + "type": "object" }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "result": { - "anyOf": [ - { - "additionalProperties": {}, - "properties": { - "content": { - "items": {}, - "type": "array" - }, - "isError": { - "type": "boolean" - }, - "structuredContent": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - } + { + "additionalProperties": false, + "properties": { + "cursor": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "content" - ], - "type": "object" + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } }, - { - "type": "null" - } - ] - }, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "error", - "index", - "result", - "resultTruncated", - "success", - "tool" - ], - "type": "object" - }, - "type": "array" - }, - "stoppedAt": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] } - ] - }, - "succeeded": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + }, + "required": [ + "target", + "cursor" + ], + "type": "object" } - }, - "required": [ - "failed", - "onError", - "results", - "stoppedAt", - "succeeded", - "truncated", - "truncatedBytes" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. The structured result is capped below 1,000,000 bytes, preserves every operation row, and reports explicit stop and truncation accounting.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, "properties": { - "onError": { - "description": "Whether a failed operation ends the batch. Defaults to stop.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "The read-only tool calls to run, in order, in one approval.", - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_sessions`, exactly the shape it takes when called on its own.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "list_sessions", - "description": "Run `list_sessions` as this step of the batch.", - "type": "string" - } + "data": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_windows`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for all sessions.", - "type": "string" - } + "capture_id": { + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "history_continuity": { + "const": "unknown" + }, + "interval": { + "additionalProperties": false, + "properties": { + "clock": { + "const": "monotonic_seconds" }, - "type": "object" + "finished": { + "type": "number" + }, + "started": { + "type": "number" + } }, - "tool": { - "const": "list_windows", - "description": "Run `list_windows` as this step of the batch.", + "required": [ + "clock", + "started", + "finished" + ], + "type": "object" + }, + "mode": { + "const": "snapshot" + }, + "next_cursor": { + "type": "string" + }, + "process_generation": { + "type": [ + "string", + "null" + ] + }, + "row_count": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "rows": { + "items": { "type": "string" - } + }, + "maxItems": 1000, + "type": "array" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `list_panes`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" - }, - "window": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } + "scope": { + "additionalProperties": false, + "properties": { + "history_lines": { + "maximum": 1000, + "minimum": 0, + "type": "integer" }, - "type": "object" + "max_bytes": { + "maximum": 262144, + "minimum": 1, + "type": "integer" + }, + "max_lines": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + } }, - "tool": { - "const": "list_panes", - "description": "Run `list_panes` as this step of the batch.", - "type": "string" - } + "required": [ + "max_lines", + "max_bytes", + "history_lines" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + }, + "truncated": { + "type": "boolean" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_pane_info`, exactly the shape it takes when called on its own.", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } + "required": [ + "target", + "capture_id", + "process_generation", + "encoding", + "row_count", + "bytes", + "truncated", + "history_continuity", + "interval", + "scope", + "mode", + "rows" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base_capture_id": { + "type": "string" + }, + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "capture_id": { + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "history_continuity": { + "const": "unknown" + }, + "interval": { + "additionalProperties": false, + "properties": { + "clock": { + "const": "monotonic_seconds" }, - "required": [ - "paneId" - ], - "type": "object" + "finished": { + "type": "number" + }, + "started": { + "type": "number" + } }, - "tool": { - "const": "get_pane_info", - "description": "Run `get_pane_info` as this step of the batch.", - "type": "string" - } + "required": [ + "clock", + "started", + "finished" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_server_info`, exactly the shape it takes when called on its own.", - "properties": {}, - "type": "object" + "mode": { + "const": "delta" + }, + "next_cursor": { + "type": "string" + }, + "process_generation": { + "type": [ + "string", + "null" + ] + }, + "reset": { + "type": "boolean" + }, + "row_count": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "scope": { + "additionalProperties": false, + "properties": { + "history_lines": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "max_bytes": { + "maximum": 262144, + "minimum": 1, + "type": "integer" + }, + "max_lines": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + } }, - "tool": { - "const": "get_server_info", - "description": "Run `get_server_info` as this step of the batch.", - "type": "string" - } + "required": [ + "max_lines", + "max_bytes", + "history_lines" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `capture_pane`, exactly the shape it takes when called on its own.", - "properties": { - "end": { - "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "joinWrapped": { - "description": "Rejoin lines tmux wrapped.", - "type": "boolean" - }, - "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+$", + "splice": { + "additionalProperties": false, + "properties": { + "delete": { + "minimum": 0, + "type": "integer" + }, + "rows": { + "items": { "type": "string" }, - "start": { - "description": "First line; negative reaches into scrollback.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } + "maxItems": 1000, + "type": "array" }, - "required": [ - "paneId" - ], - "type": "object" + "start": { + "minimum": 0, + "type": "integer" + } }, - "tool": { - "const": "capture_pane", - "description": "Run `capture_pane` as this step of the batch.", - "type": "string" - } + "required": [ + "start", + "delete", + "rows" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `capture_since`, exactly the shape it takes when called on its own.", - "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" + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } }, - "waitMs": { - "description": "Wait up to this long for new output before answering. Default 0.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "description": "Run `capture_since` as this step of the batch.", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] }, - "required": [ - "tool" - ], - "type": "object" + "truncated": { + "type": "boolean" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `search_panes`, exactly the shape it takes when called on its own.", - "properties": { - "maxMatchesPerPane": { - "description": "Stop after this many matches in each pane. Defaults to the server limit.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "pattern": { - "description": "Non-empty literal text to find.", - "minLength": 1, - "type": "string" - }, - "regex": { - "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "How far above the visible screen to search. Default 0.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "required": [ + "target", + "capture_id", + "process_generation", + "encoding", + "row_count", + "bytes", + "truncated", + "history_continuity", + "interval", + "scope", + "mode", + "base_capture_id", + "reset", + "splice", + "next_cursor" + ], + "type": "object" + } + ] + }, + "ok": { + "const": true + } + }, + "required": [ + "ok", + "data" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] + }, + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "session": { - "description": "Restrict to one session by id or name.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "tool": { - "const": "search_panes", - "description": "Run `search_panes` as this step of the batch.", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_option`, exactly the shape it takes when called on its own.", - "properties": { - "name": { - "description": "The tmux option to read, such as \"status-left\".", - "type": "string" + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "scope": { - "description": "Default server.", - "enum": [ - "server", - "session", - "global-session", - "window", - "global-window", - "pane" + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" ], - "type": "string" + "type": "object" }, - "target": { - "description": "Session id/name or pane id, for the matching scope.", - "type": "string" + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" } - }, - "required": [ - "name" - ], - "type": "object" + ] }, - "tool": { - "const": "show_option", - "description": "Run `show_option` as this step of the batch.", - "type": "string" - } + "maxItems": 3, + "type": "array" }, - "required": [ - "tool" - ], - "type": "object" + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_hooks`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session scope; omit for server scope.", - "type": "string" - } - }, - "type": "object" - }, - "tool": { - "const": "show_hooks", - "description": "Run `show_hooks` as this step of the batch.", - "type": "string" - } + "required": [ + "state", + "created" + ], + "type": "object" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message", + "delivery" + ], + "type": "object" + }, + "ok": { + "const": false + } + }, + "required": [ + "ok", + "error" + ], + "type": "object" + } + ] + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + } + }, + { + "name": "close", + "wireName": "tmux_close", + "source": { + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 247 + }, + "description": "Destroy one exact session, window or pane. Opt-in destructive operation; closing a session or window also removes its contained topology. Never selects by name or closes the daemon directly. Returns the final tmux client outcome.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `show_environment`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for the server environment.", - "type": "string" - } - }, - "type": "object" - }, - "tool": { - "const": "show_environment", - "description": "Run `show_environment` as this step of the batch.", - "type": "string" - } + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "kind": { + "const": "session" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_session_info`, exactly the shape it takes when called on its own.", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "description": "Run `get_session_info` as this step of the batch.", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_window_info`, exactly the shape it takes when called on its own.", - "properties": { - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "description": "Run `get_window_info` as this step of the batch.", - "type": "string" - } + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "kind": { + "const": "window" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `find_pane_by_position`, exactly the shape it takes when called on its own.", - "properties": { - "corner": { - "description": "Which corner of the window's layout to resolve.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target" + ], + "type": "object" + } + ], + "type": "object" + }, + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "client_exit_status": { + "const": 0 + }, + "delivery": { + "const": "observed" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "corner", - "windowId" - ], - "type": "object" + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } }, - "tool": { - "const": "find_pane_by_position", - "description": "Run `find_pane_by_position` as this step of the batch.", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `get_tmux_variables`, exactly the shape it takes when called on its own.", - "properties": { - "names": { - "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array", - "x-libtmux-tmux-format": "validated-variable-name" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "names" - ], - "type": "object" + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } }, - "tool": { - "const": "get_tmux_variables", - "description": "Run `get_tmux_variables` as this step of the batch.", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "Arguments for `snapshot_pane`, exactly the shape it takes when called on its own.", - "properties": { - "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" - } + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" }, - "required": [ - "paneId" - ], - "type": "object" + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } }, - "tool": { - "const": "snapshot_pane", - "description": "Run `snapshot_pane` as this step of the batch.", - "type": "string" - } + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "required": [ - "tool" - ], - "type": "object" - } - ] + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] + } }, - "maxItems": 16, - "minItems": 1, - "type": "array" + "required": [ + "target", + "delivery", + "client_exit_status" + ], + "type": "object" + }, + "ok": { + "const": true } }, "required": [ - "operations" + "ok", + "data" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "call_read_tools_batch", - "nestedAuthority": [ - "list_sessions", - "list_windows", - "list_panes", - "get_pane_info", - "get_server_info", - "capture_pane", - "capture_since", - "search_panes", - "show_option", - "show_hooks", - "show_environment", - "get_session_info", - "get_window_info", - "find_pane_by_position", - "get_tmux_variables", - "snapshot_pane" - ], - "outputClasses": [ - "tmux-metadata", - "terminal-content", - "process-environment", - "configured-command" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "failed": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "onError": { - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "results": { - "items": { - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "result": { - "anyOf": [ - { - "additionalProperties": {}, - "properties": { - "content": { - "items": {}, - "type": "array" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] + }, + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "isError": { - "type": "boolean" + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" }, - "structuredContent": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], "type": "object" } - }, - "required": [ - "content" - ], - "type": "object" + ] }, - { - "type": "null" - } - ] - }, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" + "maxItems": 3, + "type": "array" + }, + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "tool": { - "type": "string" - } - }, - "required": [ - "error", - "index", - "result", - "resultTruncated", - "success", - "tool" - ], - "type": "object" - }, - "type": "array" - }, - "stoppedAt": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "required": [ + "state", + "created" + ], + "type": "object" }, - { - "type": "null" + "message": { + "type": "string" } - ] - }, - "succeeded": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "truncated": { - "type": "boolean" + }, + "required": [ + "code", + "message", + "delivery" + ], + "type": "object" }, - "truncatedBytes": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "ok": { + "const": false } }, "required": [ - "failed", - "onError", - "results", - "stoppedAt", - "succeeded", - "truncated", - "truncatedBytes" + "ok", + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Call read tools batch", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_pane", - "wireName": "capture_pane", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/capture.ts", - "line": 27 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. The text a pane is showing, or its scrollback. Negative `start` reaches back into history (-100 is a hundred lines above the top of the screen). For repeated reads of the same pane use capture_since instead — it returns only what is new.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "end": { - "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "joinWrapped": { - "description": "Rejoin lines tmux wrapped.", - "type": "boolean" - }, - "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" - }, - "start": { - "description": "First line; negative reaches into scrollback.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "byteClamped": { - "description": "Whether the byte ceiling shortened the capture.", - "type": "boolean" - }, - "droppedLines": { - "description": "Lines cut from the front to fit maxLines.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "effectiveEnd": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "effectiveStart": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "omittedBytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "rangeClamped": { - "description": "Whether a result ceiling shortened the range.", - "type": "boolean" - }, - "returnedBytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "text": { - "type": "string" - }, - "totalLines": { - "description": "How many lines the capture held before trimming.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" } - }, - "required": [ - "byteClamped", - "droppedLines", - "effectiveEnd", - "effectiveStart", - "omittedBytes", - "paneId", - "rangeClamped", - "returnedBytes", - "text", - "totalLines" - ], - "type": "object" + ] }, "annotations": { "destructiveHint": true, "idempotentHint": false, - "openWorldHint": true, + "openWorldHint": false, "readOnlyHint": false + } + }, + { + "name": "create", + "wireName": "tmux_create", + "source": { + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 245 }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. The text a pane is showing, or its scrollback. Negative `start` reaches back into history (-100 is a hundred lines above the top of the screen). For repeated reads of the same pane use capture_since instead — it returns only what is new.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "description": "Create a session, window in an exact session, or split an exact pane using argv. Opt-in mutation; 64 KiB total string bytes and at most 256 argv entries. Window/pane focus defaults false. Cwd/environment are optional; size is cells or percent. Assigned refs prove creation, not program readiness or completion.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, "properties": { - "end": { - "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "argv": { + "items": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "prefixItems": [ + { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", + "type": "string" + } + ], + "type": "array" }, - "joinWrapped": { - "description": "Rejoin lines tmux wrapped.", - "type": "boolean" + "cwd": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", + "type": "string" }, - "maxLines": { - "description": "Keep at most this many lines, from the end. Defaults to the server limit.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, + "environment": { + "additionalProperties": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxProperties": 128, + "propertyNames": { + "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" + }, + "type": "object" + }, + "height": { + "maximum": 2147483647, + "minimum": 1, "type": "integer" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", + "kind": { + "const": "session" + }, + "name": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", "type": "string" }, - "start": { - "description": "First line; negative reaches into scrollback.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "width": { + "maximum": 2147483647, + "minimum": 1, "type": "integer" + }, + "window_name": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", + "type": "string" } }, "required": [ - "paneId" + "kind", + "name", + "argv" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "byteClamped": { - "description": "Whether the byte ceiling shortened the capture.", - "type": "boolean" - }, - "droppedLines": { - "description": "Lines cut from the front to fit maxLines.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "effectiveEnd": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "effectiveStart": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, + "argv": { + "items": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "prefixItems": [ { - "type": "null" + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", + "type": "string" } - ] - }, - "omittedBytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + ], + "type": "array" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", + "cwd": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", "type": "string" }, - "rangeClamped": { - "description": "Whether a result ceiling shortened the range.", + "environment": { + "additionalProperties": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxProperties": 128, + "propertyNames": { + "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" + }, + "type": "object" + }, + "focus": { "type": "boolean" }, - "returnedBytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "index": { + "maximum": 2147483647, + "minimum": 0, "type": "integer" }, - "text": { + "kind": { + "const": "window" + }, + "name": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", "type": "string" }, - "totalLines": { - "description": "How many lines the capture held before trimming.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "parent": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] } }, "required": [ - "byteClamped", - "droppedLines", - "effectiveEnd", - "effectiveStart", - "omittedBytes", - "paneId", - "rangeClamped", - "returnedBytes", - "text", - "totalLines" + "kind", + "parent", + "name", + "argv" ], "type": "object" }, - "processReach": "none", - "title": "Capture pane", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_since", - "wireName": "capture_since", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/capture.ts", - "line": 132 - }, - "description": "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.", - "schemaStatus": "runtime", - "inputSchema": { - "$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" - }, - "outputSchema": { - "$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" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "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.", - "inputLiteralization": {}, - "inputSchema": { - "$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" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_since", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "byteClamped": { - "description": "Whether the byte ceiling shortened this result.", - "type": "boolean" - }, - "cursor": { - "anyOf": [ + "argv": { + "items": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "prefixItems": [ { - "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", "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" + "type": "array" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", + "cwd": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", "type": "string" }, - "rangeClamped": { - "description": "Whether result limits shortened a grid capture.", - "type": "boolean" + "direction": { + "enum": [ + "horizontal", + "vertical" + ] }, - "returnedBytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "environment": { + "additionalProperties": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxProperties": 128, + "propertyNames": { + "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" + }, + "type": "object" }, - "seeded": { - "description": "True when this call started the watch and returned the screen.", + "focus": { "type": "boolean" }, - "streaming": { - "description": "False when no control connection was available and this fell back to capturing.", - "type": "boolean" + "kind": { + "const": "pane" }, - "text": { - "type": "string" + "parent": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + }, + "size": { + "oneOf": [ + { + "maximum": 2147483647, + "minimum": 1, + "type": "integer" + }, + { + "pattern": "^(?:[1-9][0-9]?|100)%$", + "type": "string" + } + ] } }, "required": [ - "byteClamped", - "cursor", - "droppedLines", - "effectiveTimeoutMs", - "missedBytes", - "paneId", - "omittedBytes", - "rangeClamped", - "returnedBytes", - "seeded", - "streaming", - "text" + "kind", + "parent", + "direction", + "argv" ], "type": "object" - }, - "processReach": "none", - "title": "Observe new output", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 575 - }, - "description": "Delete tmux state; accepts no command payload. Discard the retained scrollback history for one pane.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "cleared": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" } - }, - "required": [ - "cleared" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Discard the retained scrollback history for one pane.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "clear_pane_scrollback", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "cleared": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "cleared" - ], - "type": "object" - }, - "processReach": "none", - "title": "Clear pane scrollback", - "tmuxEffects": [ - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "create_session", - "wireName": "create_session", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 68 - }, - "description": "Start a pane's configured process; accepts no command payload. Create a detached session and return it with its first window and pane, so you can start working without listing anything first.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "height": { - "description": "Rows. Default 24, because a detached session has no client to size it.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "name": { - "description": "Session name; tmux picks a number when omitted.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "startDirectory": { - "description": "Working directory for the first pane. Defaults to the server's.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "width": { - "description": "Columns. Default 80, and a program that formats to its terminal width — ps, git log --graph, docker ps — truncates to that at the source, where no capture option can recover it.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "windowName": { - "description": "Name for the first window, so the session does not open with a stray shell.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "type": "object" - }, "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "paneId": { - "description": "The new session's first pane. Target this.", - "pattern": "^%\\d+$", - "type": "string" - }, - "session": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { "additionalProperties": false, "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "paneId", - "session", - "windowId" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Create a detached session and return it with its first window and pane, so you can start working without listing anything first.", - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once", - "windowName": "double-hash-once" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "height": { - "description": "Rows. Default 24, because a detached session has no client to size it.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "name": { - "description": "Session name; tmux picks a number when omitted.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "startDirectory": { - "description": "Working directory for the first pane. Defaults to the server's.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "width": { - "description": "Columns. Default 80, and a program that formats to its terminal width — ps, git log --graph, docker ps — truncates to that at the source, where no capture option can recover it.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "windowName": { - "description": "Name for the first window, so the session does not open with a stray shell.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "create_session", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "The new session's first pane. Target this.", - "pattern": "^%\\d+$", - "type": "string" - }, - "session": { + "data": { + "additionalProperties": false, "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] + }, + "maxItems": 3, + "minItems": 1, + "type": "array" }, - "name": { - "type": "string" + "delivery": { + "const": "observed" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "entity": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "program_completion": { + "const": "unobserved" } }, "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" + "entity", + "created", + "delivery", + "program_completion" ], "type": "object" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "ok": { + "const": true } }, "required": [ - "paneId", - "session", - "windowId" + "ok", + "data" ], "type": "object" }, - "processReach": "configured-process", - "title": "Create session", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "create_window", - "wireName": "create_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 147 - }, - "description": "Start a pane's configured process; accepts no command payload. Add a window to a session and return it with its pane.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "Name for the new window.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" - }, - "startDirectory": { - "description": "Working directory for the new pane. Defaults to the session's.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "window": { + { "additionalProperties": false, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "paneId", - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Add a window to a session and return it with its pane.", - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "Name for the new window.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" - }, - "startDirectory": { - "description": "Working directory for the new pane. Defaults to the session's.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "create_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "window": { - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] }, - "sessionName": { - "type": "string" - } + "maxItems": 3, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "required": [ + "state", + "created" + ], + "type": "object" }, - "zoomed": { - "type": "boolean" + "message": { + "type": "string" } }, "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" + "code", + "message", + "delivery" ], "type": "object" + }, + "ok": { + "const": false } }, "required": [ - "paneId", - "window" + "ok", + "error" ], "type": "object" - }, - "processReach": "configured-process", - "title": "Create window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } + } + ] + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false } }, { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", + "name": "run", + "wireName": "tmux_run", "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 233 + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 237 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane occupying a named corner of a window.", + "description": "Run an authored POSIX script in an explicitly enrolled idle, empty zsh 5.9 editor. Opt-in; no terminal injection. Exact queue authorization binds the existing shell generation; execution may follow a later pane replacement without retargeting it. Inherits cwd/exported environment, closed stdin, separate bounded UTF-8/base64 outputs. Defaults: 65536 bytes per output, 65536 script bytes; overflow refuses completion. Reports native exit/signal only from the helper; cancellation never proves descendants stopped.", "schemaStatus": "runtime", + "enabledByDefault": false, "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, "properties": { - "corner": { - "description": "Which corner of the window's layout to resolve.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], + "script": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", "type": "string" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "stderr_limit": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "stdout_limit": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] } }, "required": [ - "corner", - "windowId" + "target", + "script" ], "type": "object" }, "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "data": { + "additionalProperties": false, + "properties": { + "authorization": { + "additionalProperties": false, + "properties": { + "enrollment_generation": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "pane_id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "process_generation": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "run_id": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "script_digest": { + "maxLength": 64, + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "server_generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "state": { + "const": "authorized" + } }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane occupying a named corner of a window.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "corner": { - "description": "Which corner of the window's layout to resolve.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" + "required": [ + "state", + "run_id", + "script_digest", + "server_generation", + "pane_id", + "enrollment_generation", + "process_generation" + ], + "type": "object" + }, + "completion": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "exit_status": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "signal": { + "type": "null" + }, + "state": { + "const": "exited" + } + }, + "required": [ + "state", + "exit_status", + "signal" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "exit_status": { + "type": "null" + }, + "signal": { + "maximum": 255, + "minimum": 1, + "type": "integer" + }, + "state": { + "const": "signaled" + } + }, + "required": [ + "state", + "exit_status", + "signal" + ], + "type": "object" + } + ] + }, + "stderr": { + "additionalProperties": false, + "properties": { + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "data": { + "maxLength": 349528, + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "truncated": { + "const": false + } + }, + "required": [ + "encoding", + "data", + "bytes", + "truncated" + ], + "type": "object" + }, + "stdout": { + "additionalProperties": false, + "properties": { + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "data": { + "maxLength": 349528, + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "truncated": { + "const": false + } + }, + "required": [ + "encoding", + "data", + "bytes", + "truncated" + ], + "type": "object" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target", + "authorization", + "completion", + "stdout", + "stderr" ], - "type": "string" + "type": "object" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "ok": { + "const": true } }, "required": [ - "corner", - "windowId" + "ok", + "data" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "find_pane_by_position", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "pane": { + "error": { + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", + "code": { "type": "string" }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "effects": { + "additionalProperties": false, + "properties": { + "authorization": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "enrollment_generation": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "pane_id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "process_generation": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "run_id": { + "maxLength": 32, + "pattern": "^[a-f0-9]{32}$", + "type": "string" + }, + "script_digest": { + "maxLength": 64, + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "server_generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "state": { + "const": "authorized" + } + }, + "required": [ + "state", + "run_id", + "script_digest", + "server_generation", + "pane_id", + "enrollment_generation", + "process_generation" + ], + "type": "object" + }, + { + "type": "null" + } + ] }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "completion": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "state": { + "const": "unobserved" + } + }, + "required": [ + "state" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "exit_status": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "signal": { + "type": "null" + }, + "state": { + "const": "exited" + } + }, + "required": [ + "state", + "exit_status", + "signal" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "exit_status": { + "type": "null" + }, + "signal": { + "maximum": 255, + "minimum": 1, + "type": "integer" + }, + "state": { + "const": "signaled" + } + }, + "required": [ + "state", + "exit_status", + "signal" + ], + "type": "object" + } + ] + }, + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "required": [ + "state", + "authorization", + "completion" + ], + "type": "object" }, - "windowName": { + "message": { "type": "string" } }, "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" + "code", + "message", + "delivery" ], "type": "object" + }, + "ok": { + "const": false } }, "required": [ - "pane" + "ok", + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Find pane by position", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } + } + ] + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false } }, { - "name": "get_pane_info", - "wireName": "get_pane_info", + "name": "send", + "wireName": "tmux_send", "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/discovery.ts", - "line": 196 + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 243 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. One pane's metadata: what it runs, where, how big, and whether it is yours or watched. Does not read its contents — capture_pane does that.", + "description": "Send literal UTF-8 text or named keys to one exact pane. Opt-in mutation; 64 KiB total text bytes, at most 256 keys. Reports tmux client completion and input dispatch only; never shell completion.", "schemaStatus": "runtime", + "enabledByDefault": false, "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "input": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 65536, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "type": { + "const": "text" + } }, - "sessionName": { - "type": "string" - } + "required": [ + "type", + "text" + ], + "type": "object" }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "keys": { + "items": { + "maxLength": 65536, + "minLength": 1, + "pattern": "^[^\\u0000]*$", + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + "type": { + "const": "keys" + } + }, + "required": [ + "type", + "keys" + ], + "type": "object" + } + ] }, - "windowName": { - "type": "string" + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] } }, "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" + "target", + "input" ], "type": "object" } - }, - "required": [ - "pane" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. One pane's metadata: what it runs, where, how big, and whether it is yours or watched. Does not read its contents — capture_pane does that.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "data": { + "additionalProperties": false, + "properties": { + "client_exit_status": { + "const": 0 + }, + "completion": { + "const": "dispatch_only" + }, + "delivery": { + "const": "observed" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target", + "delivery", + "client_exit_status", + "completion" + ], + "type": "object" + }, + "ok": { + "const": true } }, "required": [ - "paneId" + "ok", + "data" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_pane_info", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "pane": { + "error": { + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", + "code": { "type": "string" }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] + }, + "maxItems": 3, + "type": "array" + }, + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "required": [ + "state", + "created" + ], + "type": "object" }, - "windowName": { + "message": { "type": "string" } }, "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" + "code", + "message", + "delivery" ], "type": "object" + }, + "ok": { + "const": false } }, "required": [ - "pane" + "ok", + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Get pane", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_server_info", - "wireName": "get_server_info", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/discovery.ts", - "line": 216 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. The tmux server this process drives: its socket, version, daemon pid, and totals. Check the version before using a feature that needs a recent tmux.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": {}, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "pid": { - "type": [ - "string", - "null" - ] - }, - "sessions": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "socketPath": { - "type": [ - "string", - "null" - ] - }, - "version": { - "type": "string" - }, - "windows": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" } - }, - "required": [ - "panes", - "pid", - "sessions", - "socketPath", - "version", - "windows" - ], - "type": "object" + ] }, "annotations": { "destructiveHint": true, "idempotentHint": false, - "openWorldHint": true, + "openWorldHint": false, "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. The tmux server this process drives: its socket, version, daemon pid, and totals. Check the version before using a feature that needs a recent tmux.", - "inputLiteralization": {}, - "inputSchema": { - "properties": {}, - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_server_info", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "pid": { - "type": [ - "string", - "null" - ] - }, - "sessions": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "socketPath": { - "type": [ - "string", - "null" - ] - }, - "version": { - "type": "string" - }, - "windows": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "panes", - "pid", - "sessions", - "socketPath", - "version", - "windows" - ], - "type": "object" - }, - "processReach": "none", - "title": "Server info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } } }, { - "name": "get_session_info", - "wireName": "get_session_info", + "name": "snapshot", + "wireName": "tmux_snapshot", "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 190 + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 6 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session without listing every session.", + "description": "Capture ordered metadata and evaluate Ruby criteria locally. Pages retain one immutable capture; expired cursors require a new query. Limit defaults to 50 records, maximum 200.", "schemaStatus": "runtime", + "enabledByDefault": true, "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "session": { + "$defs": { + "client": { "additionalProperties": false, "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "and": { + "items": { + "$ref": "#/$defs/client" + }, + "maxItems": 2048, + "type": "array" }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "controlMode": { + "$ref": "#/$defs/client.control_mode" }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "created": { + "$ref": "#/$defs/client.created" }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" + "height": { + "$ref": "#/$defs/client.height" }, "name": { - "type": "string" + "$ref": "#/$defs/client.name" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "not": { + "$ref": "#/$defs/client" + }, + "or": { + "items": { + "$ref": "#/$defs/client" + }, + "maxItems": 2048, + "type": "array" + }, + "pid": { + "$ref": "#/$defs/client.pid" + }, + "readOnly": { + "$ref": "#/$defs/client.read_only" }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session without listing every session.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { "session": { - "description": "Session id ($1) or name.", - "type": "string" + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "anyOf": [ + { + "$ref": "#/$defs/session" + }, + { + "type": "null" + } + ] + }, + "isNot": { + "anyOf": [ + { + "$ref": "#/$defs/session" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "sessionId": { + "$ref": "#/$defs/client.session_id" + }, + "tty": { + "$ref": "#/$defs/client.tty" + }, + "utf8": { + "$ref": "#/$defs/client.utf8" + }, + "width": { + "$ref": "#/$defs/client.width" } }, - "required": [ - "session" - ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_session_info", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "metadataComplete": { - "description": "Whether the session name is complete.", + "client.control_mode": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { "type": "boolean" }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "in": { + "items": { + "type": "boolean" + }, + "maxItems": 1024, + "type": "array" }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "not": { + "$ref": "#/$defs/client.control_mode" } }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get session info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 263 - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated tmux variable names without accepting raw format syntax.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "names": { - "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array", - "x-libtmux-tmux-format": "validated-variable-name" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "values": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "values" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated tmux variable names without accepting raw format syntax.", - "inputLiteralization": { - "names": "validated-variable-name" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "names": { - "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array", - "x-libtmux-tmux-format": "validated-variable-name" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_tmux_variables", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "configured-command" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "values": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, "type": "object" } - }, - "required": [ - "values" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "Get tmux variables", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_window_info", - "wireName": "get_window_info", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 216 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "client.created": { + "anyOf": [ + { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, "type": "integer" }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "gt": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "gte": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "in": { + "items": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, "type": "integer" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "lt": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "lte": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/client.created" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "type": "object" } - }, - "required": [ - "windowId" - ], - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_window_info", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "window": { - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "client.height": { + "anyOf": [ + { + "anyOf": [ + { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + { + "type": "null" + } + ] + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "gt": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "gte": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", + "in": { "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" + { + "type": "null" } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + ] }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "zoomed": { - "type": "boolean" + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/client.height" } }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], "type": "object" } - }, - "required": [ - "window" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "Get window info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "kill_pane", - "wireName": "kill_pane", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 323 - }, - "description": "Delete tmux state; accepts no command payload. Close a pane and the process in it. Refuses the pane this server runs in and every pane a person is watching; force confirms only this server's exact caller pane.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" + "client.name": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/client.name" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "killed": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "killed" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + "client.pid": { + "anyOf": [ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "maxItems": 1024, + "type": "array" + }, + "lt": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/client.pid" + } + }, + "type": "object" + } + ] }, - "description": "Delete tmux state; accepts no command payload. Close a pane and the process in it. Refuses the pane this server runs in and every pane a person is watching; force confirms only this server's exact caller pane.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "client.read_only": { + "anyOf": [ + { "type": "boolean" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "type": "boolean" + }, + "in": { + "items": { + "type": "boolean" + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/client.read_only" + } + }, + "type": "object" } - }, - "required": [ - "paneId" - ], - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "kill_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "killed": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "client.session_id": { + "anyOf": [ + { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + "in": { + "items": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/client.session_id" + } + }, + "type": "object" } - }, - "required": [ - "killed" - ], - "type": "object" - }, - "processReach": "none", - "title": "Kill pane", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "kill_session", - "wireName": "kill_session", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 386 - }, - "description": "Delete tmux state; accepts no command payload. Remove a session. Windows and panes shared with another session remain available there.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" - }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "killed": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - } - }, - "required": [ - "killed" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + ] }, - "description": "Delete tmux state; accepts no command payload. Remove a session. Windows and panes shared with another session remain available there.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" + "client.tty": { + "anyOf": [ + { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + "in": { + "items": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/client.tty" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" } - }, - "required": [ - "session" - ], - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "kill_session", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "killed": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "client.utf8": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "type": "boolean" + }, + "in": { + "items": { + "type": "boolean" + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/client.utf8" + } + }, + "type": "object" } - }, - "required": [ - "killed" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "Kill session", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "kill_window", - "wireName": "kill_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 352 - }, - "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "killed": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "killed" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" + "client.width": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "kill_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "killed": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "killed" - ], - "type": "object" - }, - "processReach": "none", - "title": "Kill window", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "list_panes", - "wireName": "list_panes", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/discovery.ts", - "line": 150 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Panes on this server, with the command each is running and its directory. Marks the pane this server runs in (isCallerPane) and panes a person is watching (isAttended). Metadata only — search_panes reads their contents.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" - }, - "window": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "complete": { - "type": "boolean" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "maxItems": 1024, + "type": "array" }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/client.width" + } }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "type": "object" + } + ] + }, + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "$ref": "#/$defs/pane.active" + }, + "and": { + "items": { + "$ref": "#/$defs/pane" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "maxItems": 2048, + "type": "array" + }, + "currentCommand": { + "$ref": "#/$defs/pane.current_command" + }, + "currentPath": { + "$ref": "#/$defs/pane.current_path" + }, + "dead": { + "$ref": "#/$defs/pane.dead" + }, + "deadStatus": { + "$ref": "#/$defs/pane.dead_status" + }, + "height": { + "$ref": "#/$defs/pane.height" + }, + "id": { + "$ref": "#/$defs/pane.id" + }, + "index": { + "$ref": "#/$defs/pane.index" + }, + "not": { + "$ref": "#/$defs/pane" + }, + "or": { + "items": { + "$ref": "#/$defs/pane" }, - "windowName": { - "type": "string" - } + "maxItems": 2048, + "type": "array" }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "complete", - "omittedEntries", - "panes" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Panes on this server, with the command each is running and its directory. Marks the pane this server runs in (isCallerPane) and panes a person is watching (isAttended). Metadata only — search_panes reads their contents.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name.", - "type": "string" + "pid": { + "$ref": "#/$defs/pane.pid" + }, + "title": { + "$ref": "#/$defs/pane.title" + }, + "width": { + "$ref": "#/$defs/pane.width" }, "window": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "$ref": "#/$defs/window" + }, + "isNot": { + "$ref": "#/$defs/window" + } + }, + "type": "object" + }, + "windowId": { + "$ref": "#/$defs/pane.window_id" } }, "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_panes", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "complete": { + "pane.active": { + "anyOf": [ + { "type": "boolean" }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "panes": { - "items": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "type": "boolean" + }, + "in": { + "items": { "type": "boolean" }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/pane.active" + } + }, + "type": "object" + } + ] + }, + "pane.current_command": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/pane.current_command" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] + }, + "pane.current_path": { + "anyOf": [ + { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "type": "array" + { + "type": "null" + } + ] + }, + "in": { + "items": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "type": "null" + } + ] }, - "placementsComplete": { - "description": "Whether placements contains every placement.", + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/pane.current_path" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] + }, + "pane.dead": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "type": "boolean" + }, + "in": { + "items": { "type": "boolean" }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" + "not": { + "$ref": "#/$defs/pane.dead" + } }, - "type": "array" + "type": "object" } - }, - "required": [ - "complete", - "omittedEntries", - "panes" - ], - "type": "object" - }, - "processReach": "none", - "title": "List panes", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "list_sessions", - "wireName": "list_sessions", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/discovery.ts", - "line": 60 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Every session on this server with its id, name, window count, and whether anyone is attached. Metadata only — for what a pane shows, use capture_pane or search_panes.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": {}, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "complete": { - "type": "boolean" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + ] }, - "sessions": { - "items": { - "additionalProperties": false, - "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } + "pane.dead_status": { + "anyOf": [ + { + "anyOf": [ + { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "complete", - "omittedEntries", - "sessions" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Every session on this server with its id, name, window count, and whether anyone is attached. Metadata only — for what a pane shows, use capture_pane or search_panes.", - "inputLiteralization": {}, - "inputSchema": { - "properties": {}, - "type": "object" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "anyOf": [ + { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "gt": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "anyOf": [ + { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "maxItems": 1024, + "type": "array" + }, + "lt": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 255, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/pane.dead_status" + } + }, + "type": "object" + } + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_sessions", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "complete": { - "type": "boolean" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "pane.height": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "sessions": { - "items": { - "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/pane.height" + } }, - "type": "array" + "type": "object" } - }, - "required": [ - "complete", - "omittedEntries", - "sessions" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "List sessions", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "list_windows", - "wireName": "list_windows", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/discovery.ts", - "line": 105 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Windows on this server, optionally restricted to one session by id or name.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for all sessions.", - "type": "string" - } - }, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "complete": { - "type": "boolean" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "pane.id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "maxItems": 1024, + "type": "array" }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "not": { + "$ref": "#/$defs/pane.id" + } }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "complete", - "omittedEntries", - "windows" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Windows on this server, optionally restricted to one session by id or name.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for all sessions.", - "type": "string" + "type": "object" } - }, - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_windows", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "complete": { - "type": "boolean" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "pane.index": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "windows": { - "items": { - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/pane.index" + } }, - "type": "array" + "type": "object" } - }, - "required": [ - "complete", - "omittedEntries", - "windows" - ], - "type": "object" - }, - "processReach": "none", - "title": "List windows", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "move_window", - "wireName": "move_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 304 - }, - "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "index": { - "description": "Destination index. Defaults to the next free one.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Destination session id or name.", - "type": "string" - }, - "sourceIndex": { - "description": "Source window index. Required when the session has several placements of the id.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Source session id or name. Required when the id has several placements.", - "type": "string" + ] }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "pane.pid": { + "anyOf": [ + { + "maximum": 2147483647, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 2147483647, + "minimum": 0, "type": "integer" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "lt": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/pane.pid" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" + "type": "object" } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + ] }, - "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "index": { - "description": "Destination index. Defaults to the next free one.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Destination session id or name.", - "type": "string" - }, - "sourceIndex": { - "description": "Source window index. Required when the session has several placements of the id.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Source session id or name. Required when the id has several placements.", - "type": "string" + "pane.title": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "move_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "window": { + { + "additionalProperties": false, + "minProperties": 1, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "name": { - "type": "string" + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "not": { + "$ref": "#/$defs/pane.title" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] + }, + "pane.width": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "gt": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "gte": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", + "in": { "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "zoomed": { - "type": "boolean" + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/pane.width" } }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], "type": "object" } - }, - "required": [ - "window" - ], - "type": "object" - }, - "processReach": "none", - "title": "Move window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "paste_text", - "wireName": "paste_text", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/input.ts", - "line": 189 - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Put text into a pane without tmux interpreting any of it as key names. Use for content — a password, a code block, anything with characters a key parser would claim.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enter": { - "description": "Press Enter afterwards. Default false.", - "type": "boolean" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "text": { - "description": "Text to paste. Sent through a tmux buffer, so a shell's line editor does not redraw on every character.", - "type": "string" - } - }, - "required": [ - "paneId", - "text" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "bytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "bytes", - "paneId" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Put text into a pane without tmux interpreting any of it as key names. Use for content — a password, a code block, anything with characters a key parser would claim.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enter": { - "description": "Press Enter afterwards. Default false.", - "type": "boolean" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "text": { - "description": "Text to paste. Sent through a tmux buffer, so a shell's line editor does not redraw on every character.", - "type": "string" - } - }, - "required": [ - "paneId", - "text" - ], - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "paste_text", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "bytes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "pane.window_id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/pane.window_id" + } + }, + "type": "object" } - }, - "required": [ - "bytes", - "paneId" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Paste text", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "rename_session", - "wireName": "rename_session", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 234 - }, - "description": "Change tmux state; no client-supplied executable input. Rename a session. Its id does not change, so targets by id keep working.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "The session's new name.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" + ] }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "name", - "session" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { "session": { "additionalProperties": false, "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "and": { + "items": { + "$ref": "#/$defs/session" + }, + "maxItems": 2048, + "type": "array" }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "attached": { + "$ref": "#/$defs/session.attached" }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "created": { + "$ref": "#/$defs/session.created" }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" + "currentWindow": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "anyOf": [ + { + "$ref": "#/$defs/window" + }, + { + "type": "null" + } + ] + }, + "isNot": { + "anyOf": [ + { + "$ref": "#/$defs/window" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "id": { + "$ref": "#/$defs/session.id" }, "name": { - "type": "string" + "$ref": "#/$defs/session.name" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "not": { + "$ref": "#/$defs/session" }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], - "type": "object" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Rename a session. Its id does not change, so targets by id keep working.", - "inputLiteralization": { - "name": "double-hash-once" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "The session's new name.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" + "or": { + "items": { + "$ref": "#/$defs/session" + }, + "maxItems": 2048, + "type": "array" }, - "session": { - "description": "Session id ($1) or name.", - "type": "string" - } - }, - "required": [ - "name", - "session" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "rename_session", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { + "panes": { + "additionalProperties": false, + "minProperties": 1, "properties": { - "attachedClients": { - "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "every": { + "$ref": "#/$defs/pane" }, - "humanAttachedClients": { - "description": "attachedClients minus every control-mode client, this server's own included.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "none": { + "$ref": "#/$defs/pane" }, - "id": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "some": { + "$ref": "#/$defs/pane" + } + }, + "type": "object" + }, + "windowCount": { + "$ref": "#/$defs/session.window_count" + }, + "windowLinks": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "every": { + "$ref": "#/$defs/window_link" }, - "metadataComplete": { - "description": "Whether the session name is complete.", - "type": "boolean" + "none": { + "$ref": "#/$defs/window_link" }, - "name": { - "type": "string" + "some": { + "$ref": "#/$defs/window_link" + } + }, + "type": "object" + }, + "windows": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "every": { + "$ref": "#/$defs/window" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from the session name.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "none": { + "$ref": "#/$defs/window" }, - "windows": { - "description": "How many windows it holds.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "some": { + "$ref": "#/$defs/window" } }, - "required": [ - "attachedClients", - "humanAttachedClients", - "id", - "metadataComplete", - "name", - "omittedMetadataBytes", - "windows" - ], "type": "object" } }, - "required": [ - "session" - ], "type": "object" }, - "processReach": "none", - "title": "Rename session", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "rename_window", - "wireName": "rename_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 260 - }, - "description": "Change tmux state; no client-supplied executable input. Rename a window. Its id does not change.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "The window's new name.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "name", - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "session.attached": { + "anyOf": [ + { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/session.attached" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" + "type": "object" } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Rename a window. Its id does not change.", - "inputLiteralization": { - "name": "double-hash-once" + ] }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "The window's new name.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" + "session.created": { + "anyOf": [ + { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "name", - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "rename_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "window": { + { + "additionalProperties": false, + "minProperties": 1, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, + "equals": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, + "gt": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "gte": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, "type": "integer" }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", + "in": { "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "lt": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" }, - "zoomed": { - "type": "boolean" + "lte": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/session.created" } }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], "type": "object" } - }, - "required": [ - "window" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "Rename window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "resize_pane", - "wireName": "resize_pane", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 112 - }, - "description": "Change tmux state; no client-supplied executable input. Resize a pane, either to a size or by an amount in a direction. Give width/height for an absolute size, or direction with amount for a nudge.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "amount": { - "description": "Cells to move by. Needs direction.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "direction": { - "description": "Adjust by an amount in this direction instead of setting a size.", - "enum": [ - "up", - "down", - "left", - "right" - ], - "type": "string" - }, - "height": { - "description": "Set the pane height, in rows.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "session.id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/session.id" + } + }, + "type": "object" + } + ] }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "session.name": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/session.name" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] }, - "width": { - "description": "Set the width, in columns.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "session.window_count": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { + "items": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "maxItems": 1024, + "type": "array" + }, + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/session.window_count" + } + }, + "type": "object" + } + ] }, - "zoom": { - "description": "true makes this pane fill its window, false restores the layout. A state, not a toggle: sending the same value twice is a no-op.", - "type": "boolean" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { + "window": { "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" + "activePane": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "anyOf": [ + { + "$ref": "#/$defs/pane" + }, + { + "type": "null" + } + ] + }, + "isNot": { + "anyOf": [ + { + "$ref": "#/$defs/pane" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" + "and": { + "items": { + "$ref": "#/$defs/window" + }, + "maxItems": 2048, + "type": "array" }, "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "$ref": "#/$defs/window.height" }, "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" + "$ref": "#/$defs/window.id" }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" + "layout": { + "$ref": "#/$defs/window.layout" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "name": { + "$ref": "#/$defs/window.name" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "not": { + "$ref": "#/$defs/window" }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", + "or": { "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "$ref": "#/$defs/window" }, + "maxItems": 2048, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "paneCount": { + "$ref": "#/$defs/window.pane_count" }, - "title": { - "type": "string" + "panes": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "every": { + "$ref": "#/$defs/pane" + }, + "none": { + "$ref": "#/$defs/pane" + }, + "some": { + "$ref": "#/$defs/pane" + } + }, + "type": "object" }, "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "$ref": "#/$defs/window.width" }, - "windowName": { - "type": "string" + "windowLinks": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "every": { + "$ref": "#/$defs/window_link" + }, + "none": { + "$ref": "#/$defs/window_link" + }, + "some": { + "$ref": "#/$defs/window_link" + } + }, + "type": "object" } }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false }, - "description": "Change tmux state; no client-supplied executable input. Resize a pane, either to a size or by an amount in a direction. Give width/height for an absolute size, or direction with amount for a nudge.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "window_link": { + "additionalProperties": false, "properties": { - "amount": { - "description": "Cells to move by. Needs direction.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "active": { + "$ref": "#/$defs/window_link.active" }, - "direction": { - "description": "Adjust by an amount in this direction instead of setting a size.", - "enum": [ - "up", - "down", - "left", - "right" - ], - "type": "string" + "and": { + "items": { + "$ref": "#/$defs/window_link" + }, + "maxItems": 2048, + "type": "array" }, - "height": { - "description": "Set the pane height, in rows.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "index": { + "$ref": "#/$defs/window_link.index" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "not": { + "$ref": "#/$defs/window_link" }, - "width": { - "description": "Set the width, in columns.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "or": { + "items": { + "$ref": "#/$defs/window_link" + }, + "maxItems": 2048, + "type": "array" }, - "zoom": { - "description": "true makes this pane fill its window, false restores the layout. A state, not a toggle: sending the same value twice is a no-op.", - "type": "boolean" + "session": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "$ref": "#/$defs/session" + }, + "isNot": { + "$ref": "#/$defs/session" + } + }, + "type": "object" + }, + "sessionId": { + "$ref": "#/$defs/window_link.session_id" + }, + "window": { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "is": { + "$ref": "#/$defs/window" + }, + "isNot": { + "$ref": "#/$defs/window" + } + }, + "type": "object" + }, + "windowId": { + "$ref": "#/$defs/window_link.window_id" } }, - "required": [ - "paneId" - ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "resize_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "pane": { + "window_link.active": { + "anyOf": [ + { + "type": "boolean" + }, + { + "additionalProperties": false, + "minProperties": 1, "properties": { - "active": { - "description": "Whether this is its window's active pane.", + "equals": { "type": "boolean" }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" + "in": { + "items": { + "type": "boolean" + }, + "maxItems": 1024, + "type": "array" }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "not": { + "$ref": "#/$defs/window_link.active" + } + }, + "type": "object" + } + ] + }, + "window_link.index": { + "anyOf": [ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 2147483647, + "minimum": 0, "type": "integer" }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "gt": { + "maximum": 2147483647, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "gte": { + "maximum": 2147483647, "minimum": 0, "type": "integer" }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", + "in": { "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "maximum": 2147483647, + "minimum": 0, + "type": "integer" }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "lt": { + "maximum": 2147483647, + "minimum": 0, "type": "integer" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "lte": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" }, - "windowName": { - "type": "string" + "not": { + "$ref": "#/$defs/window_link.index" } }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], "type": "object" } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "processReach": "none", - "title": "Resize pane", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "resize_window", - "wireName": "resize_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 347 - }, - "description": "Change tmux state; no client-supplied executable input. Set a window's size in cells. A detached window is whatever size tmux guessed, and a program that formats to its terminal width truncates to that at the source — no capture option recovers those columns, because they were never printed. resize_pane only redistributes space inside a window and cannot grow one. A client attached to the window will overwrite this when it next changes; window-size manual makes a size of your own stick.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "height": { - "description": "Set the height, in rows.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "description": "Set the width, in columns.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + ] }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "window_link.session_id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "sessionName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "not": { + "$ref": "#/$defs/window_link.session_id" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" + "type": "object" } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + ] }, - "description": "Change tmux state; no client-supplied executable input. Set a window's size in cells. A detached window is whatever size tmux guessed, and a program that formats to its terminal width truncates to that at the source — no capture option recovers those columns, because they were never printed. resize_pane only redistributes space inside a window and cannot grow one. A client attached to the window will overwrite this when it next changes; window-size manual makes a size of your own stick.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "height": { - "description": "Set the height, in rows.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "width": { - "description": "Set the width, in columns.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "window_link.window_id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "resize_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "window": { + { + "additionalProperties": false, + "minProperties": 1, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "name": { - "type": "string" + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "not": { + "$ref": "#/$defs/window_link.window_id" + } + }, + "type": "object" + } + ] + }, + "window.height": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "gt": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "gte": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", + "in": { "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "zoomed": { - "type": "boolean" + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "not": { + "$ref": "#/$defs/window.height" } }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], "type": "object" } - }, - "required": [ - "window" - ], - "type": "object" + ] }, - "processReach": "none", - "title": "Resize window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "respawn_pane", - "wireName": "respawn_pane", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 282 - }, - "description": "Start a pane's configured process; accepts no command payload. Restart a pane's command in place, keeping the pane and its id. Use to recover a pane whose process died, rather than killing and re-splitting.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" - }, - "killFirst": { - "description": "Replace a still-running process. Default false.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "startDirectory": { - "description": "Working directory for the restarted command. Defaults to the pane's.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" + "window.id": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "sessionName": { - "type": "string" - } + "maxItems": 1024, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "not": { + "$ref": "#/$defs/window.id" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" + "type": "object" } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Restart a pane's command in place, keeping the pane and its id. Use to recover a pane whose process died, rather than killing and re-splitting.", - "inputLiteralization": { - "startDirectory": "double-hash-once" + ] }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "force": { - "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", - "type": "boolean" - }, - "killFirst": { - "description": "Replace a still-running process. Default false.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "startDirectory": { - "description": "Working directory for the restarted command. Defaults to the pane's.", + "window.layout": { + "anyOf": [ + { + "maxLength": 65536, "type": "string", - "x-libtmux-tmux-format": "literalized-once" + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" + }, + "not": { + "$ref": "#/$defs/window.layout" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" } - }, - "required": [ - "paneId" - ], - "type": "object" + ] }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "respawn_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "pane": { + "window.name": { + "anyOf": [ + { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + { + "additionalProperties": false, + "minProperties": 1, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" + "contains": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" + "endsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "cwd": { - "description": "Its current working directory.", - "type": "string" + "equals": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" + "in": { + "items": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + }, + "maxItems": 1024, + "type": "array" }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "not": { + "$ref": "#/$defs/window.name" + }, + "startsWith": { + "maxLength": 65536, + "type": "string", + "x-maxUtf8Bytes": 65536 + } + }, + "type": "object" + } + ] + }, + "window.pane_count": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" + "gt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "gte": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" + "in": { + "items": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "maxItems": 1024, + "type": "array" }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" + "lt": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "not": { + "$ref": "#/$defs/window.pane_count" + } + }, + "type": "object" + } + ] + }, + "window.width": { + "anyOf": [ + { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + { + "additionalProperties": false, + "minProperties": 1, + "properties": { + "equals": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, + "gt": { + "maximum": 4294967295, "minimum": 0, "type": "integer" }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", + "gte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "in": { "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, + "maxItems": 1024, "type": "array" }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "lt": { + "maximum": 4294967295, + "minimum": 0, "type": "integer" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "lte": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" }, - "windowName": { - "type": "string" + "not": { + "$ref": "#/$defs/window.width" } }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], "type": "object" } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "oneOf": [ + { + "not": { + "required": [ + "cursor" + ] }, "required": [ - "pane" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Respawn pane", - "tmuxEffects": [ - "observe", - "change", - "delete" - ], - "toolset": "execute" - } - } - }, - { - "name": "run_shell_command", - "wireName": "run_shell_command", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/input.ts", - "line": 304 - }, - "description": "Run a shell command in a pane with your user's permissions. Run a shell command in a pane, wait for it to finish, and report its exit status and output. Prefer this over send_keys plus capture_pane: it frames the command so a pane's echo of what you typed can never be mistaken for what the command printed, and it knows when the command actually ended rather than guessing from the screen. The command runs in a subshell, so cd and export do not persist to a later call. A pane is effectively single-writer: this server reserves it until the command settles, but another process with the same tmux socket can still write into it.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "command": { - "description": "The shell command to run.", - "type": "string" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "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" + "entity" + ] }, - "timeoutMs": { - "description": "How long to wait. Clamped by the server ceiling; the result says what was used.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + { + "not": { + "anyOf": [ + { + "required": [ + "entity" + ] + }, + { + "required": [ + "criteria" + ] + }, + { + "required": [ + "limit" + ] + } + ] + }, + "required": [ + "cursor" + ] } - }, - "required": [ - "command", - "paneId" ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, "properties": { - "droppedLines": { - "description": "Lines of output withheld by maxLines. The text half says so in a notice; a caller reading only the structured half would otherwise take the tail for the whole.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "effectiveTimeoutMs": { - "description": "The timeout actually enforced.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "exitStatus": { - "anyOf": [ + "criteria": { + "oneOf": [ { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "additionalProperties": false, + "properties": { + "entity": { + "const": "session" + }, + "profile": { + "const": "libtmux-ruby.where" + }, + "version": { + "const": 1, + "type": "integer" + }, + "where": { + "$ref": "#/$defs/session" + } + }, + "required": [ + "profile", + "version", + "entity", + "where" + ], + "type": "object" }, { - "type": "null" - } - ], - "description": "The command's exit status; null if it did not finish." - }, - "foreignOutputSuspected": { - "description": "Another writer printed into this pane while the command ran. Output that could be attributed to them was removed; what is left may still include theirs. False means no foreign marker was seen, not that the output is certainly this command's.", - "type": "boolean" - }, - "missedBytes": { - "description": "Output that fell out of the pane's buffer before this read reached it. Nonzero means the command printed more than was kept, so the output here starts partway through it.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "omittedBytes": { - "description": "Output bytes omitted by the result ceiling.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "outcome": { - "description": "Why this returned. Read it rather than inferring from the text.", - "enum": [ - "completed", - "timed_out", - "pane_died", - "cancelled" - ], - "type": "string" - }, - "output": { - "description": "The bounded tail of the command's output.", - "type": "string" - }, - "outputComplete": { - "description": "False when capture or result limits omitted any command output.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "returnedBytes": { - "description": "UTF-8 output bytes returned.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "stillRunning": { - "description": "Whether the command may still be running after this call returned.", - "type": "boolean" - } - }, - "required": [ - "effectiveTimeoutMs", - "droppedLines", - "missedBytes", - "omittedBytes", - "foreignOutputSuspected", - "exitStatus", - "outcome", - "output", - "outputComplete", - "paneId", - "returnedBytes", - "stillRunning" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Run a shell command in a pane with your user's permissions. Run a shell command in a pane, wait for it to finish, and report its exit status and output. Prefer this over send_keys plus capture_pane: it frames the command so a pane's echo of what you typed can never be mistaken for what the command printed, and it knows when the command actually ended rather than guessing from the screen. The command runs in a subshell, so cd and export do not persist to a later call. A pane is effectively single-writer: this server reserves it until the command settles, but another process with the same tmux socket can still write into it.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "command": { - "description": "The shell command to run.", - "type": "string" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "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" - }, - "timeoutMs": { - "description": "How long to wait. Clamped by the server ceiling; the result says what was used.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "command", - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "run_shell_command", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "droppedLines": { - "description": "Lines of output withheld by maxLines. The text half says so in a notice; a caller reading only the structured half would otherwise take the tail for the whole.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "effectiveTimeoutMs": { - "description": "The timeout actually enforced.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "exitStatus": { - "anyOf": [ - { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "additionalProperties": false, + "properties": { + "entity": { + "const": "window" + }, + "profile": { + "const": "libtmux-ruby.where" + }, + "version": { + "const": 1, "type": "integer" }, - { - "type": "null" + "where": { + "$ref": "#/$defs/window" } + }, + "required": [ + "profile", + "version", + "entity", + "where" ], - "description": "The command's exit status; null if it did not finish." - }, - "foreignOutputSuspected": { - "description": "Another writer printed into this pane while the command ran. Output that could be attributed to them was removed; what is left may still include theirs. False means no foreign marker was seen, not that the output is certainly this command's.", - "type": "boolean" - }, - "missedBytes": { - "description": "Output that fell out of the pane's buffer before this read reached it. Nonzero means the command printed more than was kept, so the output here starts partway through it.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "omittedBytes": { - "description": "Output bytes omitted by the result ceiling.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "type": "object" }, - "outcome": { - "description": "Why this returned. Read it rather than inferring from the text.", - "enum": [ - "completed", - "timed_out", - "pane_died", - "cancelled" + { + "additionalProperties": false, + "properties": { + "entity": { + "const": "pane" + }, + "profile": { + "const": "libtmux-ruby.where" + }, + "version": { + "const": 1, + "type": "integer" + }, + "where": { + "$ref": "#/$defs/pane" + } + }, + "required": [ + "profile", + "version", + "entity", + "where" ], - "type": "string" - }, - "output": { - "description": "The bounded tail of the command's output.", - "type": "string" - }, - "outputComplete": { - "description": "False when capture or result limits omitted any command output.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "type": "object" }, - "returnedBytes": { - "description": "UTF-8 output bytes returned.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "entity": { + "const": "window_link" + }, + "profile": { + "const": "libtmux-ruby.where" + }, + "version": { + "const": 1, + "type": "integer" + }, + "where": { + "$ref": "#/$defs/window_link" + } + }, + "required": [ + "profile", + "version", + "entity", + "where" + ], + "type": "object" }, - "stillRunning": { - "description": "Whether the command may still be running after this call returned.", - "type": "boolean" + { + "additionalProperties": false, + "properties": { + "entity": { + "const": "client" + }, + "profile": { + "const": "libtmux-ruby.where" + }, + "version": { + "const": 1, + "type": "integer" + }, + "where": { + "$ref": "#/$defs/client" + } + }, + "required": [ + "profile", + "version", + "entity", + "where" + ], + "type": "object" } - }, - "required": [ - "effectiveTimeoutMs", - "droppedLines", - "missedBytes", - "omittedBytes", - "foreignOutputSuspected", - "exitStatus", - "outcome", - "output", - "outputComplete", - "paneId", - "returnedBytes", - "stillRunning" - ], - "type": "object" - }, - "processReach": "pane-command", - "title": "Run a shell command and wait", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "search_panes", - "wireName": "search_panes", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/search.ts", - "line": 78 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing something. Searches pane contents, not their names — use list_panes for metadata. Returns the matching lines with their pane, so you can target one without capturing them all. Literal matching stops at one 256 KiB aggregate UTF-8 byte budget.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "maxMatchesPerPane": { - "description": "Stop after this many matches in each pane. Defaults to the server limit.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + ] }, - "pattern": { - "description": "Non-empty literal text to find.", - "minLength": 1, + "cursor": { + "maxLength": 43, + "pattern": "^[a-f0-9]{32}:[0-9]{1,10}$", "type": "string" }, - "regex": { - "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", - "type": "boolean" + "entity": { + "enum": [ + "session", + "window", + "pane", + "window_link", + "client" + ] }, - "scrollbackLines": { - "description": "How far above the visible screen to search. Default 0.", - "maximum": 9007199254740991, - "minimum": 0, + "limit": { + "maximum": 200, + "minimum": 1, "type": "integer" - }, - "session": { - "description": "Restrict to one session by id or name.", - "type": "string" } }, - "required": [ - "pattern" - ], + "required": [], "type": "object" }, "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "capturesByteClamped": { - "type": "boolean" - }, - "effectiveScrollbackLines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "matches": { - "items": { - "additionalProperties": false, - "properties": { - "lineNumber": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "placements": { - "items": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "properties": { + "capture_id": { + "type": "string" + }, + "coverage": { + "additionalProperties": { + "enum": [ + "complete", + "unloaded" + ] + }, + "type": "object" + }, + "entity": { + "enum": [ + "session", + "window", + "pane", + "window_link", + "client" + ] + }, + "interval": { "additionalProperties": false, "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "clock": { + "const": "monotonic_seconds" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "finished": { + "type": "number" }, - "sessionName": { - "type": "string" + "reads": { + "minimum": 0, + "type": "integer" + }, + "started": { + "type": "number" } }, "required": [ - "index", - "sessionId", - "sessionName" + "clock", + "started", + "finished", + "reads" ], "type": "object" }, - "type": "array" - }, - "text": { - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "lineNumber", - "paneId", - "placements", - "text", - "windowName" - ], - "type": "object" - }, - "type": "array" - }, - "matchesTruncated": { - "type": "boolean" - }, - "matchingByteClamped": { - "type": "boolean" - }, - "matchingLineClamped": { - "type": "boolean" - }, - "matchingTimeClamped": { - "type": "boolean" - }, - "paneLimitClamped": { - "type": "boolean" - }, - "panesFailed": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "panesSearched": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "scrollbackClamped": { - "type": "boolean" - } - }, - "required": [ - "capturesByteClamped", - "effectiveScrollbackLines", - "matches", - "matchingByteClamped", - "matchingLineClamped", - "matchingTimeClamped", - "matchesTruncated", - "paneLimitClamped", - "panesFailed", - "panesSearched", - "scrollbackClamped" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing something. Searches pane contents, not their names — use list_panes for metadata. Returns the matching lines with their pane, so you can target one without capturing them all. Literal matching stops at one 256 KiB aggregate UTF-8 byte budget.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "maxMatchesPerPane": { - "description": "Stop after this many matches in each pane. Defaults to the server limit.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "pattern": { - "description": "Non-empty literal text to find.", - "minLength": 1, - "type": "string" - }, - "regex": { - "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "How far above the visible screen to search. Default 0.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Restrict to one session by id or name.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "search_panes", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "capturesByteClamped": { - "type": "boolean" - }, - "effectiveScrollbackLines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "matches": { - "items": { - "properties": { - "lineNumber": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "placements": { - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "items": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "fields": { + "additionalProperties": false, + "properties": { + "attached": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "created": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windowCount": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "id", + "name", + "created", + "attached", + "windowCount" + ], + "type": "object" + }, + "kind": { + "const": "session" + }, + "ref": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "required": [ + "kind", + "fields", + "ref" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "fields": { + "additionalProperties": false, + "properties": { + "height": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "id": { + "type": "string" + }, + "layout": { + "type": "string" + }, + "name": { + "type": "string" + }, + "paneCount": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "width": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "id", + "name", + "width", + "height", + "paneCount", + "layout" + ], + "type": "object" + }, + "kind": { + "const": "window" + }, + "ref": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } }, - "sessionName": { - "type": "string" - } + "required": [ + "kind", + "fields", + "ref" + ], + "type": "object" }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "text": { - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "lineNumber", - "paneId", - "placements", - "text", - "windowName" - ], - "type": "object" - }, - "type": "array" - }, - "matchesTruncated": { - "type": "boolean" - }, - "matchingByteClamped": { - "type": "boolean" - }, - "matchingLineClamped": { - "type": "boolean" - }, - "matchingTimeClamped": { - "type": "boolean" - }, - "paneLimitClamped": { - "type": "boolean" - }, - "panesFailed": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "panesSearched": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "scrollbackClamped": { - "type": "boolean" - } - }, - "required": [ - "capturesByteClamped", - "effectiveScrollbackLines", - "matches", - "matchingByteClamped", - "matchingLineClamped", - "matchingTimeClamped", - "matchesTruncated", - "paneLimitClamped", - "panesFailed", - "panesSearched", - "scrollbackClamped" - ], - "type": "object" - }, - "processReach": "none", - "title": "Search pane contents", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "select_layout", - "wireName": "select_layout", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 228 - }, - "description": "Change tmux state; no client-supplied executable input. Rearrange a window's panes. Takes one of tmux's named layouts, or a layout string from an earlier window whose `metadataComplete` is true to reproduce it exactly.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "layout": { - "description": "One of even-horizontal, even-vertical, main-horizontal, main-vertical, tiled, or a tmux layout string.", - "type": "string" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "layout", - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { - "additionalProperties": false, - "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "fields": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "currentPath": { + "type": [ + "string", + "null" + ] + }, + "dead": { + "type": "boolean" + }, + "deadStatus": { + "maximum": 255, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "height": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "pid": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "windowId", + "index", + "pid", + "currentCommand", + "currentPath", + "title", + "active", + "dead", + "deadStatus", + "width", + "height" + ], + "type": "object" + }, + "kind": { + "const": "pane" + }, + "ref": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } + }, + "required": [ + "kind", + "fields", + "ref" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "fields": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "index": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "sessionId": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "sessionId", + "windowId", + "index", + "active" + ], + "type": "object" + }, + "kind": { + "const": "window_link" + }, + "ref": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] + } + }, + "required": [ + "kind", + "fields", + "ref" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "fields": { + "additionalProperties": false, + "properties": { + "controlMode": { + "type": "boolean" + }, + "created": { + "maximum": 9223372036854776000, + "minimum": -9223372036854776000, + "type": "integer" + }, + "height": { + "maximum": 4294967295, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "name": { + "type": "string" + }, + "pid": { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + "readOnly": { + "type": "boolean" + }, + "sessionId": { + "type": [ + "string", + "null" + ] + }, + "tty": { + "type": [ + "string", + "null" + ] + }, + "utf8": { + "type": "boolean" + }, + "width": { + "maximum": 4294967295, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "name", + "pid", + "created", + "tty", + "sessionId", + "width", + "height", + "readOnly", + "utf8", + "controlMode" + ], + "type": "object" + }, + "kind": { + "const": "client" + }, + "ref": { + "type": "null" + } + }, + "required": [ + "kind", + "fields", + "ref" + ], + "type": "object" + } + ] }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "maxItems": 200, + "type": "array" + }, + "next_cursor": { + "type": "string" + }, + "server_identity": { + "additionalProperties": false, + "properties": { + "generation": { + "type": "string" + }, + "pid": { + "type": "integer" + }, + "start_time": { + "type": "integer" + }, + "tmux_version": { + "type": "string" + } }, - "sessionName": { - "type": "string" - } + "required": [ + "generation", + "pid", + "start_time", + "tmux_version" + ], + "type": "object" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "truncated": { + "type": "boolean" + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Rearrange a window's panes. Takes one of tmux's named layouts, or a layout string from an earlier window whose `metadataComplete` is true to reproduce it exactly.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "layout": { - "description": "One of even-horizontal, even-vertical, main-horizontal, main-vertical, tiled, or a tmux layout string.", - "type": "string" + "required": [ + "capture_id", + "server_identity", + "entity", + "items", + "coverage", + "interval", + "truncated" + ], + "type": "object" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "ok": { + "const": true } }, "required": [ - "layout", - "windowId" + "ok", + "data" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "select_layout", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + { + "additionalProperties": false, "properties": { - "window": { + "error": { + "additionalProperties": false, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { + "code": { "type": "string" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] }, - "sessionName": { - "type": "string" - } + "maxItems": 3, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "required": [ + "state", + "created" + ], + "type": "object" }, - "zoomed": { - "type": "boolean" + "message": { + "type": "string" } }, "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" + "code", + "message", + "delivery" ], "type": "object" + }, + "ok": { + "const": false } }, "required": [ - "window" + "ok", + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Select layout", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } + } + ] + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false } }, { - "name": "select_pane", - "wireName": "select_pane", + "name": "wait", + "wireName": "tmux_wait", "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 178 + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", + "line": 241 }, - "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. Moves the cursor of anyone attached to that window.", + "description": "Wait for observed literal screen text or the initial pane process exit. Deadline in seconds is capped by the application limit. Uses control events/process descriptors; no polling. Requires tmux>=3.3 and Linux peer pidfds with matching PID namespaces or Darwin kqueue process observation. Reports observed evidence, never remote termination caused by cancellation or an inferred process exit status.", "schemaStatus": "runtime", + "enabledByDefault": false, "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" + "condition": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "text": { + "maxLength": 4096, + "minLength": 1, + "type": "string" + }, + "type": { + "const": "screen_contains" + } + }, + "required": [ + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "type": { + "const": "process_exit" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, + "history_lines": { + "maximum": 1000, "minimum": 0, "type": "integer" }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, + "max_bytes": { + "maximum": 262144, + "minimum": 1, "type": "integer" }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, + "max_lines": { + "maximum": 1000, + "minimum": 1, "type": "integer" }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] }, - "windowName": { - "type": "string" + "timeout": { + "exclusiveMinimum": 0, + "maximum": 60, + "type": "number" } }, "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" + "target", + "condition" ], "type": "object" } - }, - "required": [ - "pane" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. Moves the cursor of anyone attached to that window.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "select_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "oneOf": [ + { + "additionalProperties": false, "properties": { - "pane": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } + "data": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "capture": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "capture_id": { + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "history_continuity": { + "const": "unknown" + }, + "interval": { + "additionalProperties": false, + "properties": { + "clock": { + "const": "monotonic_seconds" + }, + "finished": { + "type": "number" + }, + "started": { + "type": "number" + } + }, + "required": [ + "clock", + "started", + "finished" + ], + "type": "object" + }, + "mode": { + "const": "snapshot" + }, + "next_cursor": { + "type": "string" + }, + "process_generation": { + "type": [ + "string", + "null" + ] + }, + "row_count": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "rows": { + "items": { + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "scope": { + "additionalProperties": false, + "properties": { + "history_lines": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "max_bytes": { + "maximum": 262144, + "minimum": 1, + "type": "integer" + }, + "max_lines": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "max_lines", + "max_bytes", + "history_lines" + ], + "type": "object" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "target", + "capture_id", + "process_generation", + "encoding", + "row_count", + "bytes", + "truncated", + "history_continuity", + "interval", + "scope", + "mode", + "rows" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "base_capture_id": { + "type": "string" + }, + "bytes": { + "maximum": 262144, + "minimum": 0, + "type": "integer" + }, + "capture_id": { + "type": "string" + }, + "encoding": { + "enum": [ + "utf-8", + "base64" + ] + }, + "history_continuity": { + "const": "unknown" + }, + "interval": { + "additionalProperties": false, + "properties": { + "clock": { + "const": "monotonic_seconds" + }, + "finished": { + "type": "number" + }, + "started": { + "type": "number" + } + }, + "required": [ + "clock", + "started", + "finished" + ], + "type": "object" + }, + "mode": { + "const": "delta" + }, + "next_cursor": { + "type": "string" + }, + "process_generation": { + "type": [ + "string", + "null" + ] + }, + "reset": { + "type": "boolean" + }, + "row_count": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "scope": { + "additionalProperties": false, + "properties": { + "history_lines": { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + "max_bytes": { + "maximum": 262144, + "minimum": 1, + "type": "integer" + }, + "max_lines": { + "maximum": 1000, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "max_lines", + "max_bytes", + "history_lines" + ], + "type": "object" + }, + "splice": { + "additionalProperties": false, + "properties": { + "delete": { + "minimum": 0, + "type": "integer" + }, + "rows": { + "items": { + "type": "string" + }, + "maxItems": 1000, + "type": "array" + }, + "start": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "start", + "delete", + "rows" + ], + "type": "object" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "target", + "capture_id", + "process_generation", + "encoding", + "row_count", + "bytes", + "truncated", + "history_continuity", + "interval", + "scope", + "mode", + "base_capture_id", + "reset", + "splice", + "next_cursor" + ], + "type": "object" + } + ] }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" + "condition": { + "const": "screen_contains" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "required": [ + "target", + "condition", + "capture" + ], + "type": "object" }, - "windowName": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "condition": { + "const": "process_exit" + }, + "exit_status": { + "const": "unobserved" + }, + "observed_at": { + "type": "number" + }, + "process_generation": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + } + ] + } + }, + "required": [ + "target", + "condition", + "process_generation", + "observed_at", + "exit_status" + ], + "type": "object" } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" + ] + }, + "ok": { + "const": true } }, "required": [ - "pane" + "ok", + "data" ], "type": "object" }, - "processReach": "none", - "title": "Select pane", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "select_window", - "wireName": "select_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 200 - }, - "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "sourceIndex": { - "description": "Source window index. Required when the session has several placements of the id.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Source session id or name. Required when the id has several placements.", - "type": "string" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "window": { + { "additionalProperties": false, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" - ], - "type": "object" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "sourceIndex": { - "description": "Source window index. Required when the session has several placements of the id.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Source session id or name. Required when the id has several placements.", - "type": "string" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "select_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "window": { + "error": { + "additionalProperties": false, "properties": { - "id": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "layout": { - "description": "tmux's layout string; feed it back only when metadataComplete is true.", - "type": "string" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "name": { + "code": { "type": "string" }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "panes": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "delivery": { + "enum": [ + "not_sent", + "possibly_sent", + "observed" + ] }, - "placements": { - "description": "Retained sessions and indexes where this window is linked.", - "items": { - "properties": { - "active": { - "description": "Whether this placement is current in its session.", - "type": "boolean" - }, - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "effects": { + "additionalProperties": false, + "properties": { + "created": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "kind": { + "const": "session" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "kind": { + "const": "window" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^%[0-9]+$", + "type": "string" + }, + "kind": { + "const": "pane" + } + }, + "required": [ + "generation", + "kind", + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "generation": { + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 32, + "pattern": "^@[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "kind": { + "const": "window_link" + }, + "session_id": { + "maxLength": 32, + "pattern": "^\\$[0-9]+$", + "type": "string" + } + }, + "required": [ + "generation", + "kind", + "id", + "session_id", + "index" + ], + "type": "object" + } + ] }, - "sessionName": { - "type": "string" - } + "maxItems": 3, + "type": "array" }, - "required": [ - "index", - "sessionId", - "sessionName", - "active" - ], - "type": "object" + "state": { + "enum": [ + "none", + "known", + "unknown" + ] + } }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" + "required": [ + "state", + "created" + ], + "type": "object" }, - "zoomed": { - "type": "boolean" + "message": { + "type": "string" } }, "required": [ - "id", - "layout", - "metadataComplete", - "name", - "omittedMetadataBytes", - "panes", - "omittedPlacements", - "placements", - "placementsComplete", - "zoomed" + "code", + "message", + "delivery" ], "type": "object" + }, + "ok": { + "const": false } }, "required": [ - "window" + "ok", + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Select window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } + } + ] + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false + } + } + ], + "wirePrefix": "tmux_", + "selectable": false, + "source": "gems/libtmux-mcp/lib/libtmux/mcp", + "repo": "libtmux/libtmux-ruby", + "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", + "selection": { + "mode": "explicit CLI options", + "tools": "tmux_capabilities,tmux_snapshot,tmux_capture,tmux_wait,tmux_create,tmux_send,tmux_close,tmux_run" + }, + "protocol": { + "capabilities": { + "resources": { + "listChanged": false, + "subscribe": false + }, + "tools": { + "listChanged": false } }, + "prompts": [], + "protocolVersion": "2025-11-25", + "resources": [], + "resourceTemplates": [ + { + "description": "Acquire metadata through tmux_snapshot with its default page limit. Encode every URI component; generation must match discovery. Reports capture interval and truncation.", + "mimeType": "application/json", + "name": "tmux_metadata", + "uriTemplate": "tmux://{endpoint}/{generation}/snapshots/{entity}" + }, + { + "description": "Read a retained tmux_snapshot page without refreshing it. Encode the cursor component; endpoint, generation and entity must match its captured query.", + "mimeType": "application/json", + "name": "tmux_metadata_page", + "uriTemplate": "tmux://{endpoint}/{generation}/snapshots/{entity}/pages/{cursor}" + }, + { + "description": "Capture an exact pane through tmux_capture with its default byte/line bounds, without cursor tracking. Percent-encode pane IDs. Invalid UTF-8 is an application/octet-stream blob; _meta includes capture interval, truncation and unknown history continuity.", + "mimeType": "text/plain", + "name": "tmux_screen", + "uriTemplate": "tmux://{endpoint}/{generation}/panes/{pane_id}/screen" + } + ], + "serverInfo": { + "name": "libtmux", + "version": "0.1.0.alpha.1" + } + } + }, + "ts": { + "tools": [ + "call_read_tools_batch", + "capture_pane", + "capture_since", + "clear_pane_scrollback", + "create_session", + "create_window", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "kill_pane", + "kill_session", + "kill_window", + "list_panes", + "list_sessions", + "list_windows", + "move_window", + "paste_text", + "rename_session", + "rename_window", + "resize_pane", + "resize_window", + "respawn_pane", + "run_shell_command", + "search_panes", + "select_layout", + "select_pane", + "select_window", + "send_keys", + "send_keys_batch", + "set_history_limit", + "set_mouse_enabled", + "set_pane_title", + "set_synchronize_panes", + "show_environment", + "show_hooks", + "show_option", + "signal_channel", + "snapshot_pane", + "split_window", + "swap_pane", + "wait_for_channel", + "wait_for_text" + ], + "registrations": [ { - "name": "send_keys", - "wireName": "send_keys", + "name": "call_read_tools_batch", + "wireName": "call_read_tools_batch", "source": { "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/input.ts", - "line": 116 + "file": "packages/mcp/src/tools/target.ts", + "line": 618 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keystrokes to a pane. Use for TUIs, control keys (C-c), and partial lines. For a shell command whose result you want, use run_shell_command — it waits for completion and reports exit status, which this does not.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enter": { - "description": "Press Enter afterwards. Default true.", - "type": "boolean" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "keys": { - "description": "Keys to send. tmux key names like C-c work unless literal is true.", - "type": "string" - }, - "literal": { - "description": "Send the text as-is, without resolving key names.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "keys", - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "attended": { - "description": "A person is watching a configured cohort member.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "resolvedPaneIds": { - "description": "Configured cohort at the immediate preflight, not a delivery receipt.", - "items": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "type": "array" - }, - "sent": { - "type": "boolean" - } - }, - "required": [ - "attended", - "paneId", - "resolvedPaneIds", - "sent" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keystrokes to a pane. Use for TUIs, control keys (C-c), and partial lines. For a shell command whose result you want, use run_shell_command — it waits for completion and reports exit status, which this does not.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enter": { - "description": "Press Enter afterwards. Default true.", - "type": "boolean" - }, - "force": { - "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", - "type": "boolean" - }, - "keys": { - "description": "Keys to send. tmux key names like C-c work unless literal is true.", - "type": "string" - }, - "literal": { - "description": "Send the text as-is, without resolving key names.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "keys", - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "send_keys", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "attended": { - "description": "A person is watching a configured cohort member.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "resolvedPaneIds": { - "description": "Configured cohort at the immediate preflight, not a delivery receipt.", - "items": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "type": "array" - }, - "sent": { - "type": "boolean" - } - }, - "required": [ - "attended", - "paneId", - "resolvedPaneIds", - "sent" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "send_keys_batch", - "wireName": "send_keys_batch", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 468 - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered batch of pane-input operations, resolving and checking each row's configured cohort immediately before input. Stop or continue on error.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. The structured result is capped below 1,000,000 bytes, preserves every operation row, and reports explicit stop and truncation accounting.", "schemaStatus": "runtime", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", @@ -19386,852 +17148,554 @@ "type": "string" }, "operations": { - "description": "The key sends to run, in order, one pane each.", - "items": { - "properties": { - "enter": { - "description": "Press Enter afterwards. Default true.", - "type": "boolean" - }, - "force": { - "description": "Allow this server's own caller pane, as on `send_keys`.", - "type": "boolean" - }, - "keys": { - "description": "Keys for this pane, as on `send_keys`.", - "type": "string" - }, - "literal": { - "description": "Send the text literally rather than resolving key names.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - } - }, - "required": [ - "keys", - "paneId" - ], - "type": "object" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "completed": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "failures": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "index", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "targets": { + "description": "The read-only tool calls to run, in order, in one approval.", "items": { - "additionalProperties": false, - "properties": { - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "resolvedPaneIds": { - "items": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "index", - "resolvedPaneIds" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "completed", - "failures", - "targets" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered batch of pane-input operations, resolving and checking each row's configured cohort immediately before input. Stop or continue on error.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "onError": { - "description": "Whether a failed operation ends the batch. Defaults to stop.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "The key sends to run, in order, one pane each.", - "items": { + "anyOf": [ + { + "additionalProperties": false, "properties": { - "enter": { - "description": "Press Enter afterwards. Default true.", - "type": "boolean" - }, - "force": { - "description": "Allow this server's own caller pane, as on `send_keys`.", - "type": "boolean" + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_sessions`, exactly the shape it takes when called on its own.", + "properties": {}, + "type": "object" }, - "keys": { - "description": "Keys for this pane, as on `send_keys`.", + "tool": { + "const": "list_sessions", + "description": "Run `list_sessions` as this step of the batch.", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_windows`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for all sessions.", + "type": "string" + } + }, + "type": "object" }, - "literal": { - "description": "Send the text literally rather than resolving key names.", - "type": "boolean" + "tool": { + "const": "list_windows", + "description": "Run `list_windows` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_panes`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + }, + "window": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "type": "object" }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", + "tool": { + "const": "list_panes", + "description": "Run `list_panes` as this step of the batch.", "type": "string" } }, "required": [ - "keys", - "paneId" + "tool" ], "type": "object" }, - "maxItems": 64, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "send_keys_batch", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "completed": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "failures": { - "items": { + { + "additionalProperties": false, "properties": { - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_pane_info`, exactly the shape it takes when called on its own.", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, - "reason": { + "tool": { + "const": "get_pane_info", + "description": "Run `get_pane_info` as this step of the batch.", "type": "string" } }, "required": [ - "index", - "reason" + "tool" ], "type": "object" }, - "type": "array" - }, - "targets": { - "items": { + { + "additionalProperties": false, "properties": { - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_server_info`, exactly the shape it takes when called on its own.", + "properties": {}, + "type": "object" }, - "resolvedPaneIds": { - "items": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "type": "array" + "tool": { + "const": "get_server_info", + "description": "Run `get_server_info` as this step of the batch.", + "type": "string" } }, "required": [ - "index", - "resolvedPaneIds" + "tool" ], "type": "object" }, - "type": "array" - } - }, - "required": [ - "completed", - "failures", - "targets" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys batch", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "set_history_limit", - "wireName": "set_history_limit", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 420 - }, - "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit through a bounded integer.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "lines": { - "description": "Scrollback lines each new pane keeps. Applies to panes made after this.", - "maximum": 2000000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "lines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit through a bounded integer.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "lines": { - "description": "Scrollback lines each new pane keeps. Applies to panes made after this.", - "maximum": 2000000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_history_limit", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "lines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set history limit", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "set_mouse_enabled", - "wireName": "set_mouse_enabled", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 404 - }, - "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a closed boolean schema.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "description": "Whether tmux should report mouse events.", - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a closed boolean schema.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "description": "Whether tmux should report mouse events.", - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_mouse_enabled", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set mouse enabled", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "set_pane_title", - "wireName": "set_pane_title", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 386 - }, - "description": "Change tmux state; no client-supplied executable input. Give a pane a title. Useful for labelling what an agent put where, since the title shows in list_panes and survives the command changing.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "title": { - "description": "The pane's new title.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "paneId", - "title" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { + { "additionalProperties": false, "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Give a pane a title. Useful for labelling what an agent put where, since the title shows in list_panes and survives the command changing.", - "inputLiteralization": { - "title": "double-hash-once" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "title": { - "description": "The pane's new title.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "paneId", - "title" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_pane_title", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "pane": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `capture_pane`, exactly the shape it takes when called on its own.", "properties": { - "index": { - "description": "The window index in this session.", + "end": { + "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + "joinWrapped": { + "description": "Rejoin lines tmux wrapped.", + "type": "boolean" }, - "sessionName": { + "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" + }, + "start": { + "description": "First line; negative reaches into scrollback.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "index", - "sessionId", - "sessionName" + "paneId" ], "type": "object" }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "tool": { + "const": "capture_pane", + "description": "Run `capture_pane` as this step of the batch.", + "type": "string" + } }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `capture_since`, exactly the shape it takes when called on its own.", + "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" + }, + "tool": { + "const": "capture_since", + "description": "Run `capture_since` as this step of the batch.", + "type": "string" + } }, - "windowName": { - "type": "string" - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - } + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `search_panes`, exactly the shape it takes when called on its own.", + "properties": { + "maxMatchesPerPane": { + "description": "Stop after this many matches in each pane. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "pattern": { + "description": "Non-empty literal text to find.", + "minLength": 1, + "type": "string" + }, + "regex": { + "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "How far above the visible screen to search. Default 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Restrict to one session by id or name.", + "type": "string" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "description": "Run `search_panes` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_option`, exactly the shape it takes when called on its own.", + "properties": { + "name": { + "description": "The tmux option to read, such as \"status-left\".", + "type": "string" + }, + "scope": { + "description": "Default server.", + "enum": [ + "server", + "session", + "global-session", + "window", + "global-window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Session id/name or pane id, for the matching scope.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "description": "Run `show_option` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_hooks`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session scope; omit for server scope.", + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "show_hooks", + "description": "Run `show_hooks` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_environment`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for the server environment.", + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "show_environment", + "description": "Run `show_environment` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_session_info`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info", + "description": "Run `get_session_info` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_window_info`, exactly the shape it takes when called on its own.", + "properties": { + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "description": "Run `get_window_info` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `find_pane_by_position`, exactly the shape it takes when called on its own.", + "properties": { + "corner": { + "description": "Which corner of the window's layout to resolve.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "description": "Run `find_pane_by_position` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_tmux_variables`, exactly the shape it takes when called on its own.", + "properties": { + "names": { + "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array", + "x-libtmux-tmux-format": "validated-variable-name" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables", + "description": "Run `get_tmux_variables` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `snapshot_pane`, exactly the shape it takes when called on its own.", + "properties": { + "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" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "description": "Run `snapshot_pane` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] }, - "required": [ - "pane" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set pane title", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "set_synchronize_panes", - "wireName": "set_synchronize_panes", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 441 - }, - "description": "Change tmux state; no client-supplied executable input. Set the window default for synchronized pane input. Pane overrides still determine each effective configured cohort.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "description": "Whether typing into one pane of this window types into all of them.", - "type": "boolean" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" + "maxItems": 16, + "minItems": 1, + "type": "array" } }, "required": [ - "enabled", - "windowId" + "operations" ], "type": "object" }, @@ -20239,417 +17703,119 @@ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "enabled": { - "type": "boolean" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": true, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + "failed": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "description": "Change tmux state; no client-supplied executable input. Set the window default for synchronized pane input. Pane overrides still determine each effective configured cohort.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "description": "Whether typing into one pane of this window types into all of them.", - "type": "boolean" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" + "onError": { + "enum": [ + "stop", + "continue" ], - "type": "object" + "type": "string" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_synchronize_panes", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "enabled": { - "type": "boolean" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set synchronize panes", - "tmuxEffects": [ - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "show_environment", - "wireName": "show_environment", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/settings.ts", - "line": 199 - }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. The environment tmux gives processes it starts, at server or session scope. This is what a new pane will inherit, not what a running one has.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for the server environment.", - "type": "string" - } - }, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "complete": { - "type": "boolean" - }, - "environment": { - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "complete", - "environment", - "omittedEntries" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. The environment tmux gives processes it starts, at server or session scope. This is what a new pane will inherit, not what a running one has.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session id ($1) or name. Omit for the server environment.", - "type": "string" - } - }, - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "show_environment", - "nestedAuthority": [], - "outputClasses": [ - "process-environment" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "complete": { - "type": "boolean" - }, - "environment": { - "additionalProperties": { + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { "type": [ "string", "null" ] }, - "propertyNames": { - "type": "string" + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "type": "object" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "complete", - "environment", - "omittedEntries" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show environment", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "show_hooks", - "wireName": "show_hooks", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/settings.ts", - "line": 138 - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks a server or session runs. Read-only: a hook set here would outlive this process and keep firing in somebody's tmux. Put hooks a server should keep in its config file.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session scope; omit for server scope.", - "type": "string" - } - }, - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "complete": { - "type": "boolean" - }, - "hooks": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "omittedEntries": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "unset": { - "description": "Hook names tmux defines that carry no command, and so are not listed.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "complete", - "hooks", - "omittedEntries", - "unset" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks a server or session runs. Read-only: a hook set here would outlive this process and keep firing in somebody's tmux. Put hooks a server should keep in its config file.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "session": { - "description": "Session scope; omit for server scope.", - "type": "string" - } - }, - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "show_hooks", - "nestedAuthority": [], - "outputClasses": [ - "configured-command" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "complete": { - "type": "boolean" - }, - "hooks": { - "additionalProperties": { - "type": "string" + "result": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "content": { + "items": {}, + "type": "array" + }, + "isError": { + "type": "boolean" + }, + "structuredContent": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "content" + ], + "type": "object" + }, + { + "type": "null" + } + ] }, - "propertyNames": { - "type": "string" + "resultTruncated": { + "type": "boolean" }, - "type": "object" + "success": { + "type": "boolean" + }, + "tool": { + "type": "string" + } }, - "omittedEntries": { + "required": [ + "error", + "index", + "result", + "resultTruncated", + "success", + "tool" + ], + "type": "object" + }, + "type": "array" + }, + "stoppedAt": { + "anyOf": [ + { "maximum": 9007199254740991, - "minimum": -9007199254740991, + "minimum": 0, "type": "integer" }, - "unset": { - "description": "Hook names tmux defines that carry no command, and so are not listed.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + { + "type": "null" } - }, - "required": [ - "complete", - "hooks", - "omittedEntries", - "unset" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show hooks", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "show_option", - "wireName": "show_option", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/settings.ts", - "line": 105 - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one named tmux option at server, session, window, or pane scope.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "description": "The tmux option to read, such as \"status-left\".", - "type": "string" - }, - "scope": { - "description": "Default server.", - "enum": [ - "server", - "session", - "global-session", - "window", - "global-window", - "pane" - ], - "type": "string" + ] }, - "target": { - "description": "Session id/name or pane id, for the matching scope.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" + "succeeded": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "scope": { - "type": "string" + "truncated": { + "type": "boolean" }, - "value": { - "type": [ - "string", - "null" - ] + "truncatedBytes": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" } }, "required": [ - "name", - "scope", - "value" + "failed", + "onError", + "results", + "stoppedAt", + "succeeded", + "truncated", + "truncatedBytes" ], "type": "object" }, @@ -20668,1023 +17834,769 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one named tmux option at server, session, window, or pane scope.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. The structured result is capped below 1,000,000 bytes, preserves every operation row, and reports explicit stop and truncation accounting.", "inputLiteralization": {}, "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "name": { - "description": "The tmux option to read, such as \"status-left\".", - "type": "string" - }, - "scope": { - "description": "Default server.", + "onError": { + "description": "Whether a failed operation ends the batch. Defaults to stop.", "enum": [ - "server", - "session", - "global-session", - "window", - "global-window", - "pane" + "stop", + "continue" ], "type": "string" }, - "target": { - "description": "Session id/name or pane id, for the matching scope.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "show_option", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "configured-command" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "name": { - "type": "string" - }, - "scope": { - "type": "string" - }, - "value": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name", - "scope", - "value" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show option", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "signal_channel", - "wireName": "signal_channel", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 386 - }, - "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "channel": { - "description": "The tmux wait-for channel to signal.", - "type": "string" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - }, - "signalled": { - "type": "boolean" - } - }, - "required": [ - "channel", - "signalled" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "channel": { - "description": "The tmux wait-for channel to signal.", - "type": "string" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "signal_channel", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "channel": { - "type": "string" - }, - "signalled": { - "type": "boolean" - } - }, - "required": [ - "channel", - "signalled" - ], - "type": "object" - }, - "processReach": "none", - "title": "Signal channel", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "snapshot_pane", - "wireName": "snapshot_pane", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 305 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return bounded terminal content and pane metadata in one MCP response. The metadata and capture come from separate tmux requests and are not an atomic snapshot.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "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" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "cursorX": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "cursorY": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "droppedLines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "inMode": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", + "operations": { + "description": "The read-only tool calls to run, in order, in one approval.", "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_sessions`, exactly the shape it takes when called on its own.", + "properties": {}, + "type": "object" + }, + "tool": { + "const": "list_sessions", + "description": "Run `list_sessions` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_windows`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for all sessions.", + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "list_windows", + "description": "Run `list_windows` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - }, - "scrollPosition": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "content", - "cursorX", - "cursorY", - "droppedLines", - "inMode", - "pane", - "scrollPosition" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return bounded terminal content and pane metadata in one MCP response. The metadata and capture come from separate tmux requests and are not an atomic snapshot.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "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" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "snapshot_pane", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "content": { - "type": "string" - }, - "cursorX": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "cursorY": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "droppedLines": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "inMode": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "pane": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { + { + "additionalProperties": false, "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "arguments": { + "additionalProperties": false, + "description": "Arguments for `list_panes`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + }, + "window": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "type": "object" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", + "tool": { + "const": "list_panes", + "description": "Run `list_panes` as this step of the batch.", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_pane_info`, exactly the shape it takes when called on its own.", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, - "sessionName": { + "tool": { + "const": "get_pane_info", + "description": "Run `get_pane_info` as this step of the batch.", "type": "string" } }, "required": [ - "index", - "sessionId", - "sessionName" + "tool" ], "type": "object" }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - }, - "scrollPosition": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - } - }, - "required": [ - "content", - "cursorX", - "cursorY", - "droppedLines", - "inMode", - "pane", - "scrollPosition" - ], - "type": "object" - }, - "processReach": "none", - "title": "Snapshot pane", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "split_window", - "wireName": "split_window", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/lifecycle.ts", - "line": 190 - }, - "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the new one. Direction is where the new pane goes relative to the one you split.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "direction": { - "description": "Default below.", - "enum": [ - "above", - "below", - "left", - "right" - ], - "type": "string" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "startDirectory": { - "description": "Defaults to the directory the pane being split is in.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_server_info`, exactly the shape it takes when called on its own.", + "properties": {}, + "type": "object" + }, + "tool": { + "const": "get_server_info", + "description": "Run `get_server_info` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the new one. Direction is where the new pane goes relative to the one you split.", - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "direction": { - "description": "Default below.", - "enum": [ - "above", - "below", - "left", - "right" - ], - "type": "string" - }, - "paneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" - }, - "startDirectory": { - "description": "Defaults to the directory the pane being split is in.", - "type": "string", - "x-libtmux-tmux-format": "literalized-once" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "split_window", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "pane": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { + { + "additionalProperties": false, "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" + "arguments": { + "additionalProperties": false, + "description": "Arguments for `capture_pane`, exactly the shape it takes when called on its own.", + "properties": { + "end": { + "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "joinWrapped": { + "description": "Rejoin lines tmux wrapped.", + "type": "boolean" + }, + "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" + }, + "start": { + "description": "First line; negative reaches into scrollback.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", + "tool": { + "const": "capture_pane", + "description": "Run `capture_pane` as this step of the batch.", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `capture_since`, exactly the shape it takes when called on its own.", + "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" }, - "sessionName": { + "tool": { + "const": "capture_since", + "description": "Run `capture_since` as this step of the batch.", "type": "string" } }, "required": [ - "index", - "sessionId", - "sessionName" + "tool" ], "type": "object" }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `search_panes`, exactly the shape it takes when called on its own.", + "properties": { + "maxMatchesPerPane": { + "description": "Stop after this many matches in each pane. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "pattern": { + "description": "Non-empty literal text to find.", + "minLength": 1, + "type": "string" + }, + "regex": { + "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "How far above the visible screen to search. Default 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Restrict to one session by id or name.", + "type": "string" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "description": "Run `search_panes` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_option`, exactly the shape it takes when called on its own.", + "properties": { + "name": { + "description": "The tmux option to read, such as \"status-left\".", + "type": "string" + }, + "scope": { + "description": "Default server.", + "enum": [ + "server", + "session", + "global-session", + "window", + "global-window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Session id/name or pane id, for the matching scope.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "description": "Run `show_option` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_hooks`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session scope; omit for server scope.", + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "show_hooks", + "description": "Run `show_hooks` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `show_environment`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for the server environment.", + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "show_environment", + "description": "Run `show_environment` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_session_info`, exactly the shape it takes when called on its own.", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info", + "description": "Run `get_session_info` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_window_info`, exactly the shape it takes when called on its own.", + "properties": { + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "description": "Run `get_window_info` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `find_pane_by_position`, exactly the shape it takes when called on its own.", + "properties": { + "corner": { + "description": "Which corner of the window's layout to resolve.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "description": "Run `find_pane_by_position` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `get_tmux_variables`, exactly the shape it takes when called on its own.", + "properties": { + "names": { + "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array", + "x-libtmux-tmux-format": "validated-variable-name" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables", + "description": "Run `get_tmux_variables` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "Arguments for `snapshot_pane`, exactly the shape it takes when called on its own.", + "properties": { + "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" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "description": "Run `snapshot_pane` as this step of the batch.", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "call_read_tools_batch", + "nestedAuthority": [ + "list_sessions", + "list_windows", + "list_panes", + "get_pane_info", + "get_server_info", + "capture_pane", + "capture_since", + "search_panes", + "show_option", + "show_hooks", + "show_environment", + "get_session_info", + "get_window_info", + "find_pane_by_position", + "get_tmux_variables", + "snapshot_pane" + ], + "outputClasses": [ + "tmux-metadata", + "terminal-content", + "process-environment", + "configured-command" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "failed": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "onError": { + "enum": [ + "stop", + "continue" ], - "type": "object" + "type": "string" + }, + "results": { + "items": { + "properties": { + "error": { + "type": [ + "string", + "null" + ] + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "result": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "content": { + "items": {}, + "type": "array" + }, + "isError": { + "type": "boolean" + }, + "structuredContent": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "content" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "resultTruncated": { + "type": "boolean" + }, + "success": { + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "error", + "index", + "result", + "resultTruncated", + "success", + "tool" + ], + "type": "object" + }, + "type": "array" + }, + "stoppedAt": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "succeeded": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" } }, "required": [ - "pane" + "failed", + "onError", + "results", + "stoppedAt", + "succeeded", + "truncated", + "truncatedBytes" ], "type": "object" }, - "processReach": "configured-process", - "title": "Split window", + "processReach": "none", + "title": "Call read tools batch", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "swap_pane", - "wireName": "swap_pane", + "name": "capture_pane", + "wireName": "capture_pane", "source": { "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/layout.ts", - "line": 266 + "file": "packages/mcp/src/tools/capture.ts", + "line": 27 }, - "description": "Change tmux state; no client-supplied executable input. Exchange two panes' positions. Their ids and contents travel with them.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. The text a pane is showing, or its scrollback. Negative `start` reaches back into history (-100 is a hundred lines above the top of the screen). For repeated reads of the same pane use capture_since instead — it returns only what is new.", "schemaStatus": "runtime", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "otherPaneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "end": { + "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "joinWrapped": { + "description": "Rejoin lines tmux wrapped.", + "type": "boolean" + }, + "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" + }, + "start": { + "description": "First line; negative reaches into scrollback.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "otherPaneId", "paneId" ], "type": "object" @@ -21693,152 +18605,80 @@ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "complete": { + "byteClamped": { + "description": "Whether the byte ceiling shortened the capture.", "type": "boolean" }, - "omittedEntries": { + "droppedLines": { + "description": "Lines cut from the front to fit maxLines.", "maximum": 9007199254740991, - "minimum": 0, + "minimum": -9007199254740991, "type": "integer" }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "additionalProperties": false, - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } + "effectiveEnd": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - }, - "type": "array" + { + "type": "null" + } + ] + }, + "effectiveStart": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "omittedBytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "rangeClamped": { + "description": "Whether a result ceiling shortened the range.", + "type": "boolean" + }, + "returnedBytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "text": { + "type": "string" + }, + "totalLines": { + "description": "How many lines the capture held before trimming.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "complete", - "omittedEntries", - "panes" + "byteClamped", + "droppedLines", + "effectiveEnd", + "effectiveStart", + "omittedBytes", + "paneId", + "rangeClamped", + "returnedBytes", + "text", + "totalLines" ], "type": "object" }, @@ -21857,223 +18697,181 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Change tmux state; no client-supplied executable input. Exchange two panes' positions. Their ids and contents travel with them.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. The text a pane is showing, or its scrollback. Negative `start` reaches back into history (-100 is a hundred lines above the top of the screen). For repeated reads of the same pane use capture_since instead — it returns only what is new.", "inputLiteralization": {}, "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "otherPaneId": { - "description": "Stable pane id, e.g. %1.", - "pattern": "^%\\d+$", - "type": "string" + "end": { + "description": "Last line, on the same scale as start: 0 is the top of the visible screen and negative reaches back into history. It does not count back from the bottom, so end:-1 is one line above the screen top, not the last line of output.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "joinWrapped": { + "description": "Rejoin lines tmux wrapped.", + "type": "boolean" + }, + "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" + }, + "start": { + "description": "First line; negative reaches into scrollback.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "otherPaneId", "paneId" ], "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "swap_pane", + "name": "capture_pane", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "complete": { + "byteClamped": { + "description": "Whether the byte ceiling shortened the capture.", "type": "boolean" }, - "omittedEntries": { + "droppedLines": { + "description": "Lines cut from the front to fit maxLines.", "maximum": 9007199254740991, - "minimum": 0, + "minimum": -9007199254740991, "type": "integer" }, - "panes": { - "items": { - "properties": { - "active": { - "description": "Whether this is its window's active pane.", - "type": "boolean" - }, - "command": { - "description": "The command tmux reports running in it.", - "type": "string" - }, - "cwd": { - "description": "Its current working directory.", - "type": "string" - }, - "dead": { - "description": "Whether its process exited and remain-on-exit kept it.", - "type": "boolean" - }, - "height": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "id": { - "description": "Stable pane id. Prefer this for entity-scoped targeting.", - "pattern": "^%\\d+$", - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "isAttended": { - "description": "A person is currently looking at this pane.", - "type": "boolean" - }, - "isCallerPane": { - "description": "This is the pane this MCP server runs in.", - "type": "boolean" - }, - "metadataComplete": { - "description": "Whether every projected metadata string is complete.", - "type": "boolean" - }, - "omittedMetadataBytes": { - "description": "UTF-8 bytes omitted from projected metadata strings.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "omittedPlacements": { - "description": "Later placements omitted.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "placements": { - "description": "Retained session and window indexes through which this pane is reachable.", - "items": { - "properties": { - "index": { - "description": "The window index in this session.", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "sessionId": { - "description": "Stable session id, e.g. $1.", - "pattern": "^\\$\\d+$", - "type": "string" - }, - "sessionName": { - "type": "string" - } - }, - "required": [ - "index", - "sessionId", - "sessionName" - ], - "type": "object" - }, - "type": "array" - }, - "placementsComplete": { - "description": "Whether placements contains every placement.", - "type": "boolean" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "windowId": { - "description": "Stable window id, e.g. @1.", - "pattern": "^@\\d+$", - "type": "string" - }, - "windowName": { - "type": "string" - } + "effectiveEnd": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "required": [ - "active", - "command", - "cwd", - "dead", - "height", - "id", - "index", - "isAttended", - "isCallerPane", - "metadataComplete", - "omittedMetadataBytes", - "omittedPlacements", - "placements", - "placementsComplete", - "title", - "width", - "windowId", - "windowName" - ], - "type": "object" - }, - "type": "array" + { + "type": "null" + } + ] + }, + "effectiveStart": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "omittedBytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "rangeClamped": { + "description": "Whether a result ceiling shortened the range.", + "type": "boolean" + }, + "returnedBytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "text": { + "type": "string" + }, + "totalLines": { + "description": "How many lines the capture held before trimming.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "complete", - "omittedEntries", - "panes" + "byteClamped", + "droppedLines", + "effectiveEnd", + "effectiveStart", + "omittedBytes", + "paneId", + "rangeClamped", + "returnedBytes", + "text", + "totalLines" ], "type": "object" }, "processReach": "none", - "title": "Swap panes", + "title": "Capture pane", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "wait_for_channel", - "wireName": "wait_for_channel", + "name": "capture_since", + "wireName": "capture_since", "source": { "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/target.ts", - "line": 358 + "file": "packages/mcp/src/tools/capture.ts", + "line": 132 }, - "description": "Change tmux state; no client-supplied executable input. Wait until a tmux wait-for channel is signalled.", + "description": "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.", "schemaStatus": "runtime", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "channel": { - "description": "The tmux wait-for channel name.", + "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" }, - "timeoutMs": { - "description": "Give up after this long. Defaults to the server's wait ceiling.", + "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": [ - "channel" + "paneId" ], "type": "object" }, @@ -22081,264 +18879,84 @@ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "channel": { - "type": "string" - }, - "signalled": { + "byteClamped": { + "description": "Whether the byte ceiling shortened this result.", "type": "boolean" - } - }, - "required": [ - "channel", - "signalled" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false }, - "description": "Change tmux state; no client-supplied executable input. Wait until a tmux wait-for channel is signalled.", - "inputLiteralization": {}, - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "channel": { - "description": "The tmux wait-for channel name.", - "type": "string" - }, - "timeoutMs": { - "description": "Give up after this long. Defaults to the server's wait ceiling.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "wait_for_channel", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "channel": { - "type": "string" - }, - "signalled": { - "type": "boolean" - } - }, - "required": [ - "channel", - "signalled" - ], - "type": "object" - }, - "processReach": "none", - "title": "Wait for channel", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "wait_for_text", - "wireName": "wait_for_text", - "source": { - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "file": "packages/mcp/src/tools/wait.ts", - "line": 503 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something, streaming tmux's notifications rather than polling. Use for output you did NOT author — another process, a person, a background job. For a command you wrote, use run_shell_command: it knows when the command ended and reports exit status, which no text match can. This discounts text this server itself typed into the pane, for as long as it is unsubmitted or was submitted within the last ten seconds, so a command you just sent cannot match its own echo — but a pane not yet reading input can still echo type-ahead back once it starts, so wait for a prompt before typing into a cold shell. Whatever happens you get back what the pane printed and why the wait ended — a timeout is never an empty answer.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "cursor": { - "description": "Start from a cursor an earlier capture_since or wait returned.", - "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" - }, - "patterns": { - "description": "Any one of these ends the wait. Omit to wait for any output at all.", - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 64, - "type": "array" - }, - "regex": { - "description": "Interpret patterns using libtmux's bounded regular-expression grammar.", - "type": "boolean" - }, - "timeoutMs": { - "description": "Clamped by the server ceiling; the result reports what was used.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "alreadyOnScreen": { - "description": "The pattern is on the pane now but printed before this wait began, so the wait could not match it. Read it with capture_pane rather than waiting again.", - "type": "boolean" - }, - "cursor": { - "anyOf": [ - { - "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", + "cursor": { + "anyOf": [ + { + "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", "type": "string" }, { "type": "null" } ], - "description": "Pass to capture_since or another wait; null means the live stream cannot be resumed." + "description": "Pass this to the next capture_since call; null means streaming was unavailable." }, "droppedLines": { - "description": "Output lines omitted by the result limit.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "effectiveTimeoutMs": { - "description": "The timeout actually enforced, after clamping.", + "description": "The wait ceiling applied; zero when this call did not wait on a live stream.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "matched": { - "description": "The text that matched, or null.", - "type": [ - "string", - "null" - ] - }, "missedBytes": { - "description": "Retained output lost before this read; non-zero means the result is incomplete.", + "description": "Output that scrolled past before this read reached it. Non-zero means you fell behind.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "omittedBytes": { - "description": "Output bytes omitted by the result ceiling.", + "description": "Result bytes omitted after capture or streaming.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "outcome": { - "description": "Why the wait ended. Read this rather than guessing from the output.", - "enum": [ - "matched", - "timed_out", - "pane_died", - "no_stream", - "cancelled", - "output_lost", - "stream_lost" - ], - "type": "string" - }, - "output": { - "description": "The bounded tail of what the pane printed while waiting.", - "type": "string" - }, "paneId": { "description": "Stable pane id, e.g. %1.", "pattern": "^%\\d+$", "type": "string" }, + "rangeClamped": { + "description": "Whether result limits shortened a grid capture.", + "type": "boolean" + }, "returnedBytes": { - "description": "UTF-8 bytes returned across output and screen.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "screen": { - "description": "What the pane shows now after a miss, unless result limits omit it; see screenClamped.", - "type": "string" + "seeded": { + "description": "True when this call started the watch and returned the screen.", + "type": "boolean" }, - "screenClamped": { - "description": "Whether result limits shortened the pane screen.", + "streaming": { + "description": "False when no control connection was available and this fell back to capturing.", "type": "boolean" }, - "streamFailure": { - "anyOf": [ - { - "enum": [ - "connection_lost", - "events_dropped", - "expired", - "hub_closed", - "topology_changed" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Why the live stream ended, or null while it remained valid." + "text": { + "type": "string" } }, "required": [ - "alreadyOnScreen", + "byteClamped", "cursor", "droppedLines", "effectiveTimeoutMs", - "matched", "missedBytes", - "omittedBytes", - "outcome", - "output", "paneId", + "omittedBytes", + "rangeClamped", "returnedBytes", - "screen", - "screenClamped", - "streamFailure" + "seeded", + "streaming", + "text" ], "type": "object" }, @@ -22357,13 +18975,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something, streaming tmux's notifications rather than polling. Use for output you did NOT author — another process, a person, a background job. For a command you wrote, use run_shell_command: it knows when the command ended and reports exit status, which no text match can. This discounts text this server itself typed into the pane, for as long as it is unsubmitted or was submitted within the last ten seconds, so a command you just sent cannot match its own echo — but a pane not yet reading input can still echo type-ahead back once it starts, so wait for a prompt before typing into a cold shell. Whatever happens you get back what the pane printed and why the wait ended — a timeout is never an empty answer.", + "description": "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.", "inputLiteralization": {}, "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "cursor": { - "description": "Start from a cursor an earlier capture_since or wait returned.", + "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" }, @@ -22378,23 +18996,10 @@ "pattern": "^%\\d+$", "type": "string" }, - "patterns": { - "description": "Any one of these ends the wait. Omit to wait for any output at all.", - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 64, - "type": "array" - }, - "regex": { - "description": "Interpret patterns using libtmux's bounded regular-expression grammar.", - "type": "boolean" - }, - "timeoutMs": { - "description": "Clamped by the server ceiling; the result reports what was used.", - "exclusiveMinimum": 0, + "waitMs": { + "description": "Wait up to this long for new output before answering. Default 0.", "maximum": 9007199254740991, + "minimum": 0, "type": "integer" } }, @@ -22405,7 +19010,7 @@ }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "wait_for_text", + "name": "capture_since", "nestedAuthority": [], "outputClasses": [ "tmux-metadata", @@ -22414,8 +19019,8 @@ "outputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "alreadyOnScreen": { - "description": "The pattern is on the pane now but printed before this wait began, so the wait could not match it. Read it with capture_pane rather than waiting again.", + "byteClamped": { + "description": "Whether the byte ceiling shortened this result.", "type": "boolean" }, "cursor": { @@ -22428,939 +19033,1117 @@ "type": "null" } ], - "description": "Pass to capture_since or another wait; null means the live stream cannot be resumed." + "description": "Pass this to the next capture_since call; null means streaming was unavailable." }, "droppedLines": { - "description": "Output lines omitted by the result limit.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "effectiveTimeoutMs": { - "description": "The timeout actually enforced, after clamping.", + "description": "The wait ceiling applied; zero when this call did not wait on a live stream.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "matched": { - "description": "The text that matched, or null.", - "type": [ - "string", - "null" - ] - }, "missedBytes": { - "description": "Retained output lost before this read; non-zero means the result is incomplete.", + "description": "Output that scrolled past before this read reached it. Non-zero means you fell behind.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "omittedBytes": { - "description": "Output bytes omitted by the result ceiling.", + "description": "Result bytes omitted after capture or streaming.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "outcome": { - "description": "Why the wait ended. Read this rather than guessing from the output.", - "enum": [ - "matched", - "timed_out", - "pane_died", - "no_stream", - "cancelled", - "output_lost", - "stream_lost" - ], - "type": "string" - }, - "output": { - "description": "The bounded tail of what the pane printed while waiting.", - "type": "string" - }, "paneId": { "description": "Stable pane id, e.g. %1.", "pattern": "^%\\d+$", "type": "string" }, + "rangeClamped": { + "description": "Whether result limits shortened a grid capture.", + "type": "boolean" + }, "returnedBytes": { - "description": "UTF-8 bytes returned across output and screen.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, - "screen": { - "description": "What the pane shows now after a miss, unless result limits omit it; see screenClamped.", - "type": "string" + "seeded": { + "description": "True when this call started the watch and returned the screen.", + "type": "boolean" }, - "screenClamped": { - "description": "Whether result limits shortened the pane screen.", + "streaming": { + "description": "False when no control connection was available and this fell back to capturing.", "type": "boolean" }, - "streamFailure": { - "anyOf": [ - { - "enum": [ - "connection_lost", - "events_dropped", - "expired", - "hub_closed", - "topology_changed" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Why the live stream ended, or null while it remained valid." + "text": { + "type": "string" } }, "required": [ - "alreadyOnScreen", + "byteClamped", "cursor", "droppedLines", "effectiveTimeoutMs", - "matched", "missedBytes", - "omittedBytes", - "outcome", - "output", "paneId", + "omittedBytes", + "rangeClamped", "returnedBytes", - "screen", - "screenClamped", - "streamFailure" + "seeded", + "streaming", + "text" ], "type": "object" }, "processReach": "none", - "title": "Wait for output", + "title": "Observe new output", "tmuxEffects": [ "observe" ], "toolset": "inspect" } } - } - ], - "wirePrefix": "", - "selectable": true, - "source": "packages/mcp/src", - "repo": "libtmux/libtmux-ts", - "revision": "3fe1ca654b81b8cbf4a13b777a001a3298c87a6f", - "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", - "selection": { - "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" - }, - "protocol": { - "capabilities": { - "resources": { - "listChanged": true - }, - "tools": { - "listChanged": true - } }, - "prompts": [], - "protocolVersion": "2025-11-25", - "resources": [ - { - "description": "The frozen structured-tool surface and its capability declarations.", - "mimeType": "application/json", - "name": "capabilities", - "title": "Capabilities", - "uri": "tmux://capabilities" - } - ], - "resourceTemplates": [], - "serverInfo": { - "name": "libtmux", - "title": "tmux", - "version": "0.1.0-alpha.10" - } - } - }, - "rs": { - "tools": [ - "call_read_tools_batch", - "capture_pane", - "capture_since", - "clear_pane_scrollback", - "create_session", - "create_window", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "kill_pane", - "kill_session", - "kill_window", - "list_panes", - "list_sessions", - "list_windows", - "move_window", - "paste_text", - "rename_session", - "rename_window", - "resize_pane", - "resize_window", - "respawn_pane", - "run_shell_command", - "search_panes", - "select_layout", - "select_pane", - "select_window", - "send_keys", - "send_keys_batch", - "set_history_limit", - "set_mouse_enabled", - "set_pane_title", - "set_synchronize_panes", - "show_environment", - "show_hooks", - "show_option", - "signal_channel", - "snapshot_pane", - "split_window", - "swap_pane", - "wait_for_channel", - "wait_for_text" - ], - "registrations": [ { - "name": "call_read_tools_batch", - "wireName": "call_read_tools_batch", + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 1145 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 575 }, - "description": "Call a serial batch of at most sixteen enabled inspect tools. One approval for this batch covers every enabled nested name; inner tools do not receive separate client approval. The complete JSON-RPC response line, including its request ID and newline, is capped at 1,000,000 bytes; truncated payloads and omitted bytes are explicit. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Delete tmux state; accepts no command payload. Discard the retained scrollback history for one pane.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "OnError": { - "enum": [ - "stop", - "continue" - ], + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "on_error": { - "$ref": "#/$defs/OnError", - "default": "stop", - "description": "`stop`, the default, ends at the first failed call; `continue` makes\nthe rest." + "cleared": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "cleared" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "operations": { - "description": "The inspect calls to make, in order.", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "end": { - "description": "End at this line. Omit for the bottom of the screen.", - "format": "int32", - "type": [ - "integer", - "null" - ] - }, - "history": { - "default": false, - "description": "Read the whole history rather than the visible screen.", - "type": "boolean" - }, - "last_command": { - "default": false, - "description": "Return only the last command's output, when the shell marks its\nprompts.\n\nAnswers far less than the history, because it starts where the last\ncommand's output began. When the pane's shell does not mark its\nprompts -- fish does, bash and zsh do not -- this reports\n`marks: \"absent\"` and returns the visible screen instead.", - "type": "boolean" - }, - "pane": { - "description": "The `%`-prefixed pane id.", - "type": "string" - }, - "start": { - "description": "Start at this line. Zero is the top of the screen, negative is\nscrollback. Omit for the top of the screen, or of the scrollback with\n`history`.", - "format": "int32", - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "cursor": { - "description": "The cursor from the previous call. Omit to start watching.", - "type": [ - "string", - "null" - ] - }, - "pane": { - "description": "The `%`-prefixed pane to read.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "type": "string" - } + "description": "Delete tmux state; accepts no command payload. Discard the retained scrollback history for one pane.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "clear_pane_scrollback", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "cleared": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "cleared" + ], + "type": "object" + }, + "processReach": "none", + "title": "Clear pane scrollback", + "tmuxEffects": [ + "delete" + ], + "toolset": "teardown" + } + } + }, + { + "name": "create_session", + "wireName": "create_session", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 68 + }, + "description": "Start a pane's configured process; accepts no command payload. Create a detached session and return it with its first window and pane, so you can start working without listing anything first.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "height": { + "description": "Rows. Default 24, because a detached session has no client to size it.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "name": { + "description": "Session name; tmux picks a number when omitted.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "startDirectory": { + "description": "Working directory for the first pane. Defaults to the server's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "width": { + "description": "Columns. Default 80, and a program that formats to its terminal width — ps, git log --graph, docker ps — truncates to that at the source, where no capture option can recover it.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "windowName": { + "description": "Name for the first window, so the session does not open with a stray shell.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "type": "object" + }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "paneId": { + "description": "The new session's first pane. Target this.", + "pattern": "^%\\d+$", + "type": "string" + }, + "session": { + "additionalProperties": false, + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "paneId", + "session", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Create a detached session and return it with its first window and pane, so you can start working without listing anything first.", + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once", + "windowName": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "height": { + "description": "Rows. Default 24, because a detached session has no client to size it.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "name": { + "description": "Session name; tmux picks a number when omitted.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "startDirectory": { + "description": "Working directory for the first pane. Defaults to the server's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "width": { + "description": "Columns. Default 80, and a program that formats to its terminal width — ps, git log --graph, docker ps — truncates to that at the source, where no capture option can recover it.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "windowName": { + "description": "Name for the first window, so the session does not open with a stray shell.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_session", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "The new session's first pane. Target this.", + "pattern": "^%\\d+$", + "type": "string" + }, + "session": { + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "corner": { - "description": "`top-left`, `top-right`, `bottom-left`, or `bottom-right`.", - "type": "string" - }, - "window": { - "description": "The `@`-prefixed window id.", - "type": "string" - } - }, - "required": [ - "window", - "corner" - ], - "type": "object" - }, - "tool": { - "const": "find_pane_by_position", - "type": "string" - } + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "required": [ - "tool" - ], - "type": "object" + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } }, - { + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "paneId", + "session", + "windowId" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Create session", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "create_window", + "wireName": "create_window", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 147 + }, + "description": "Start a pane's configured process; accepts no command payload. Add a window to a session and return it with its pane.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "Name for the new window.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "session": { + "description": "Session id ($1) or name.", + "type": "string" + }, + "startDirectory": { + "description": "Working directory for the new pane. Defaults to the session's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "window": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { "additionalProperties": false, "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "pane": { - "description": "The `%`-prefixed pane id, as `list_panes` reports it.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" }, - "tool": { - "const": "get_pane_info", + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": {}, - "type": "object" }, - "tool": { - "const": "get_server_info", + "sessionName": { "type": "string" } }, "required": [ - "tool" + "index", + "sessionId", + "sessionName", + "active" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "session": { - "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "paneId", + "window" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Add a window to a session and return it with its pane.", + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "Name for the new window.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "session": { + "description": "Session id ($1) or name.", + "type": "string" + }, + "startDirectory": { + "description": "Working directory for the new pane. Defaults to the session's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "names": { - "description": "tmux format variable names, such as `pane_current_path`.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array" - }, - "pane": { - "description": "The `%`-prefixed pane to read them against. Omit to let tmux pick\nits current pane.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "type": "string" - } + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "window": { - "description": "The `@`-prefixed window id, as `list_windows` reports it.", - "type": "string" - } - }, - "required": [ - "window" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "type": "string" - } + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "list_panes", - "type": "string" - } + "name": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": {}, - "type": "object" - }, - "tool": { - "const": "list_windows", - "type": "string" - } + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { "properties": { - "history": { - "default": false, - "description": "Search scrollback as well as the visible screen.", + "active": { + "description": "Whether this placement is current in its session.", "type": "boolean" }, - "match_case": { - "default": false, - "description": "Match case. Off by default.", - "type": "boolean" + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "pattern": { - "description": "The text to look for.", - "maxLength": 4096, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", "type": "string" }, - "regex": { - "default": false, - "description": "Read the pattern as a regular expression rather than literal text.", - "type": "boolean" - }, - "session": { - "description": "Only search panes in this session, by `$`-prefixed id or name. Omit\nfor every session.", - "type": [ - "string", - "null" - ] - }, - "window": { - "description": "Only search panes in this window, by `@`-prefixed id. Omit for every\nwindow.", - "type": [ - "string", - "null" - ] + "sessionName": { + "type": "string" } }, "required": [ - "pattern" + "index", + "sessionId", + "sessionName", + "active" ], "type": "object" }, - "tool": { - "const": "search_panes", - "type": "string" - } + "type": "array" }, - "required": [ - "tool" - ], - "type": "object" + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } }, - { + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "paneId", + "window" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Create window", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 233 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane occupying a named corner of a window.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "corner": { + "description": "Which corner of the window's layout to resolve.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { "additionalProperties": false, "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "session": { - "description": "The session whose environment to read, by `$`-prefixed id or name.\n\nOmit for the server's own.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "tool": { - "const": "show_environment", + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { "type": "string" } }, "required": [ - "tool" + "index", + "sessionId", + "sessionName" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "session": { - "description": "The session whose hooks to read, by `$`-prefixed id or name. Omit for\nthe server's own.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "tool": { - "const": "show_hooks", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "name": { - "description": "The option name, such as `history-limit` or a user option like `@theme`.", - "type": "string" - }, - "scope": { - "anyOf": [ - { - "enum": [ - "server", - "global-session", - "global-window", - "session", - "window", - "pane" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Which tmux object the option belongs to.\n\nOne of `server`, `global-session`, `global-window`, `session`,\n`window`, or `pane`. Defaults to `global-session`, which is what\nsetting an option without a target means in tmux." - }, - "target": { - "description": "The `$`, `@` or `%`-prefixed id, for the scopes that need one. Omit\nfor the others.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "tool": { - "const": "show_option", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "description": "That tool's arguments.", - "properties": { - "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen.", - "type": "boolean" - }, - "max_lines": { - "description": "The most content lines to return, oldest dropped first.\n\nDefaults to the whole visible screen. The end of a pane is what says\nwhat just happened, so a limit keeps the end.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "pane": { - "description": "The `%`-prefixed pane id.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "tool": { - "const": "snapshot_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "$defs": { - "BatchItem": { - "properties": { - "error": { - "anyOf": [ - { - "$ref": "#/$defs/ErrorData" - }, - { - "type": "null" - } - ] - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "result": true, - "resultTruncated": { - "type": "boolean" + "type": "array" }, - "success": { + "placementsComplete": { + "description": "Whether placements contains every placement.", "type": "boolean" }, - "tool": { + "title": { "type": "string" - } - }, - "required": [ - "index", - "tool", - "success", - "resultTruncated" - ], - "type": "object" - }, - "ErrorCode": { - "description": "Standard JSON-RPC error codes used throughout the MCP protocol.\n\nThese codes follow the JSON-RPC 2.0 specification and provide\nstandardized error reporting across all MCP implementations.", - "format": "int32", - "type": "integer" - }, - "ErrorData": { - "description": "Error information for JSON-RPC error responses.\n\nThis structure follows the JSON-RPC 2.0 specification for error reporting,\nproviding a standardized way to communicate errors between clients and servers.", - "properties": { - "code": { - "$ref": "#/$defs/ErrorCode", - "description": "The error type that occurred (using standard JSON-RPC error codes)" }, - "data": { - "description": "Additional information about the error. The value of this member is defined by the\nsender (e.g. detailed error information, nested errors etc.)." + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "message": { - "description": "A short description of the error. The message SHOULD be limited to a concise single sentence.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } }, "required": [ - "code", - "message" + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" ], "type": "object" - }, - "OnError": { - "enum": [ - "stop", - "continue" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "failed": { - "minimum": 0, - "type": "integer" - }, - "onError": { - "$ref": "#/$defs/OnError" - }, - "results": { - "items": { - "$ref": "#/$defs/BatchItem" - }, - "type": "array" - }, - "stoppedAt": { - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "succeeded": { - "minimum": 0, - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "minimum": 0, - "type": "integer" } }, "required": [ - "results", - "succeeded", - "failed", - "truncated", - "truncatedBytes", - "onError" + "pane" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, + "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": true, - "title": "Call Read Tools Batch" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane occupying a named corner of a window.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "corner": { + "description": "Which corner of the window's layout to resolve.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "nestedAuthority": [ - "capture_pane", - "capture_since", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "list_panes", - "list_sessions", - "list_windows", - "search_panes", - "show_environment", - "show_hooks", - "show_option", - "snapshot_pane" - ], + "name": "find_pane_by_position", + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content", - "process-environment", - "configured-command" + "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "none", + "title": "Find pane by position", "tmuxEffects": [ "observe" ], @@ -23369,132 +20152,348 @@ } }, { - "name": "capture_pane", - "wireName": "capture_pane", + "name": "get_pane_info", + "wireName": "get_pane_info", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/discovery.ts", "line": 196 }, - "description": "Read a pane's contents. Reads the visible screen by default; set history to reach output that has scrolled off, or give a start and end line. Set last_command to get only what the last command printed, which is usually what you want and is far shorter -- it needs tmux 3.7 and a shell that marks its prompts, and says so when it cannot. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. One pane's metadata: what it runs, where, how big, and whether it is yours or watched. Does not read its contents — capture_pane does that.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "end": { - "description": "End at this line. Omit for the bottom of the screen.", - "format": "int32", - "type": [ - "integer", - "null" - ] - }, - "history": { - "default": false, - "description": "Read the whole history rather than the visible screen.", - "type": "boolean" - }, - "last_command": { - "default": false, - "description": "Return only the last command's output, when the shell marks its\nprompts.\n\nAnswers far less than the history, because it starts where the last\ncommand's output began. When the pane's shell does not mark its\nprompts -- fish does, bash and zsh do not -- this reports\n`marks: \"absent\"` and returns the visible screen instead.", - "type": "boolean" - }, - "pane": { - "description": "The `%`-prefixed pane id.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" - }, - "start": { - "description": "Start at this line. Zero is the top of the screen, negative is\nscrollback. Omit for the top of the screen, or of the scrollback with\n`history`.", - "format": "int32", - "type": [ - "integer", - "null" - ] } }, "required": [ - "pane" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "Marks": { - "description": "Whether tmux knew where the last command's output began.\n\nReported rather than inferred: an answer that fell back to the whole\nscreen looks exactly like a command that printed a great deal.", - "oneOf": [ - { - "const": "present", - "description": "The prompt marks were there, so the text is one command's output.", - "type": "string" + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" }, - { - "const": "absent", - "description": "tmux has the marks but this pane has none, because its shell does not\nemit OSC 133. fish does; bash and zsh need shell integration. The\nvisible screen came back instead -- not the history, which would\nanswer a request for one command with everything the pane ever wrote.", + "command": { + "description": "The command tmux reports running in it.", "type": "string" }, - { - "const": "unsupported", - "description": "This tmux predates `capture-pane -F`, which arrived in 3.7. The\nvisible screen came back instead.", + "cwd": { + "description": "Its current working directory.", "type": "string" }, - { - "const": "not_asked", - "description": "The caller did not ask for the last command, so nothing was looked up.", + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "lines": { - "description": "How many lines that is.", - "minimum": 0, - "type": "integer" - }, - "marks": { - "$ref": "#/$defs/Marks", - "description": "Whether the text is one command's output, and why it is not." - }, - "pane": { - "description": "The pane that was read.", - "type": "string" - }, - "text": { - "description": "The text, with lines separated by newlines.", - "type": "string" + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" } }, "required": [ - "pane", - "text", - "lines", - "marks" + "pane" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, + "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": true, - "title": "Read Pane Contents" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. One pane's metadata: what it runs, where, how big, and whether it is yours or watched. Does not read its contents — capture_pane does that.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "get_pane_info", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content" + "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "none", + "title": "Get pane", "tmuxEffects": [ "observe" ], @@ -23503,95 +20502,141 @@ } }, { - "name": "capture_since", - "wireName": "capture_since", + "name": "get_server_info", + "wireName": "get_server_info", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/observe.rs", - "line": 434 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/discovery.ts", + "line": 216 }, - "description": "Read what a pane wrote since the previous call. The first call, with no cursor, starts watching and returns a cursor; later calls pass it back and receive only what is new, as the raw output stream, not the rendered screen: a line redrawn in place repeats; capture_pane shows the screen. Use this to follow a pane over several turns without re-reading the whole screen. The answer says missed=true if the cursor no longer names retained output, including when the pane outran the buffer, its live tail was evicted, or the server restarted. Starting a tail owns a retained observer until the tail is evicted or the server stops. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. The tmux server this process drives: its socket, version, daemon pid, and totals. Check the version before using a feature that needs a recent tmux.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": {}, + "type": "object" + }, + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "cursor": { - "description": "The cursor from the previous call. Omit to start watching.", + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "pid": { "type": [ "string", "null" ] }, - "pane": { - "description": "The `%`-prefixed pane to read.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "closed": { - "description": "Whether the pane has stopped writing for good.", - "type": "boolean" - }, - "cursor": { - "description": "The cursor to pass back next time.", - "type": "string" - }, - "first": { - "description": "Whether this is the first answer, which reports the visible screen\nrather than what is new.", - "type": "boolean" + "sessions": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "missed": { - "description": "Whether output between the previous cursor and this text was lost.", - "type": "boolean" + "socketPath": { + "type": [ + "string", + "null" + ] }, - "pane": { - "description": "The pane that was read.", + "version": { "type": "string" }, - "text": { - "description": "The text, with escape sequences removed.\n\nAfter the first answer this is the raw output stream, not the rendered\nscreen: a line redrawn in place repeats. `capture_pane` shows the\nscreen.", - "type": "string" + "windows": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "pane", - "text", - "cursor", - "missed", - "closed", - "first" + "panes", + "pid", + "sessions", + "socketPath", + "version", + "windows" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, + "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": true, - "title": "Read New Pane Output" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. The tmux server this process drives: its socket, version, daemon pid, and totals. Check the version before using a feature that needs a recent tmux.", "inputLiteralization": {}, + "inputSchema": { + "properties": {}, + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "get_server_info", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content" + "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "pid": { + "type": [ + "string", + "null" + ] + }, + "sessions": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "socketPath": { + "type": [ + "string", + "null" + ] + }, + "version": { + "type": "string" + }, + "windows": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "panes", + "pid", + "sessions", + "socketPath", + "version", + "windows" + ], + "type": "object" + }, "processReach": "none", + "title": "Server info", "tmuxEffects": [ "observe" ], @@ -23600,739 +20645,1307 @@ } }, { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", + "name": "get_session_info", + "wireName": "get_session_info", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 584 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 190 }, - "description": "Discard a pane's scrollback, so the next capture_pane returns only what happens next. Use this before running something whose output you want to read cleanly: it is far cheaper than reading past the old output every time. The visible screen is left alone. Delete tmux state; accepts no command payload.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session without listing every session.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "pane": { - "description": "The `%`-prefixed pane id, as `list_panes` reports it.", + "session": { + "description": "Session id ($1) or name.", "type": "string" } }, "required": [ - "pane" + "session" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "pane": { - "description": "The pane that changed.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" + "session": { + "additionalProperties": false, + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + } + }, + "required": [ + "session" + ], + "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Clear Pane History" + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session without listing every session.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "get_session_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + } + }, + "required": [ + "session" + ], + "type": "object" + }, "processReach": "none", + "title": "Get session info", "tmuxEffects": [ - "delete" + "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "create_session", - "wireName": "create_session", + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 249 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 263 }, - "description": "Create a new detached tmux session. Start a pane's configured process; accepts no command payload.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated tmux variable names without accepting raw format syntax.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "name": { - "description": "The name for the new session. It must not already exist.", - "type": "string" + "names": { + "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array", + "x-libtmux-tmux-format": "validated-variable-name" }, - "start_directory": { - "description": "The first window's working directory. Omit for the directory this MCP\nserver started in.", - "type": [ - "string", - "null" - ] + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" } }, "required": [ - "name" + "names" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "attached": { - "description": "Whether any client is attached.", - "type": "boolean" - }, - "id": { - "description": "The `$`-prefixed tmux identity.", - "type": "string" - }, - "name": { - "description": "The session name, absent when tmux reported none.", - "type": "string" - }, - "windows": { - "description": "How many windows the session holds.", - "minimum": 0, - "type": "integer" + "values": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" } }, "required": [ - "id", - "name", - "windows", - "attached" + "values" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Create Session" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated tmux variable names without accepting raw format syntax.", "inputLiteralization": { - "name": "double-hash-once", - "start_directory": "double-hash-once" + "names": "validated-variable-name" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "names": { + "description": "Variable names to resolve, such as \"pane_current_command\" — bare names, not `#{…}` format syntax.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array", + "x-libtmux-tmux-format": "validated-variable-name" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "get_tmux_variables", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], - "processReach": "configured-process", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "values": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "values" + ], + "type": "object" + }, + "processReach": "none", + "title": "Get tmux variables", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "create_window", - "wireName": "create_window", + "name": "get_window_info", + "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 927 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 216 }, - "description": "Create a window running its configured process. Start a pane's configured process; accepts no command payload.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "name": { - "description": "The window name. Omit to let tmux name it after its running command.", - "type": [ - "string", - "null" - ] - }, - "session": { - "description": "The session to create the window in, by `$`-prefixed id or name.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" - }, - "start_directory": { - "description": "The window's working directory. Omit for the directory this MCP\nserver started in.", - "type": [ - "string", - "null" - ] } }, "required": [ - "session" + "windowId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" - }, - "index": { - "description": "The window's index within that session.", - "format": "int32", - "type": "integer" - }, - "linked": { - "description": "Whether more than one session links this window.", - "type": "boolean" - }, - "name": { - "description": "The window name.", - "type": "string" - }, - "panes": { - "description": "How many panes the window holds.", - "minimum": 0, - "type": "integer" - }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" + "window": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" } }, "required": [ - "id", - "session_id", - "index", - "name", - "panes", - "active", - "linked" + "window" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Create Window" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once", - "start_directory": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "get_window_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "configured-process", - "tmuxEffects": [ - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 609 - }, - "description": "Find the pane touching a named window corner. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, + "processReach": "none", + "title": "Get window info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "kill_pane", + "wireName": "kill_pane", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 323 + }, + "description": "Delete tmux state; accepts no command payload. Close a pane and the process in it. Refuses the pane this server runs in and every pane a person is watching; force confirms only this server's exact caller pane.", + "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "corner": { - "description": "`top-left`, `top-right`, `bottom-left`, or `bottom-right`.", - "type": "string" + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" }, - "window": { - "description": "The `@`-prefixed window id.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "window", - "corner" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", - "type": "string" - }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", - "type": "string" - }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", + "killed": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "killed" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Find Pane By Position" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Close a pane and the process in it. Refuses the pane this server runs in and every pane a person is watching; force confirms only this server's exact caller pane.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "kill_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "killed": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "killed" + ], + "type": "object" + }, "processReach": "none", + "title": "Kill pane", "tmuxEffects": [ - "observe" + "observe", + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "get_pane_info", - "wireName": "get_pane_info", + "name": "kill_session", + "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 593 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 386 }, - "description": "Return metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Delete tmux state; accepts no command payload. Remove a session. Windows and panes shared with another session remain available there.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "pane": { - "description": "The `%`-prefixed pane id, as `list_panes` reports it.", + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" + }, + "session": { + "description": "Session id ($1) or name.", "type": "string" } }, "required": [ - "pane" + "session" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", - "type": "string" - }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", - "type": "string" - }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", + "killed": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", "type": "string" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "killed" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Get Pane Info" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Remove a session. Windows and panes shared with another session remain available there.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" + }, + "session": { + "description": "Session id ($1) or name.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "kill_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "killed": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + } + }, + "required": [ + "killed" + ], + "type": "object" + }, "processReach": "none", + "title": "Kill session", "tmuxEffects": [ - "observe" + "observe", + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "get_server_info", - "wireName": "get_server_info", + "name": "kill_window", + "wireName": "kill_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 149 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 352 }, - "description": "Report every session with its windows and panes, in one call. Prefer this over calling the three listing tools separately: it costs tmux four commands rather than one per object. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], "type": "object" }, "outputSchema": { - "$defs": { - "Branch": { - "description": "One session with everything under it.", - "properties": { - "attached": { - "description": "Whether any client is attached.", - "type": "boolean" - }, - "id": { - "description": "The `$`-prefixed tmux identity.", - "type": "string" - }, - "name": { - "description": "The session name.", - "type": "string" - }, - "windows": { - "description": "The windows it holds.", - "items": { - "$ref": "#/$defs/BranchWindow" - }, - "type": "array" - } - }, - "required": [ - "id", - "name", - "attached", - "windows" - ], - "type": "object" + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "killed": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "killed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "BranchPane": { - "description": "One pane inside a described window.", + "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "active": { - "description": "Whether this is the window's active pane.", + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", "type": "boolean" }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "id", - "active" + "windowId" ], "type": "object" }, - "BranchWindow": { - "description": "One window inside a described session.", + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "kill_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" - }, - "index": { - "description": "The window's index within its session.", - "format": "int32", - "type": "integer" - }, - "linked": { - "description": "Whether more than one session links this window.", - "type": "boolean" - }, - "name": { - "description": "The window name.", + "killed": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" - }, - "panes": { - "description": "The panes it holds.", - "items": { - "$ref": "#/$defs/BranchPane" - }, - "type": "array" } }, "required": [ - "id", - "index", - "name", - "active", - "linked", - "panes" + "killed" ], "type": "object" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "sessions": { - "description": "Every session, with its windows and their panes.", - "items": { - "$ref": "#/$defs/Branch" - }, - "type": "array" - } - }, - "required": [ - "sessions" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Describe Server" - }, - "meta": { - "anthropic/alwaysLoad": true, - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], + }, "processReach": "none", + "title": "Kill window", "tmuxEffects": [ - "observe" + "observe", + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "get_session_info", - "wireName": "get_session_info", + "name": "list_panes", + "wireName": "list_panes", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 555 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/discovery.ts", + "line": 150 }, - "description": "Return metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Panes on this server, with the command each is running and its directory. Marks the pane this server runs in (isCallerPane) and panes a person is watching (isAttended). Metadata only — search_panes reads their contents.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "session": { - "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", + "description": "Session id ($1) or name.", + "type": "string" + }, + "window": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, - "required": [ - "session" - ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "attached": { - "description": "Whether any client is attached.", + "complete": { "type": "boolean" }, - "id": { - "description": "The `$`-prefixed tmux identity.", - "type": "string" - }, - "name": { - "description": "The session name, absent when tmux reported none.", - "type": "string" - }, - "windows": { - "description": "How many windows the session holds.", - "minimum": 0, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" + }, + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "id", - "name", - "windows", - "attached" + "complete", + "omittedEntries", + "panes" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Get Session Info" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Panes on this server, with the command each is running and its directory. Marks the pane this server runs in (isCallerPane) and panes a person is watching (isAttended). Metadata only — search_panes reads their contents.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "description": "Session id ($1) or name.", + "type": "string" + }, + "window": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "list_panes", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "panes": { + "items": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "omittedEntries", + "panes" + ], + "type": "object" + }, "processReach": "none", + "title": "List panes", "tmuxEffects": [ "observe" ], @@ -24341,80 +21954,198 @@ } }, { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", + "name": "list_sessions", + "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 652 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/discovery.ts", + "line": 60 }, - "description": "Read a bounded set of tmux variables against one pane. tmux reads a name it does not know as a format from its environment, so a name the server or session environment holds is refused unless the operator listed it in LIBTMUX_ENVIRONMENT_VALUES at startup. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Every session on this server with its id, name, window count, and whether anyone is attached. Metadata only — for what a pane shows, use capture_pane or search_panes.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "names": { - "description": "tmux format variable names, such as `pane_current_path`.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array" - }, - "pane": { - "description": "The `%`-prefixed pane to read them against. Omit to let tmux pick\nits current pane.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "names" - ], + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": {}, "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "values": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "values" + "complete": { + "type": "boolean" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessions": { + "items": { + "additionalProperties": false, + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "omittedEntries", + "sessions" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Get tmux Variables" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "names": "validated-variable-name" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Every session on this server with its id, name, window count, and whether anyone is attached. Metadata only — for what a pane shows, use capture_pane or search_panes.", + "inputLiteralization": {}, + "inputSchema": { + "properties": {}, + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "list_sessions", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "configured-command" + "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessions": { + "items": { + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "omittedEntries", + "sessions" + ], + "type": "object" + }, "processReach": "none", + "title": "List sessions", "tmuxEffects": [ "observe" ], @@ -24423,94 +22154,290 @@ } }, { - "name": "get_window_info", - "wireName": "get_window_info", + "name": "list_windows", + "wireName": "list_windows", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 579 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/discovery.ts", + "line": 105 }, - "description": "Return metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Windows on this server, optionally restricted to one session by id or name.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "window": { - "description": "The `@`-prefixed window id, as `list_windows` reports it.", + "session": { + "description": "Session id ($1) or name. Omit for all sessions.", "type": "string" } }, - "required": [ - "window" - ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" - }, - "index": { - "description": "The window's index within that session.", - "format": "int32", - "type": "integer" - }, - "linked": { - "description": "Whether more than one session links this window.", + "complete": { "type": "boolean" }, - "name": { - "description": "The window name.", - "type": "string" - }, - "panes": { - "description": "How many panes the window holds.", - "minimum": 0, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "id", - "session_id", - "index", - "name", - "panes", - "active", - "linked" + "complete", + "omittedEntries", + "windows" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Get Window Info" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Windows on this server, optionally restricted to one session by id or name.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for all sessions.", + "type": "string" + } + }, + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "list_windows", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windows": { + "items": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "omittedEntries", + "windows" + ], + "type": "object" + }, "processReach": "none", + "title": "List windows", "tmuxEffects": [ "observe" ], @@ -24519,615 +22446,1664 @@ } }, { - "name": "kill_pane", - "wireName": "kill_pane", + "name": "move_window", + "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 227 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 268 }, - "description": "Kill a pane. Killing a window's last pane closes the window. Delete tmux state; accepts no command payload.", + "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "pane": { - "description": "The `%`-prefixed pane id, as `list_panes` reports it.", + "index": { + "description": "Destination index. Defaults to the next free one.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Destination session id or name.", + "type": "string" + }, + "sourceIndex": { + "description": "Source window index. Required when the session has several placements of the id.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Source session id or name. Required when the id has several placements.", + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "pane" + "windowId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "id": { - "description": "The id of what was destroyed.", - "type": "string" + "window": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" } }, "required": [ - "id" + "window" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Kill Pane" + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "index": { + "description": "Destination index. Defaults to the next free one.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Destination session id or name.", + "type": "string" + }, + "sourceIndex": { + "description": "Source window index. Required when the session has several placements of the id.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Source session id or name. Required when the id has several placements.", + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "move_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, "processReach": "none", + "title": "Move window", "tmuxEffects": [ - "delete" + "observe", + "change" ], - "toolset": "teardown" + "toolset": "manage" } } }, { - "name": "kill_session", - "wireName": "kill_session", + "name": "paste_text", + "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 299 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/input.ts", + "line": 189 }, - "description": "Kill a tmux session and everything in it. Delete tmux state; accepts no command payload.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Put text into a pane without tmux interpreting any of it as key names. Use for content — a password, a code block, anything with characters a key parser would claim.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "session": { - "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", + "enter": { + "description": "Press Enter afterwards. Default false.", + "type": "boolean" + }, + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "text": { + "description": "Text to paste. Sent through a tmux buffer, so a shell's line editor does not redraw on every character.", "type": "string" } }, "required": [ - "session" + "paneId", + "text" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "id": { - "description": "The id of what was destroyed.", + "bytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "id" + "bytes", + "paneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Kill Session" + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Put text into a pane without tmux interpreting any of it as key names. Use for content — a password, a code block, anything with characters a key parser would claim.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enter": { + "description": "Press Enter afterwards. Default false.", + "type": "boolean" + }, + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "text": { + "description": "Text to paste. Sent through a tmux buffer, so a shell's line editor does not redraw on every character.", + "type": "string" + } + }, + "required": [ + "paneId", + "text" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "paste_text", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "bytes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "bytes", + "paneId" + ], + "type": "object" + }, + "processReach": "pane-input", + "title": "Paste text", "tmuxEffects": [ - "delete" + "observe", + "change" ], - "toolset": "teardown" + "toolset": "execute" } } }, { - "name": "kill_window", - "wireName": "kill_window", + "name": "rename_session", + "wireName": "rename_session", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 207 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 234 }, - "description": "Kill a window, closing it in every session that links it. Delete tmux state; accepts no command payload.", + "description": "Change tmux state; no client-supplied executable input. Rename a session. Its id does not change, so targets by id keep working.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "window": { - "description": "The `@`-prefixed window id, as `list_windows` reports it.", + "name": { + "description": "The session's new name.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "session": { + "description": "Session id ($1) or name.", "type": "string" } }, "required": [ - "window" + "name", + "session" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "id": { - "description": "The id of what was destroyed.", - "type": "string" + "session": { + "additionalProperties": false, + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" } }, "required": [ - "id" + "session" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Kill Window" + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Rename a session. Its id does not change, so targets by id keep working.", + "inputLiteralization": { + "name": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "The session's new name.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "session": { + "description": "Session id ($1) or name.", + "type": "string" + } + }, + "required": [ + "name", + "session" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "rename_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "list_panes", - "wireName": "list_panes", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 137 - }, - "description": "List every pane on the server. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "type": "object" - }, - "outputSchema": { - "$defs": { - "PaneView": { - "description": "One pane, as the protocol sees it.", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" + "session": { + "properties": { + "attachedClients": { + "description": "Raw client count from tmux; 0 means detached. Includes control-mode clients - this server's own wait_for_text or other live read holds one open while it runs, and another program on this socket may hold others. See humanAttachedClients for a person-only count.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "humanAttachedClients": { + "description": "attachedClients minus every control-mode client, this server's own included.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "metadataComplete": { + "description": "Whether the session name is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from the session name.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "windows": { + "description": "How many windows it holds.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "attachedClients", + "humanAttachedClients", + "id", + "metadataComplete", + "name", + "omittedMetadataBytes", + "windows" + ], + "type": "object" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "session" ], "type": "object" }, - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", - "type": "string" - }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", - "type": "string" - }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "panes": { - "description": "The panes, in tmux's own order.", - "items": { - "$ref": "#/$defs/PaneView" - }, - "type": "array" - } - }, - "required": [ - "panes" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "List Panes" - }, - "meta": { - "anthropic/alwaysLoad": true, - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], "processReach": "none", + "title": "Rename session", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "list_sessions", - "wireName": "list_sessions", + "name": "rename_window", + "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 110 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 260 }, - "description": "List every tmux session on the server. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Rename a window. Its id does not change.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "The window's new name.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], "type": "object" }, "outputSchema": { - "$defs": { - "SessionView": { - "description": "One session, as the protocol sees it.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "window": { + "additionalProperties": false, "properties": { - "attached": { - "description": "Whether any client is attached.", - "type": "boolean" - }, "id": { - "description": "The `$`-prefixed tmux identity.", + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", "type": "string" }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, "name": { - "description": "The session name, absent when tmux reported none.", "type": "string" }, - "windows": { - "description": "How many windows the session holds.", + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, "minimum": 0, "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" } }, "required": [ "id", + "layout", + "metadataComplete", "name", - "windows", - "attached" + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" ], "type": "object" } }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "sessions": { - "description": "The sessions, in tmux's own order.", - "items": { - "$ref": "#/$defs/SessionView" - }, - "type": "array" - } - }, "required": [ - "sessions" + "window" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "List Sessions" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Rename a window. Its id does not change.", + "inputLiteralization": { + "name": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "The window's new name.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "rename_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, "processReach": "none", + "title": "Rename window", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "list_windows", - "wireName": "list_windows", + "name": "resize_pane", + "wireName": "resize_pane", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 125 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 85 }, - "description": "List every window on the server. A window linked into several sessions appears once per link, so an id can repeat with a different session_id. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Resize a pane, either to a size or by an amount in a direction. Give width/height for an absolute size, or direction with amount for a nudge.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "amount": { + "description": "Cells to move by. Needs direction.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "direction": { + "description": "Adjust by an amount in this direction instead of setting a size.", + "enum": [ + "up", + "down", + "left", + "right" + ], + "type": "string" + }, + "height": { + "description": "Set the pane height, in rows.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "width": { + "description": "Set the width, in columns.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "zoom": { + "description": "true makes this pane fill its window, false restores the layout. A state, not a toggle: sending the same value twice is a no-op.", + "type": "boolean" + } + }, + "required": [ + "paneId" + ], "type": "object" }, "outputSchema": { - "$defs": { - "WindowView": { - "description": "One window, as the protocol sees it.", - "properties": { - "active": { - "description": "Whether this is the session's active window.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", "type": "boolean" }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, "id": { - "description": "The `@`-prefixed tmux identity.", + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", "type": "string" }, "index": { - "description": "The window's index within that session.", - "format": "int32", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "linked": { - "description": "Whether more than one session links this window.", + "isAttended": { + "description": "A person is currently looking at this pane.", "type": "boolean" }, - "name": { - "description": "The window name.", - "type": "string" + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" }, - "panes": { - "description": "How many panes the window holds.", + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, - "session_id": { - "description": "The session this window was reached through.", + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } }, "required": [ + "active", + "command", + "cwd", + "dead", + "height", "id", - "session_id", "index", - "name", - "panes", - "active", - "linked" + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" ], "type": "object" } }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "windows": { - "description": "The windows, in tmux's own order.", - "items": { - "$ref": "#/$defs/WindowView" - }, - "type": "array" - } - }, "required": [ - "windows" + "pane" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "List Windows" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Resize a pane, either to a size or by an amount in a direction. Give width/height for an absolute size, or direction with amount for a nudge.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "amount": { + "description": "Cells to move by. Needs direction.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "direction": { + "description": "Adjust by an amount in this direction instead of setting a size.", + "enum": [ + "up", + "down", + "left", + "right" + ], + "type": "string" + }, + "height": { + "description": "Set the pane height, in rows.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "width": { + "description": "Set the width, in columns.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "zoom": { + "description": "true makes this pane fill its window, false restores the layout. A state, not a toggle: sending the same value twice is a no-op.", + "type": "boolean" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "resize_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "none", + "title": "Resize pane", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "move_window", - "wireName": "move_window", + "name": "resize_window", + "wireName": "resize_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 791 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 311 }, - "description": "Move one window to a session and index. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Set a window's size in cells. A detached window is whatever size tmux guessed, and a program that formats to its terminal width truncates to that at the source — no capture option recovers those columns, because they were never printed. resize_pane only redistributes space inside a window and cannot grow one. A client attached to the window will overwrite this when it next changes; window-size manual makes a size of your own stick.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "destination_index": { - "description": "The window index there. tmux refuses one already in use.", - "format": "int32", + "height": { + "description": "Set the height, in rows.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, "type": "integer" }, - "destination_session": { - "description": "The session to move the window into, by `$`-prefixed id or name.", - "type": "string" + "width": { + "description": "Set the width, in columns.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" }, - "window": { - "description": "The `@`-prefixed window id to move.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "window", - "destination_session", - "destination_index" + "windowId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" - }, - "index": { - "description": "The window's index within that session.", - "format": "int32", - "type": "integer" - }, - "linked": { - "description": "Whether more than one session links this window.", - "type": "boolean" - }, - "name": { - "description": "The window name.", - "type": "string" - }, - "panes": { - "description": "How many panes the window holds.", - "minimum": 0, - "type": "integer" - }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" + "window": { + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" } }, "required": [ - "id", - "session_id", - "index", - "name", - "panes", - "active", - "linked" + "window" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Move Window" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set a window's size in cells. A detached window is whatever size tmux guessed, and a program that formats to its terminal width truncates to that at the source — no capture option recovers those columns, because they were never printed. resize_pane only redistributes space inside a window and cannot grow one. A client attached to the window will overwrite this when it next changes; window-size manual makes a size of your own stick.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "height": { + "description": "Set the height, in rows.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "width": { + "description": "Set the width, in columns.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "resize_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, "processReach": "none", + "title": "Resize window", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -25135,57 +24111,181 @@ } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "respawn_pane", + "wireName": "respawn_pane", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 608 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 282 }, - "description": "Put text into a pane through a tmux paste buffer instead of typing it key by key. Use this for anything long or awkward: send_keys types the text, so a shell reading it can react to each character, and a bracketed-paste aware program treats a paste as one block. Optional Enter is appended to that same block. Empty text without Enter is a guarded buffer-free no-op. Paste targets only the named pane, even when synchronized input is enabled. A dead, input-disabled, mode-owned, terminal-attended, or inherited-caller target is refused before setup and again immediately before paste. The private buffer is deleted after setup, refusal, and paste outcomes; observations can still race with tmux. A submitted paste is remembered briefly so wait_for_text can discount its own echo. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Start a pane's configured process; accepts no command payload. Restart a pane's command in place, keeping the pane and its id. Use to recover a pane whose process died, rather than killing and re-splitting.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "enter": { - "default": false, - "description": "Whether to append Enter to the same paste block.", + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", "type": "boolean" }, - "pane": { - "description": "The `%`-prefixed pane to paste into.", - "type": "string" + "killFirst": { + "description": "Replace a still-running process. Default false.", + "type": "boolean" }, - "text": { - "description": "The text to deliver.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" + }, + "startDirectory": { + "description": "Working directory for the restarted command. Defaults to the pane's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" } }, "required": [ - "pane", - "text" + "paneId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "bytes": { - "description": "How many bytes came from `text`, excluding optional Enter.", - "minimum": 0, - "type": "integer" - }, "pane": { - "description": "The pane it went into.", - "type": "string" + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" } }, "required": [ - "pane", - "bytes" + "pane" ], "type": "object" }, @@ -25193,659 +24293,668 @@ "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Paste Text Into Pane" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "pane-input", - "tmuxEffects": [ - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "rename_session", - "wireName": "rename_session", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 713 - }, - "description": "Rename one session. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "name": { - "description": "The new name. tmux refuses one another session has.", - "type": "string" - }, - "session": { - "description": "The session to rename, by `$`-prefixed id or name.", - "type": "string" - } - }, - "required": [ - "session", - "name" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "attached": { - "description": "Whether any client is attached.", - "type": "boolean" - }, - "id": { - "description": "The `$`-prefixed tmux identity.", - "type": "string" - }, - "name": { - "description": "The session name, absent when tmux reported none.", - "type": "string" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "windows": { - "description": "How many windows the session holds.", - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "id", - "name", - "windows", - "attached" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Rename Session" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, + "description": "Start a pane's configured process; accepts no command payload. Restart a pane's command in place, keeping the pane and its id. Use to recover a pane whose process died, rather than killing and re-splitting.", "inputLiteralization": { - "name": "double-hash-once" + "startDirectory": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "force": { + "description": "Allow this to target the pane this server itself was called from, which is otherwise refused. It does not override the refusal to touch a pane a person is watching.", + "type": "boolean" + }, + "killFirst": { + "description": "Replace a still-running process. Default false.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "startDirectory": { + "description": "Working directory for the restarted command. Defaults to the pane's.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "respawn_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "rename_window", - "wireName": "rename_window", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 745 - }, - "description": "Rename one window. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "name": { - "description": "The new name. tmux then stops renaming the window automatically.", - "type": "string" - }, - "window": { - "description": "The `@`-prefixed window id.", - "type": "string" - } - }, - "required": [ - "window", - "name" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" - }, - "index": { - "description": "The window's index within that session.", - "format": "int32", - "type": "integer" - }, - "linked": { - "description": "Whether more than one session links this window.", - "type": "boolean" - }, - "name": { - "description": "The window name.", - "type": "string" - }, - "panes": { - "description": "How many panes the window holds.", - "minimum": 0, - "type": "integer" - }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" - } - }, - "required": [ - "id", - "session_id", - "index", - "name", - "panes", - "active", - "linked" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Rename Window" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once" + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", + "processReach": "configured-process", + "title": "Respawn pane", "tmuxEffects": [ - "change" + "observe", + "change", + "delete" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "run_shell_command", + "wireName": "run_shell_command", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 319 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/input.ts", + "line": 304 }, - "description": "Move one edge of a pane by a number of rows or columns. Change tmux state; no client-supplied executable input.", + "description": "Run a shell command in a pane with your user's permissions. Run a shell command in a pane, wait for it to finish, and report its exit status and output. Prefer this over send_keys plus capture_pane: it frames the command so a pane's echo of what you typed can never be mistaken for what the command printed, and it knows when the command actually ended rather than guessing from the screen. The command runs in a subshell, so cd and export do not persist to a later call. A pane is effectively single-writer: this server reserves it until the command settles, but another process with the same tmux socket can still write into it.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "ResizeDirectionSchema": { - "enum": [ - "up", - "down", - "left", - "right" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "cells": { - "description": "How many rows or columns to move it by.", - "minimum": 0, - "type": "integer" + "command": { + "description": "The shell command to run.", + "type": "string" }, - "direction": { - "$ref": "#/$defs/ResizeDirectionSchema", - "description": "Which edge to move: `up`, `down`, `left`, or `right`." + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" }, - "pane": { - "description": "The `%`-prefixed pane id.", - "type": "string" - } - }, - "required": [ - "pane", - "direction", - "cells" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "height": { - "description": "How tall it is now, in rows.", - "minimum": 0, + "maxLines": { + "description": "Keep at most this many lines, from the end. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, "type": "integer" }, - "pane": { - "description": "The pane that was resized.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, - "width": { - "description": "How wide it is now, in columns.", - "minimum": 0, + "timeoutMs": { + "description": "How long to wait. Clamped by the server ceiling; the result says what was used.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, "type": "integer" } }, "required": [ - "pane", - "width", - "height" + "command", + "paneId" ], "type": "object" }, - "annotations": { - "destructiveHint": false, - "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Resize Pane" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "resize_window", - "wireName": "resize_window", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 768 - }, - "description": "Resize one window to exact cell dimensions. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, "properties": { - "height": { - "description": "Height in rows.", - "minimum": 0, + "droppedLines": { + "description": "Lines of output withheld by maxLines. The text half says so in a notice; a caller reading only the structured half would otherwise take the tail for the whole.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "width": { - "description": "Width in columns.", - "minimum": 0, + "effectiveTimeoutMs": { + "description": "The timeout actually enforced.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "window": { - "description": "The `@`-prefixed window id.", - "type": "string" - } - }, - "required": [ - "window", - "width", - "height" - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the session's active window.", + "exitStatus": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The command's exit status; null if it did not finish." + }, + "foreignOutputSuspected": { + "description": "Another writer printed into this pane while the command ran. Output that could be attributed to them was removed; what is left may still include theirs. False means no foreign marker was seen, not that the output is certainly this command's.", "type": "boolean" }, - "id": { - "description": "The `@`-prefixed tmux identity.", - "type": "string" + "missedBytes": { + "description": "Output that fell out of the pane's buffer before this read reached it. Nonzero means the command printed more than was kept, so the output here starts partway through it.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "index": { - "description": "The window's index within that session.", - "format": "int32", + "omittedBytes": { + "description": "Output bytes omitted by the result ceiling.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "linked": { - "description": "Whether more than one session links this window.", + "outcome": { + "description": "Why this returned. Read it rather than inferring from the text.", + "enum": [ + "completed", + "timed_out", + "pane_died", + "cancelled" + ], + "type": "string" + }, + "output": { + "description": "The bounded tail of the command's output.", + "type": "string" + }, + "outputComplete": { + "description": "False when capture or result limits omitted any command output.", "type": "boolean" }, - "name": { - "description": "The window name.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, - "panes": { - "description": "How many panes the window holds.", - "minimum": 0, + "returnedBytes": { + "description": "UTF-8 output bytes returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" + "stillRunning": { + "description": "Whether the command may still be running after this call returned.", + "type": "boolean" } }, "required": [ - "id", - "session_id", - "index", - "name", - "panes", - "active", - "linked" + "effectiveTimeoutMs", + "droppedLines", + "missedBytes", + "omittedBytes", + "foreignOutputSuspected", + "exitStatus", + "outcome", + "output", + "outputComplete", + "paneId", + "returnedBytes", + "stillRunning" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Resize Window" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Run a shell command in a pane with your user's permissions. Run a shell command in a pane, wait for it to finish, and report its exit status and output. Prefer this over send_keys plus capture_pane: it frames the command so a pane's echo of what you typed can never be mistaken for what the command printed, and it knows when the command actually ended rather than guessing from the screen. The command runs in a subshell, so cd and export do not persist to a later call. A pane is effectively single-writer: this server reserves it until the command settles, but another process with the same tmux socket can still write into it.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "command": { + "description": "The shell command to run.", + "type": "string" + }, + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" + }, + "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" + }, + "timeoutMs": { + "description": "How long to wait. Clamped by the server ceiling; the result says what was used.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "command", + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "run_shell_command", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "change" + "tmux-metadata", + "terminal-content" ], - "toolset": "manage" - } - } - }, - { - "name": "respawn_pane", - "wireName": "respawn_pane", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 1020 - }, - "description": "Restart a pane's configured process with no command payload. Start a pane's configured process; accepts no command payload.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "kill_first": { - "default": false, - "description": "Kill a running process first. Defaults to `false`, which respawns\nonly a dead pane.", - "type": "boolean" - }, - "pane": { - "description": "The `%`-prefixed pane id.", - "type": "string" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, - "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "droppedLines": { + "description": "Lines of output withheld by maxLines. The text half says so in a notice; a caller reading only the structured half would otherwise take the tail for the whole.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "effectiveTimeoutMs": { + "description": "The timeout actually enforced.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "exitStatus": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The command's exit status; null if it did not finish." + }, + "foreignOutputSuspected": { + "description": "Another writer printed into this pane while the command ran. Output that could be attributed to them was removed; what is left may still include theirs. False means no foreign marker was seen, not that the output is certainly this command's.", + "type": "boolean" + }, + "missedBytes": { + "description": "Output that fell out of the pane's buffer before this read reached it. Nonzero means the command printed more than was kept, so the output here starts partway through it.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "omittedBytes": { + "description": "Output bytes omitted by the result ceiling.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "outcome": { + "description": "Why this returned. Read it rather than inferring from the text.", + "enum": [ + "completed", + "timed_out", + "pane_died", + "cancelled" + ], "type": "string" }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", + "output": { + "description": "The bounded tail of the command's output.", "type": "string" }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "outputComplete": { + "description": "False when capture or result limits omitted any command output.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" + }, + "returnedBytes": { + "description": "UTF-8 output bytes returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "stillRunning": { + "description": "Whether the command may still be running after this call returned.", + "type": "boolean" } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] + }, + "required": [ + "effectiveTimeoutMs", + "droppedLines", + "missedBytes", + "omittedBytes", + "foreignOutputSuspected", + "exitStatus", + "outcome", + "output", + "outputComplete", + "paneId", + "returnedBytes", + "stillRunning" + ], + "type": "object" }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" - } - }, - "required": [ - "id", - "window_id", - "active", - "caller" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Respawn Pane" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "configured-process", + "processReach": "pane-command", + "title": "Run a shell command and wait", "tmuxEffects": [ - "change", - "delete" + "observe", + "change" ], "toolset": "execute" } } }, { - "name": "run_shell_command", - "wireName": "run_shell_command", + "name": "search_panes", + "wireName": "search_panes", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/observe.rs", - "line": 208 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/search.ts", + "line": 78 }, - "description": "Run a shell command in a pane, wait for it to finish, and report its exit status with everything it wrote. This is the tool for \"run this and tell me if it worked\". Output is the pane's raw output stream, not the rendered screen: nothing is missed, the shell prompt is not included, and a line redrawn in place repeats; capture_pane shows the screen. The command runs in a subshell, so cd and export do not persist and invalid syntax completes with a nonzero status. Valid inherited Bash and zsh ERR and DEBUG traps remain visible to the command while parent-shell traps and options remain unchanged. It requires one configured input recipient and observes its mode, liveness, input-off state, attended-client state, cohort, inherited-caller relation, known POSIX shell, and resolved route before watcher setup and again before dispatch. A process-wide endpoint-and-pane reservation blocks other MCP pane input until the completion marker or pane closure is proved. The resolved tmux executable and socket path must contain no ASCII terminal-control bytes. The reservation serializes this MCP's input, but tmux observations can still race with dispatch. The pane shell, tmux server, and configuration must be trusted. Reaching the deadline, cancelling, or an uncertain dispatch stops this request while its watcher keeps the reservation until completion is proved. To stop the command, send_keys with keys [\"C-c\"] alone passes the reservation, and the command reports completion when it ends; respawn_pane with kill_first replaces a program that ignores C-c and C-\\. Run a shell command in a pane with your user's permissions.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing something. Searches pane contents, not their names — use list_panes for metadata. Returns the matching lines with their pane, so you can target one without capturing them all. Literal matching stops at one 256 KiB aggregate UTF-8 byte budget.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "command": { - "description": "The command for the pane's trusted POSIX-compatible shell.\n\nShell reserved words and special builtins must retain their standard\nmeanings. The command runs inside a subshell, so several lines are fine\nand a bare `exit` does not end the pane's own shell. Invalid syntax is\ncontained and completes with the shell's nonzero status. Valid inherited\nBash and zsh `ERR` and `DEBUG` traps remain visible to the command while\nthe pane's parent-shell traps and options remain unchanged.", - "type": "string" + "maxMatchesPerPane": { + "description": "Stop after this many matches in each pane. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" }, - "pane": { - "description": "The `%`-prefixed pane to run in.", + "pattern": { + "description": "Non-empty literal text to find.", + "minLength": 1, "type": "string" }, - "seconds": { - "description": "How long to allow, in seconds. Defaults to 30, capped at 600.", + "regex": { + "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "How far above the visible screen to search. Default 0.", + "maximum": 9007199254740991, "minimum": 0, - "type": [ - "integer", - "null" - ] + "type": "integer" }, - "suppress_history": { - "default": false, - "description": "Whether to keep the command out of the shell's history.", - "type": "boolean" + "session": { + "description": "Restrict to one session by id or name.", + "type": "string" } }, "required": [ - "pane", - "command" + "pattern" ], "type": "object" }, "outputSchema": { - "$defs": { - "RunOutcome": { - "description": "How a run finished.\n\nSplit from the wait outcomes rather than shared with them: a run cannot\nmatch a pattern and a wait cannot report a missing shell, and a vocabulary\ncarrying both would have an agent checking for answers that never come.", - "oneOf": [ - { - "const": "completed", - "description": "The command ran to completion and reported its status.", - "type": "string" - }, - { - "const": "deadline", - "description": "The time the caller allowed ran out.\n\nThis ends the waiting, not the command. The pane stays reserved for it\nuntil it ends, so other pane input is refused; `send_keys` with keys\n`[\"C-c\"]` alone interrupts it.", - "type": "string" - }, - { - "const": "pane_closed", - "description": "The pane stopped writing for good.", - "type": "string" - }, - { - "const": "cancelled", - "description": "The client withdrew the request while the run was still going.", - "type": "string" - }, - { - "const": "no_shell", - "description": "The pane never acknowledged the command.\n\nThe keys were sent but the opening sentinel never came back. That is\nwhat a pane looks like when it is not at a shell prompt: sitting in an\neditor or a REPL, or still running something an earlier call left\nbehind. The text was typed into whatever is there.\n\nThe evidence is absence, so a deadline too short for the pane's shell\nto have echoed anything yet looks the same. Read it as \"nothing came\nback in the time allowed\" and check the pane with `snapshot_pane`\nbefore concluding it is stuck.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "bytes": { - "description": "How many bytes that was, before any truncation.", - "minimum": 0, + "capturesByteClamped": { + "type": "boolean" + }, + "effectiveScrollbackLines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "exit_status": { - "description": "The command's exit status, when it completed.\n\nAbsent when the run did not complete, and when the command was killed\nby a signal rather than exiting.", - "format": "int32", - "type": [ - "integer", - "null" - ] + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "lineNumber": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "placements": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "text": { + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "lineNumber", + "paneId", + "placements", + "text", + "windowName" + ], + "type": "object" + }, + "type": "array" }, - "outcome": { - "$ref": "#/$defs/RunOutcome", - "description": "How the run finished." + "matchesTruncated": { + "type": "boolean" }, - "output": { - "description": "Everything the command wrote, stdout and stderr interleaved in the\norder the program wrote them.\n\nThis is the raw output stream with escape sequences removed, not the\nrendered screen: a line redrawn in place, such as a progress bar,\nrepeats. `capture_pane` shows the screen.", - "type": "string" + "matchingByteClamped": { + "type": "boolean" }, - "pane": { - "description": "The pane the command ran in.", - "type": "string" + "matchingLineClamped": { + "type": "boolean" }, - "truncated": { - "description": "Whether the output was truncated from the front.", + "matchingTimeClamped": { + "type": "boolean" + }, + "paneLimitClamped": { + "type": "boolean" + }, + "panesFailed": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "panesSearched": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "scrollbackClamped": { "type": "boolean" } }, "required": [ - "pane", - "outcome", - "output", - "bytes", - "truncated" + "capturesByteClamped", + "effectiveScrollbackLines", + "matches", + "matchingByteClamped", + "matchingLineClamped", + "matchingTimeClamped", + "matchesTruncated", + "paneLimitClamped", + "panesFailed", + "panesSearched", + "scrollbackClamped" ], "type": "object" }, @@ -25853,161 +24962,176 @@ "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Run Command In Pane" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "processReach": "pane-command", - "tmuxEffects": [ - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "search_panes", - "wireName": "search_panes", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 344 - }, - "description": "Search what panes are displaying with Rust's linear-time regex engine. Accept at most 4,096 pattern bytes; search at most 64 panes, 8,192 lines, and 1 MiB; spend at most 250 ms matching and five seconds capturing. Report the pane and line of every match. Use this to find where something is -- which pane has the failing test, which one printed the error -- instead of capturing panes one at a time. Searches the visible screen by default; set history to include scrollback. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "history": { - "default": false, - "description": "Search scrollback as well as the visible screen.", - "type": "boolean" - }, - "match_case": { - "default": false, - "description": "Match case. Off by default.", - "type": "boolean" - }, - "pattern": { - "description": "The text to look for.", - "maxLength": 4096, - "type": "string" - }, - "regex": { - "default": false, - "description": "Read the pattern as a regular expression rather than literal text.", - "type": "boolean" - }, - "session": { - "description": "Only search panes in this session, by `$`-prefixed id or name. Omit\nfor every session.", - "type": [ - "string", - "null" - ] + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "window": { - "description": "Only search panes in this window, by `@`-prefixed id. Omit for every\nwindow.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "outputSchema": { - "$defs": { - "MatchView": { - "description": "One line of one pane that matched a search.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing something. Searches pane contents, not their names — use list_panes for metadata. Returns the matching lines with their pane, so you can target one without capturing them all. Literal matching stops at one 256 KiB aggregate UTF-8 byte budget.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "line": { - "description": "Which line of the capture matched, counting from the top.", - "minimum": 0, + "maxMatchesPerPane": { + "description": "Stop after this many matches in each pane. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, "type": "integer" }, - "pane": { - "description": "The pane the line was found in.", + "pattern": { + "description": "Non-empty literal text to find.", + "minLength": 1, "type": "string" }, - "text": { - "description": "The line itself.", - "type": "string" + "regex": { + "description": "Interpret pattern using libtmux's bounded regular-expression grammar.", + "type": "boolean" }, - "window_id": { - "description": "The window that pane belongs to.", + "scrollbackLines": { + "description": "How far above the visible screen to search. Default 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Restrict to one session by id or name.", "type": "string" } }, "required": [ - "pane", - "window_id", - "line", - "text" + "pattern" ], "type": "object" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "capped": { - "description": "Whether the match ceiling was reached, so there may be more.", - "type": "boolean" - }, - "matches": { - "description": "Every matching line, in the order the panes were read.", - "items": { - "$ref": "#/$defs/MatchView" - }, - "type": "array" }, - "panes_searched": { - "description": "How many panes were read to answer this.", - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "matches", - "panes_searched", - "capped" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": true, - "readOnlyHint": true, - "title": "Search Pane Contents" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "search_panes", "nestedAuthority": [], "outputClasses": [ "tmux-metadata", "terminal-content" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "capturesByteClamped": { + "type": "boolean" + }, + "effectiveScrollbackLines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "matches": { + "items": { + "properties": { + "lineNumber": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "placements": { + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "text": { + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "lineNumber", + "paneId", + "placements", + "text", + "windowName" + ], + "type": "object" + }, + "type": "array" + }, + "matchesTruncated": { + "type": "boolean" + }, + "matchingByteClamped": { + "type": "boolean" + }, + "matchingLineClamped": { + "type": "boolean" + }, + "matchingTimeClamped": { + "type": "boolean" + }, + "paneLimitClamped": { + "type": "boolean" + }, + "panesFailed": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "panesSearched": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "scrollbackClamped": { + "type": "boolean" + } + }, + "required": [ + "capturesByteClamped", + "effectiveScrollbackLines", + "matches", + "matchingByteClamped", + "matchingLineClamped", + "matchingTimeClamped", + "matchesTruncated", + "paneLimitClamped", + "panesFailed", + "panesSearched", + "scrollbackClamped" + ], + "type": "object" + }, "processReach": "none", + "title": "Search pane contents", "tmuxEffects": [ "observe" ], @@ -26019,70 +25143,281 @@ "name": "select_layout", "wireName": "select_layout", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 551 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 201 }, - "description": "Rearrange a window's panes using a saved tmux layout or a named layout and its unique abbreviation. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Invalid syntax is refused before window lookup. Return the saved layout tmux actually applied. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Rearrange a window's panes. Takes one of tmux's named layouts, or a layout string from an earlier window whose `metadataComplete` is true to reproduce it exactly.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "layout": { - "description": "A saved tmux layout, or a named layout and its unique abbreviation.\n\nThe names are `even-horizontal`, `even-vertical`, `main-horizontal`,\n`main-vertical` and `tiled`. The running daemon determines which names\nand abbreviations are supported; mirrored main layouts require tmux 3.5.", + "description": "One of even-horizontal, even-vertical, main-horizontal, main-vertical, tiled, or a tmux layout string.", "type": "string" }, - "window": { - "description": "The `@`-prefixed window to arrange.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "window", - "layout" + "layout", + "windowId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "layout": { - "description": "The layout it now has, in tmux's own syntax.", - "type": "string" - }, "window": { - "description": "The window that was arranged.", - "type": "string" + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" } }, "required": [ - "window", - "layout" + "window" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Arrange Window Panes" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Rearrange a window's panes. Takes one of tmux's named layouts, or a layout string from an earlier window whose `metadataComplete` is true to reproduce it exactly.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "layout": { + "description": "One of even-horizontal, even-vertical, main-horizontal, main-vertical, tiled, or a tmux layout string.", + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "layout", + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "select_layout", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, "processReach": "none", + "title": "Select layout", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -26093,136 +25428,347 @@ "name": "select_pane", "wireName": "select_pane", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 388 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 151 }, - "description": "Select a pane, making it its window's active pane. Give a direction to move relative to it instead: up, down, left, and right follow the layout, last returns to the previously active pane, and next and previous step through the window in order. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. Moves the cursor of anyone attached to that window.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "SelectPaneDirectionSchema": { - "enum": [ - "up", - "down", - "left", - "right", - "last", - "next", - "previous" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "direction": { - "anyOf": [ - { - "$ref": "#/$defs/SelectPaneDirectionSchema" - }, - { - "type": "null" - } - ], - "description": "Move relative to that pane instead of selecting it.\n\n`up`, `down`, `left`, and `right` follow the layout, so `up` selects\nwhatever pane is drawn above. `last` returns to the previously active\npane, and `next` and `previous` step through the window's panes in\norder. Omit to select the named pane itself." - }, - "pane": { - "description": "The `%`-prefixed pane to select, or to move relative to.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "pane" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", "type": "string" }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", + "cwd": { + "description": "Its current working directory.", "type": "string" }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "pane" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Select Pane" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. Moves the cursor of anyone attached to that window.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "select_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "none", + "title": "Select pane", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -26233,203 +25779,371 @@ "name": "select_window", "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 475 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 173 }, - "description": "Select a window, making it its session's active window. Give a direction to move relative to it instead: next and previous step through the session in index order, and last returns to the previously active window. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "SelectWindowDirectionSchema": { - "enum": [ - "next", - "previous", - "last" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "direction": { - "anyOf": [ - { - "$ref": "#/$defs/SelectWindowDirectionSchema" - }, - { - "type": "null" - } - ], - "description": "Move relative to that window instead of selecting it.\n\n`next` and `previous` step through the session in index order, and\n`last` returns to the previously active window. Omit to select the\nnamed window itself." + "sourceIndex": { + "description": "Source window index. Required when the session has several placements of the id.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "window": { - "description": "The `@`-prefixed window to select, or to move relative to.", + "sourceSession": { + "description": "Source session id or name. Required when the id has several placements.", + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "window" + "windowId" ], "type": "object" }, "outputSchema": { - "$defs": { - "WindowView": { - "description": "One window, as the protocol sees it.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "window": { + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the session's active window.", - "type": "boolean" - }, "id": { - "description": "The `@`-prefixed tmux identity.", + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" }, - "index": { - "description": "The window's index within that session.", - "format": "int32", - "type": "integer" + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" }, - "linked": { - "description": "Whether more than one session links this window.", + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", "type": "boolean" }, "name": { - "description": "The window name.", "type": "string" }, - "panes": { - "description": "How many panes the window holds.", + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, - "session_id": { - "description": "The session this window was reached through.", - "type": "string" + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" } }, "required": [ "id", - "session_id", - "index", + "layout", + "metadataComplete", "name", + "omittedMetadataBytes", "panes", - "active", - "linked" + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" ], "type": "object" } }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "windows": { - "description": "The windows, in tmux's own order.", - "items": { - "$ref": "#/$defs/WindowView" - }, - "type": "array" - } - }, "required": [ - "windows" + "window" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Select Window" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "sourceIndex": { + "description": "Source window index. Required when the session has several placements of the id.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Source session id or name. Required when the id has several placements.", + "type": "string" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "select_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "send_keys", - "wireName": "send_keys", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 356 + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "window": { + "properties": { + "id": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "layout": { + "description": "tmux's layout string; feed it back only when metadataComplete is true.", + "type": "string" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "placements": { + "description": "Retained sessions and indexes where this window is linked.", + "items": { + "properties": { + "active": { + "description": "Whether this placement is current in its session.", + "type": "boolean" + }, + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName", + "active" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "id", + "layout", + "metadataComplete", + "name", + "omittedMetadataBytes", + "panes", + "omittedPlacements", + "placements", + "placementsComplete", + "zoomed" + ], + "type": "object" + } + }, + "required": [ + "window" + ], + "type": "object" + }, + "processReach": "none", + "title": "Select window", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "send_keys", + "wireName": "send_keys", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/input.ts", + "line": 116 }, - "description": "Type text into a pane, press named keys in it, or both. `text` is sent literally, so C-c in it types those three characters. Use `keys` for anything without a character of its own -- C-c to interrupt a running command, Escape, Up, C-d -- which are tmux key names and are interpreted. Text, keys, and optional Enter keep that order in one tmux dispatch. Before input, the configured synchronized-pane cohort is observed; a dead, input-disabled, mode-owned, terminal-attended, or inherited-caller member refuses the whole call, and so does an active run_shell_command, except for keys C-c or C-\\ sent alone, which interrupt it. Returned pane IDs describe configured membership, not confirmed delivery. The observation can race with tmux processing the input. A submitted line is remembered briefly so wait_for_text can discount its own echo; an unrecognized key stops that for the pane's current line rather than mask it inaccurately. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keystrokes to a pane. Use for TUIs, control keys (C-c), and partial lines. For a shell command whose result you want, use run_shell_command — it waits for completion and reports exit status, which this does not.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "enter": { - "default": false, - "description": "Whether to press Enter afterwards.", + "description": "Press Enter afterwards. Default true.", "type": "boolean" }, - "keys": { - "description": "tmux key names to press, in order, after any text.\n\nThese are interpreted rather than typed, which is the only way to send\na key that has no character: `C-c` to interrupt, `Escape`, `Up`,\n`C-d`. Sending `C-c` as `text` would type those three characters.\nOmit to press none.", - "items": { - "type": "string" - }, - "type": [ - "array", - "null" - ] + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" }, - "pane": { - "description": "The `%`-prefixed pane id.", + "keys": { + "description": "Keys to send. tmux key names like C-c work unless literal is true.", "type": "string" }, - "text": { - "description": "Text typed literally into the pane. Key names are not interpreted. Omit\nto type none.", - "type": [ - "string", - "null" - ] + "literal": { + "description": "Send the text as-is, without resolving key names.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" } }, "required": [ - "pane" + "keys", + "paneId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "pane": { - "description": "The pane the caller targeted.", + "attended": { + "description": "A person is watching a configured cohort member.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, - "panes": { - "description": "The effective configured recipient IDs observed before dispatch.\n\nMembership does not confirm delivery and may change after observation.", + "resolvedPaneIds": { + "description": "Configured cohort at the immediate preflight, not a delivery receipt.", "items": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, "type": "array" + }, + "sent": { + "type": "boolean" } }, "required": [ - "pane", - "panes" + "attended", + "paneId", + "resolvedPaneIds", + "sent" ], "type": "object" }, @@ -26437,21 +26151,94 @@ "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Send Keys To Pane" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keystrokes to a pane. Use for TUIs, control keys (C-c), and partial lines. For a shell command whose result you want, use run_shell_command — it waits for completion and reports exit status, which this does not.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enter": { + "description": "Press Enter afterwards. Default true.", + "type": "boolean" + }, + "force": { + "description": "Allow writing to the pane this server itself was called from, which is otherwise refused. It does not override the refusal to write to a pane a person is watching — a pane an attached client has on screen is still refused with force.", + "type": "boolean" + }, + "keys": { + "description": "Keys to send. tmux key names like C-c work unless literal is true.", + "type": "string" + }, + "literal": { + "description": "Send the text as-is, without resolving key names.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "keys", + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "send_keys", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "attended": { + "description": "A person is watching a configured cohort member.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "resolvedPaneIds": { + "description": "Configured cohort at the immediate preflight, not a delivery receipt.", + "items": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "type": "array" + }, + "sent": { + "type": "boolean" + } + }, + "required": [ + "attended", + "paneId", + "resolvedPaneIds", + "sent" + ], + "type": "object" + }, "processReach": "pane-input", + "title": "Send keys", "tmuxEffects": [ + "observe", "change" ], "toolset": "execute" @@ -26462,72 +26249,59 @@ "name": "send_keys_batch", "wireName": "send_keys_batch", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 1078 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 468 }, - "description": "Send an ordered batch of input operations to panes. Each executed row repeats send_keys' effective synchronized-cohort, dead-pane, input-off, pane-mode, attended-client, and inherited-caller preflight, then crosses one tmux dispatch. These observations can race with tmux processing the input. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered batch of pane-input operations, resolving and checking each row's configured cohort immediately before input. Stop or continue on error.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "OnError": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "onError": { + "description": "Whether a failed operation ends the batch. Defaults to stop.", "enum": [ "stop", "continue" ], "type": "string" }, - "SendOperation": { - "additionalProperties": false, - "properties": { - "enter": { - "default": false, - "description": "Whether to press Enter afterwards.", - "type": "boolean" - }, - "keys": { - "description": "tmux key names to press, in order, after any text, such as `C-c`. Omit\nto press none.", - "items": { + "operations": { + "description": "The key sends to run, in order, one pane each.", + "items": { + "properties": { + "enter": { + "description": "Press Enter afterwards. Default true.", + "type": "boolean" + }, + "force": { + "description": "Allow this server's own caller pane, as on `send_keys`.", + "type": "boolean" + }, + "keys": { + "description": "Keys for this pane, as on `send_keys`.", "type": "string" }, - "type": [ - "array", - "null" - ] - }, - "pane": { - "description": "The `%`-prefixed pane id.", - "type": "string" + "literal": { + "description": "Send the text literally rather than resolving key names.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } }, - "text": { - "description": "Text typed literally. Key names are not interpreted. Omit to type\nnone.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "pane" - ], - "type": "object" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "on_error": { - "$ref": "#/$defs/OnError", - "default": "stop", - "description": "`stop`, the default, ends at the first refused row; `continue` sends\nthe rest." - }, - "operations": { - "description": "The rows to send, in order, 1 to 64.", - "items": { - "$ref": "#/$defs/SendOperation" + "required": [ + "keys", + "paneId" + ], + "type": "object" }, + "maxItems": 64, + "minItems": 1, "type": "array" } }, @@ -26537,117 +26311,66 @@ "type": "object" }, "outputSchema": { - "$defs": { - "BatchItem": { - "properties": { - "error": { - "anyOf": [ - { - "$ref": "#/$defs/ErrorData" - }, - { - "type": "null" - } - ] - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "result": true, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "index", - "tool", - "success", - "resultTruncated" - ], - "type": "object" - }, - "ErrorCode": { - "description": "Standard JSON-RPC error codes used throughout the MCP protocol.\n\nThese codes follow the JSON-RPC 2.0 specification and provide\nstandardized error reporting across all MCP implementations.", - "format": "int32", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "completed": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "ErrorData": { - "description": "Error information for JSON-RPC error responses.\n\nThis structure follows the JSON-RPC 2.0 specification for error reporting,\nproviding a standardized way to communicate errors between clients and servers.", - "properties": { - "code": { - "$ref": "#/$defs/ErrorCode", - "description": "The error type that occurred (using standard JSON-RPC error codes)" - }, - "data": { - "description": "Additional information about the error. The value of this member is defined by the\nsender (e.g. detailed error information, nested errors etc.)." + "failures": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "reason": { + "type": "string" + } }, - "message": { - "description": "A short description of the error. The message SHOULD be limited to a concise single sentence.", - "type": "string" - } + "required": [ + "index", + "reason" + ], + "type": "object" }, - "required": [ - "code", - "message" - ], - "type": "object" - }, - "OnError": { - "enum": [ - "stop", - "continue" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "failed": { - "minimum": 0, - "type": "integer" - }, - "onError": { - "$ref": "#/$defs/OnError" + "type": "array" }, - "results": { + "targets": { "items": { - "$ref": "#/$defs/BatchItem" + "additionalProperties": false, + "properties": { + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "resolvedPaneIds": { + "items": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "index", + "resolvedPaneIds" + ], + "type": "object" }, "type": "array" - }, - "stoppedAt": { - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "succeeded": { - "minimum": 0, - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "minimum": 0, - "type": "integer" } }, "required": [ - "results", - "succeeded", - "failed", - "truncated", - "truncatedBytes", - "onError" + "completed", + "failures", + "targets" ], "type": "object" }, @@ -26655,21 +26378,144 @@ "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Send Keys Batch" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered batch of pane-input operations, resolving and checking each row's configured cohort immediately before input. Stop or continue on error.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "onError": { + "description": "Whether a failed operation ends the batch. Defaults to stop.", + "enum": [ + "stop", + "continue" + ], + "type": "string" + }, + "operations": { + "description": "The key sends to run, in order, one pane each.", + "items": { + "properties": { + "enter": { + "description": "Press Enter afterwards. Default true.", + "type": "boolean" + }, + "force": { + "description": "Allow this server's own caller pane, as on `send_keys`.", + "type": "boolean" + }, + "keys": { + "description": "Keys for this pane, as on `send_keys`.", + "type": "string" + }, + "literal": { + "description": "Send the text literally rather than resolving key names.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "keys", + "paneId" + ], + "type": "object" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "send_keys_batch", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "completed": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "failures": { + "items": { + "properties": { + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "index", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "targets": { + "items": { + "properties": { + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "resolvedPaneIds": { + "items": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "index", + "resolvedPaneIds" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "completed", + "failures", + "targets" + ], + "type": "object" + }, "processReach": "pane-input", + "title": "Send keys batch", "tmuxEffects": [ + "observe", "change" ], "toolset": "execute" @@ -26680,81 +26526,103 @@ "name": "set_history_limit", "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 895 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 420 }, - "description": "Set the scrollback history limit for a session or its global default. From tmux 3.7 existing panes take it too, and lowering it discards their scrollback past the new limit. Delete tmux state; accepts no command payload.", + "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit through a bounded integer.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "limit": { - "description": "Lines of scrollback to keep per pane.", + "lines": { + "description": "Scrollback lines each new pane keeps. Applies to panes made after this.", + "maximum": 2000000, "minimum": 0, "type": "integer" - }, - "session": { - "description": "The session to change, by `$`-prefixed id or name. Omit to change the\nglobal default.", - "type": [ - "string", - "null" - ] } }, "required": [ - "limit" + "lines" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "name": { - "type": "string" - }, - "target": { - "type": [ - "string", - "null" - ] - }, - "value": { - "type": "string" + "lines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "name", - "value" + "lines" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Set History Limit" + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit through a bounded integer.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "lines": { + "description": "Scrollback lines each new pane keeps. Applies to panes made after this.", + "maximum": 2000000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "lines" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "set_history_limit", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "lines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "lines" + ], + "type": "object" + }, "processReach": "none", + "title": "Set history limit", "tmuxEffects": [ - "change", - "delete" + "change" ], - "toolset": "teardown" + "toolset": "manage" } } }, @@ -26762,28 +26630,20 @@ "name": "set_mouse_enabled", "wireName": "set_mouse_enabled", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 864 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 404 }, - "description": "Set mouse handling for a session or the global session default. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a closed boolean schema.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "enabled": { - "description": "`true` turns mouse handling on; `false` turns it off.", + "description": "Whether tmux should report mouse events.", "type": "boolean" - }, - "session": { - "description": "The session to change, by `$`-prefixed id or name. Omit to change the\nglobal default.", - "type": [ - "string", - "null" - ] } }, "required": [ @@ -26792,45 +26652,69 @@ "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "name": { - "type": "string" - }, - "target": { - "type": [ - "string", - "null" - ] - }, - "value": { - "type": "string" + "enabled": { + "type": "boolean" } }, "required": [ - "name", - "value" + "enabled" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Set Mouse Enabled" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a closed boolean schema.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enabled": { + "description": "Whether tmux should report mouse events.", + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "set_mouse_enabled", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, "processReach": "none", + "title": "Set mouse enabled", "tmuxEffects": [ "change" ], @@ -26842,118 +26726,361 @@ "name": "set_pane_title", "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 841 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 350 }, - "description": "Set one pane's title. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Give a pane a title. Useful for labelling what an agent put where, since the title shows in list_panes and survives the command changing.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "pane": { - "description": "The `%`-prefixed pane id.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, "title": { - "description": "The new title, stored as given.", - "type": "string" + "description": "The pane's new title.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" } }, "required": [ - "pane", + "paneId", "title" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", "type": "string" }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", + "cwd": { + "description": "Its current working directory.", "type": "string" }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } - ] + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" } }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" + "required": [ + "pane" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + "description": "Change tmux state; no client-supplied executable input. Give a pane a title. Useful for labelling what an agent put where, since the title shows in list_panes and survives the command changing.", + "inputLiteralization": { + "title": "double-hash-once" }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" - } - }, - "required": [ - "id", - "window_id", - "active", - "caller" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Set Pane Title" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "title": "double-hash-once" + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "title": { + "description": "The pane's new title.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "required": [ + "paneId", + "title" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "set_pane_title", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "none", + "title": "Set pane title", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -26964,73 +27091,115 @@ "name": "set_synchronize_panes", "wireName": "set_synchronize_panes", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 1045 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 441 }, - "description": "Set the window default for synchronized pane input. Individual pane overrides still determine the effective configured cohort, so enabling this can amplify what one send_keys call reaches. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Set the window default for synchronized pane input. Pane overrides still determine each effective configured cohort.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "enabled": { - "description": "`true` turns synchronized input on; `false` turns it off.", + "description": "Whether typing into one pane of this window types into all of them.", "type": "boolean" }, - "window": { - "description": "The `@`-prefixed window id.", + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "window", - "enabled" + "enabled", + "windowId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "name": { - "type": "string" - }, - "target": { - "type": [ - "string", - "null" - ] + "enabled": { + "type": "boolean" }, - "value": { + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", "type": "string" } }, "required": [ - "name", - "value" + "enabled", + "windowId" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Set Synchronize Panes" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": true, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the window default for synchronized pane input. Pane overrides still determine each effective configured cohort.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enabled": { + "description": "Whether typing into one pane of this window types into all of them.", + "type": "boolean" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "enabled", + "windowId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "set_synchronize_panes", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "enabled": { + "type": "boolean" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + } + }, + "required": [ + "enabled", + "windowId" + ], + "type": "object" + }, "processReach": "none", + "title": "Set synchronize panes", "tmuxEffects": [ "change" ], @@ -27042,116 +27211,123 @@ "name": "show_environment", "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 510 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/settings.ts", + "line": 199 }, - "description": "List the variables tmux hands to processes it starts, for the server or for one session, and whether each is set or marked for removal. Values are withheld: a tmux server inherits the environment of the shell that started it, tokens and keys included. A value is returned only for a name the operator listed in LIBTMUX_ENVIRONMENT_VALUES at startup, and is then returned in clear. This is not the environment of anything already running: a pane started before a change keeps what it was given. Read the tmux environment; accepts no client-supplied executable input. Values are withheld unless the operator allowed the name.", + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. The environment tmux gives processes it starts, at server or session scope. This is what a new pane will inherit, not what a running one has.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "session": { - "description": "The session whose environment to read, by `$`-prefixed id or name.\n\nOmit for the server's own.", - "type": [ - "string", - "null" - ] + "description": "Session id ($1) or name. Omit for the server environment.", + "type": "string" } }, "type": "object" }, "outputSchema": { - "$defs": { - "EnvironmentEntry": { - "description": "One tmux environment entry.", - "properties": { - "name": { - "description": "The variable name.", - "type": "string" - }, - "state": { - "$ref": "#/$defs/EnvironmentState", - "description": "Whether the name holds a value or is marked for removal." - }, - "value": { - "description": "The value, only for a set variable whose name the operator allowed in\n`LIBTMUX_ENVIRONMENT_VALUES` at startup.", - "type": [ - "string", - "null" - ] - }, - "withheld": { - "description": "True for a set variable whose value was not returned because the\noperator did not allow its name.", - "type": "boolean" - } - }, - "required": [ - "name", - "state", - "withheld" - ], - "type": "object" - }, - "EnvironmentState": { - "description": "What tmux holds under one environment name.", - "oneOf": [ - { - "const": "set", - "description": "tmux holds a value and hands it to processes it starts.", - "type": "string" - }, - { - "const": "removed", - "description": "tmux removes the name from the environment of processes it starts.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "entries": { - "description": "The entries, in tmux's own order.", - "items": { - "$ref": "#/$defs/EnvironmentEntry" + "complete": { + "type": "boolean" + }, + "environment": { + "additionalProperties": { + "type": [ + "string", + "null" + ] }, - "type": "array" + "propertyNames": { + "type": "string" + }, + "type": "object" }, - "session": { - "description": "The session the environment belongs to, or absent for the server's.", - "type": [ - "string", - "null" - ] + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "entries" + "complete", + "environment", + "omittedEntries" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Show tmux Environment" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. The environment tmux gives processes it starts, at server or session scope. This is what a new pane will inherit, not what a running one has.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "description": "Session id ($1) or name. Omit for the server environment.", + "type": "string" + } + }, + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "show_environment", "nestedAuthority": [], "outputClasses": [ "process-environment" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "environment": { + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "complete", + "environment", + "omittedEntries" + ], + "type": "object" + }, "processReach": "none", + "title": "Show environment", "tmuxEffects": [ "observe" ], @@ -27163,90 +27339,131 @@ "name": "show_hooks", "wireName": "show_hooks", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 560 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/settings.ts", + "line": 138 }, - "description": "List the hooks tmux runs when something happens on the server, such as a pane exiting. This tool does not set hooks. Hooks set through another path remain in their server or session until unset; configuration files persist them across server restarts. Reach for this when tmux does something no tool here asked for. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks a server or session runs. Read-only: a hook set here would outlive this process and keep firing in somebody's tmux. Put hooks a server should keep in its config file.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "session": { - "description": "The session whose hooks to read, by `$`-prefixed id or name. Omit for\nthe server's own.", - "type": [ - "string", - "null" - ] + "description": "Session scope; omit for server scope.", + "type": "string" } }, "type": "object" }, "outputSchema": { - "$defs": { - "Hook": { - "description": "One tmux hook.", - "properties": { - "command": { - "description": "The command tmux runs.", - "type": "string" - }, - "index": { - "description": "Its index, when the hook is an array.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "name": { - "description": "The hook name, such as `pane-exited`.", - "type": "string" - } + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "complete": { + "type": "boolean" + }, + "hooks": { + "additionalProperties": { + "type": "string" }, - "required": [ - "name", - "command" - ], - "type": "object" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "hooks": { - "description": "The hooks, in tmux's own order.", - "items": { - "$ref": "#/$defs/Hook" + "propertyNames": { + "type": "string" }, - "type": "array" + "type": "object" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "unset": { + "description": "Hook names tmux defines that carry no command, and so are not listed.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" } }, "required": [ - "hooks" + "complete", + "hooks", + "omittedEntries", + "unset" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Show tmux Hooks" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks a server or session runs. Read-only: a hook set here would outlive this process and keep firing in somebody's tmux. Put hooks a server should keep in its config file.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "session": { + "description": "Session scope; omit for server scope.", + "type": "string" + } + }, + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "show_hooks", "nestedAuthority": [], "outputClasses": [ "configured-command" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "hooks": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "unset": { + "description": "Hook names tmux defines that carry no command, and so are not listed.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "complete", + "hooks", + "omittedEntries", + "unset" + ], + "type": "object" + }, "processReach": "none", + "title": "Show hooks", "tmuxEffects": [ "observe" ], @@ -27258,52 +27475,36 @@ "name": "show_option", "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 457 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/settings.ts", + "line": 105 }, - "description": "Read a tmux option, such as history-limit or a user option like @theme. Name the scope the option lives in; global-session is what tmux uses when a command names no target. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one named tmux option at server, session, window, or pane scope.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "OptionScopeSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "The tmux option to read, such as \"status-left\".", + "type": "string" + }, + "scope": { + "description": "Default server.", "enum": [ "server", - "global-session", - "global-window", "session", + "global-session", "window", + "global-window", "pane" ], "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "name": { - "description": "The option name, such as `history-limit` or a user option like `@theme`.", - "type": "string" - }, - "scope": { - "anyOf": [ - { - "$ref": "#/$defs/OptionScopeSchema" - }, - { - "type": "null" - } - ], - "description": "Which tmux object the option belongs to.\n\nOne of `server`, `global-session`, `global-window`, `session`,\n`window`, or `pane`. Defaults to `global-session`, which is what\nsetting an option without a target means in tmux." }, "target": { - "description": "The `$`, `@` or `%`-prefixed id, for the scopes that need one. Omit\nfor the others.", - "type": [ - "string", - "null" - ] + "description": "Session id/name or pane id, for the matching scope.", + "type": "string" } }, "required": [ @@ -27312,14 +27513,16 @@ "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { "name": { - "description": "The option name.", + "type": "string" + }, + "scope": { "type": "string" }, "value": { - "description": "Its value, absent when it has never been set at that scope.", "type": [ "string", "null" @@ -27327,31 +27530,91 @@ } }, "required": [ - "name" + "name", + "scope", + "value" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": false, - "readOnlyHint": true, - "title": "Read tmux Option" + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one named tmux option at server, session, window, or pane scope.", + "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "description": "The tmux option to read, such as \"status-left\".", + "type": "string" + }, + "scope": { + "description": "Default server.", + "enum": [ + "server", + "session", + "global-session", + "window", + "global-window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Session id/name or pane id, for the matching scope.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "show_option", "nestedAuthority": [], "outputClasses": [ "tmux-metadata", "configured-command" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "name": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "scope", + "value" + ], + "type": "object" + }, "processReach": "none", + "title": "Show option", "tmuxEffects": [ "observe" ], @@ -27363,29 +27626,20 @@ "name": "signal_channel", "wireName": "signal_channel", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/control.rs", - "line": 733 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 386 }, - "description": "Signal a tmux wait-for channel, releasing every current waiter. With no waiter, one signal is latched; signalling the same channel again clears that latch. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "channel": { - "description": "The channel name, which is any string both sides agree on.", + "description": "The tmux wait-for channel to signal.", "type": "string" - }, - "seconds": { - "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", - "minimum": 0, - "type": [ - "integer", - "null" - ] } }, "required": [ @@ -27394,36 +27648,77 @@ "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { "channel": { - "description": "The channel that was signalled.", "type": "string" + }, + "signalled": { + "type": "boolean" } }, "required": [ - "channel" + "channel", + "signalled" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Signal Channel" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "channel": { + "description": "The tmux wait-for channel to signal.", + "type": "string" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "signal_channel", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "channel": { + "type": "string" + }, + "signalled": { + "type": "boolean" + } + }, + "required": [ + "channel", + "signalled" + ], + "type": "object" + }, "processReach": "none", + "title": "Signal channel", "tmuxEffects": [ "change" ], @@ -27435,208 +27730,426 @@ "name": "snapshot_pane", "wireName": "snapshot_pane", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/inspect.rs", - "line": 257 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 305 }, - "description": "Read pane content with cursor position, mode state, and scroll position in one reply. The state query and capture are separate, so the result is not atomic. Prefer this over capture_pane when you need to reason about where the pane is rather than only what it says -- a cursor at column zero on a fresh line is a shell waiting, and a pane in a mode may route keys to tmux instead of the workload. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return bounded terminal content and pane metadata in one MCP response. The metadata and capture come from separate tmux requests and are not an atomic snapshot.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen.", - "type": "boolean" - }, - "max_lines": { - "description": "The most content lines to return, oldest dropped first.\n\nDefaults to the whole visible screen. The end of a pane is what says\nwhat just happened, so a limit keeps the end.", - "minimum": 0, - "type": [ - "integer", - "null" - ] + "maxLines": { + "description": "Keep at most this many lines, from the end. Defaults to the server limit.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" }, - "pane": { - "description": "The `%`-prefixed pane id.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "pane" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "PaneView": { - "description": "One pane, as the protocol sees it.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "content": { + "type": "string" + }, + "cursorX": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "cursorY": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "droppedLines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "inMode": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "pane": { + "additionalProperties": false, "properties": { "active": { - "description": "Whether this is the window's active pane.", + "description": "Whether this is its window's active pane.", "type": "boolean" }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, "id": { - "description": "The `%`-prefixed tmux identity.", + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", "type": "string" }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "window_id": { - "description": "The window that contains the pane.", + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } }, "required": [ - "id", - "window_id", "active", - "caller" + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" ], "type": "object" }, - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", - "type": "string" - }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", - "type": "string" - }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "content": { - "description": "What the pane is showing.", - "type": "string" - }, - "cursor_x": { - "description": "Where the cursor sits, counting from the left.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "cursor_y": { - "description": "Where the cursor sits, counting from the top.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "dead": { - "description": "Whether the process in it has ended.", - "type": "boolean" - }, - "dropped": { - "description": "How many older lines were dropped to honour `max_lines`.", - "minimum": 0, - "type": "integer" - }, - "height": { - "description": "How tall it is, in rows.", - "minimum": 0, - "type": "integer" - }, - "in_mode": { - "description": "Whether the pane is in a mode, where keys navigate rather than type.", - "type": "boolean" - }, - "lines": { - "description": "How many lines of it are reported.", - "minimum": 0, - "type": "integer" - }, - "mode": { - "description": "Which mode, when it is in one.", - "type": [ - "string", - "null" - ] - }, - "pane": { - "$ref": "#/$defs/PaneView", - "description": "The pane itself." - }, - "scroll_position": { - "description": "How far it is scrolled back, when it is in copy mode.", - "format": "int32", - "type": [ - "integer", - "null" - ] - }, - "width": { - "description": "How wide it is, in columns.", - "minimum": 0, + "scrollPosition": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" } }, "required": [ - "pane", - "width", - "height", - "in_mode", - "dead", "content", - "lines", - "dropped" + "cursorX", + "cursorY", + "droppedLines", + "inMode", + "pane", + "scrollPosition" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, + "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": true, - "title": "Snapshot Pane State" + "readOnlyHint": false }, "meta": { - "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return bounded terminal content and pane metadata in one MCP response. The metadata and capture come from separate tmux requests and are not an atomic snapshot.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "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" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "snapshot_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata", "terminal-content" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "content": { + "type": "string" + }, + "cursorX": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "cursorY": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "droppedLines": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "inMode": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + }, + "scrollPosition": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "content", + "cursorX", + "cursorY", + "droppedLines", + "inMode", + "pane", + "scrollPosition" + ], + "type": "object" + }, "processReach": "none", + "title": "Snapshot pane", "tmuxEffects": [ "observe" ], @@ -27648,17 +28161,19 @@ "name": "split_window", "wireName": "split_window", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 964 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/lifecycle.ts", + "line": 190 }, - "description": "Split a window and start the configured process with no command payload. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the new one. Direction is where the new pane goes relative to the one you split.", "schemaStatus": "runtime", "inputSchema": { - "$defs": { - "SplitDirectionSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "direction": { + "description": "Default below.", "enum": [ "above", "below", @@ -27666,132 +28181,359 @@ "right" ], "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "direction": { - "anyOf": [ - { - "$ref": "#/$defs/SplitDirectionSchema" - }, - { - "type": "null" - } - ], - "description": "Where the new pane goes relative to `pane`. Defaults to `below`." }, - "pane": { - "description": "The `%`-prefixed pane to split.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, - "percent": { - "description": "The new pane's share of the split, 1 to 100. Defaults to half.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "start_directory": { - "description": "The new pane's working directory. Omit for the directory this MCP\nserver started in, not `pane`'s current directory.", - "type": [ - "string", - "null" - ] + "startDirectory": { + "description": "Defaults to the directory the pane being split is in.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" } }, "required": [ - "pane" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", "type": "string" }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", + "cwd": { + "description": "Its current working directory.", "type": "string" }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { "type": "string" } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "active": { - "description": "Whether this is the window's active pane.", - "type": "boolean" - }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] - }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "pane" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, - "title": "Split Window" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the new one. Direction is where the new pane goes relative to the one you split.", "inputLiteralization": { - "start_directory": "double-hash-once" + "startDirectory": "double-hash-once" + }, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "direction": { + "description": "Default below.", + "enum": [ + "above", + "below", + "left", + "right" + ], + "type": "string" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "startDirectory": { + "description": "Defaults to the directory the pane being split is in.", + "type": "string", + "x-libtmux-tmux-format": "literalized-once" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "split_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "pane": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, "processReach": "configured-process", + "title": "Split window", "tmuxEffects": [ + "observe", "change" ], "toolset": "execute" @@ -27802,201 +28544,500 @@ "name": "swap_pane", "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/contract.rs", - "line": 817 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/layout.ts", + "line": 230 }, - "description": "Swap the positions of two panes. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Exchange two panes' positions. Their ids and contents travel with them.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "source_pane": { - "description": "The `%`-prefixed pane id to move; the result describes it.", + "otherPaneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" }, - "target_pane": { - "description": "The `%`-prefixed pane id it trades places with.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", "type": "string" } }, "required": [ - "source_pane", - "target_pane" + "otherPaneId", + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "Relation": { - "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", - "oneOf": [ - { - "const": "unknown", - "description": "This process is not running inside tmux, so no pane is its own.", - "type": "string" - }, - { - "const": "self", - "description": "Confirmed: the same tmux server, and the same pane.", - "type": "string" - }, - { - "const": "other", - "description": "Some other pane, or a pane this crate cannot prove is the caller's.", - "type": "string" - } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { - "active": { - "description": "Whether this is the window's active pane.", + "complete": { "type": "boolean" }, - "caller": { - "$ref": "#/$defs/Relation", - "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." - }, - "command": { - "description": "The command currently running.", - "type": [ - "string", - "null" - ] - }, - "id": { - "description": "The `%`-prefixed tmux identity.", - "type": "string" - }, - "path": { - "description": "The pane's working directory.", - "type": [ - "string", - "null" - ] + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "window_id": { - "description": "The window that contains the pane.", - "type": "string" + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "additionalProperties": false, + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "id", - "window_id", - "active", - "caller" + "complete", + "omittedEntries", + "panes" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Swap Panes" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Exchange two panes' positions. Their ids and contents travel with them.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "otherPaneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + } + }, + "required": [ + "otherPaneId", + "paneId" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "swap_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "wait_for_channel", - "wireName": "wait_for_channel", - "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/observe.rs", - "line": 490 - }, - "description": "Block until something signals a tmux wait-for channel. A pending signal is consumed. Pair this with a shell command that ends in `tmux wait-for -S ` to synchronise with work this server did not start. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "channel": { - "description": "The channel name, which is any string both sides agree on.", - "type": "string" - }, - "seconds": { - "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - } - }, - "required": [ + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "complete": { + "type": "boolean" + }, + "omittedEntries": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "panes": { + "items": { + "properties": { + "active": { + "description": "Whether this is its window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command tmux reports running in it.", + "type": "string" + }, + "cwd": { + "description": "Its current working directory.", + "type": "string" + }, + "dead": { + "description": "Whether its process exited and remain-on-exit kept it.", + "type": "boolean" + }, + "height": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "id": { + "description": "Stable pane id. Prefer this for entity-scoped targeting.", + "pattern": "^%\\d+$", + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "isAttended": { + "description": "A person is currently looking at this pane.", + "type": "boolean" + }, + "isCallerPane": { + "description": "This is the pane this MCP server runs in.", + "type": "boolean" + }, + "metadataComplete": { + "description": "Whether every projected metadata string is complete.", + "type": "boolean" + }, + "omittedMetadataBytes": { + "description": "UTF-8 bytes omitted from projected metadata strings.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "omittedPlacements": { + "description": "Later placements omitted.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "placements": { + "description": "Retained session and window indexes through which this pane is reachable.", + "items": { + "properties": { + "index": { + "description": "The window index in this session.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "sessionId": { + "description": "Stable session id, e.g. $1.", + "pattern": "^\\$\\d+$", + "type": "string" + }, + "sessionName": { + "type": "string" + } + }, + "required": [ + "index", + "sessionId", + "sessionName" + ], + "type": "object" + }, + "type": "array" + }, + "placementsComplete": { + "description": "Whether placements contains every placement.", + "type": "boolean" + }, + "title": { + "type": "string" + }, + "width": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "windowId": { + "description": "Stable window id, e.g. @1.", + "pattern": "^@\\d+$", + "type": "string" + }, + "windowName": { + "type": "string" + } + }, + "required": [ + "active", + "command", + "cwd", + "dead", + "height", + "id", + "index", + "isAttended", + "isCallerPane", + "metadataComplete", + "omittedMetadataBytes", + "omittedPlacements", + "placements", + "placementsComplete", + "title", + "width", + "windowId", + "windowName" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "complete", + "omittedEntries", + "panes" + ], + "type": "object" + }, + "processReach": "none", + "title": "Swap panes", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "wait_for_channel", + "wireName": "wait_for_channel", + "source": { + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/target.ts", + "line": 358 + }, + "description": "Change tmux state; no client-supplied executable input. Wait until a tmux wait-for channel is signalled.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "channel": { + "description": "The tmux wait-for channel name.", + "type": "string" + }, + "timeoutMs": { + "description": "Give up after this long. Defaults to the server's wait ceiling.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ "channel" ], "type": "object" }, "outputSchema": { - "$defs": { - "ChannelWaitOutcomeSchema": { - "enum": [ - "signalled", - "deadline" - ], - "type": "string" - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, "properties": { "channel": { - "description": "The channel that was waited on.", "type": "string" }, - "outcome": { - "$ref": "#/$defs/ChannelWaitOutcomeSchema", - "description": "`signalled` or `deadline`." + "signalled": { + "type": "boolean" } }, "required": [ "channel", - "outcome" + "signalled" ], "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false, - "title": "Wait For Channel" + "openWorldHint": true, + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Wait until a tmux wait-for channel is signalled.", "inputLiteralization": {}, + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "channel": { + "description": "The tmux wait-for channel name.", + "type": "string" + }, + "timeoutMs": { + "description": "Give up after this long. Defaults to the server's wait ceiling.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "wait_for_channel", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "channel": { + "type": "string" + }, + "signalled": { + "type": "boolean" + } + }, + "required": [ + "channel", + "signalled" + ], + "type": "object" + }, "processReach": "none", + "title": "Wait for channel", "tmuxEffects": [ "change" ], @@ -28008,580 +29049,1421 @@ "name": "wait_for_text", "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "file": "crates/tmux-mcp/src/tools/observe.rs", - "line": 344 + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", + "file": "packages/mcp/src/tools/wait.ts", + "line": 503 }, - "description": "Wait until a pane writes matching text. Reads the pane's live output stream, so text that scrolls past between checks is still seen. The returned text is that raw stream, not the rendered screen: a line redrawn in place repeats; capture_pane shows the screen. Prefer run_shell_command for commands you are sending yourself: it reports an exit status instead of guessing from output. Use this for output you did not author, such as a server logging that it is ready. A line this server itself types and submits -- with send_keys, paste_text, or run_shell_command's own dispatch -- is discounted from a match for a short time afterward, so waiting for text you just sent does not match its own echo; output that happens to repeat the same words still does. A submitted line that wrapped across terminal rows when it was typed is not discounted. A pattern still on the row being typed into, not yet submitted, reports outcome pending instead of matched, and one already on a completed row before this call attached reports present_at_entry. Waiting owns an observer client until the wait ends. Each list accepts at most 32 patterns, each at most 4,096 bytes, using Rust's linear-time regex engine. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something, streaming tmux's notifications rather than polling. Use for output you did NOT author — another process, a person, a background job. For a command you wrote, use run_shell_command: it knows when the command ended and reports exit status, which no text match can. This discounts text this server itself typed into the pane, for as long as it is unsubmitted or was submitted within the last ten seconds, so a command you just sent cannot match its own echo — but a pane not yet reading input can still echo type-ahead back once it starts, so wait for a prompt before typing into a cold shell. Whatever happens you get back what the pane printed and why the wait ended — a timeout is never an empty answer.", "schemaStatus": "runtime", "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, + "$schema": "http://json-schema.org/draft-07/schema#", "properties": { - "match_case": { - "default": false, - "description": "Match case. Off by default.", - "type": "boolean" + "cursor": { + "description": "Start from a cursor an earlier capture_since or wait returned.", + "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", + "type": "string" }, - "pane": { - "description": "The `%`-prefixed pane to watch.", + "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" }, "patterns": { - "description": "Text that ends the wait successfully. Omit to wait for any output.", + "description": "Any one of these ends the wait. Omit to wait for any output at all.", "items": { + "minLength": 1, "type": "string" }, - "maxItems": 32, - "type": [ - "array", - "null" - ] + "maxItems": 64, + "type": "array" }, "regex": { - "default": false, - "description": "Read both lists as regular expressions rather than literal text.", + "description": "Interpret patterns using libtmux's bounded regular-expression grammar.", "type": "boolean" }, - "seconds": { - "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "stop": { - "description": "Text that ends the wait as a failure, reported as `stopped`. Omit for\nnone.\n\nGive the failure markers you already know — `error:`, `Traceback` — and\na failed run returns at once instead of at the deadline.", - "items": { - "type": "string" - }, - "maxItems": 32, - "type": [ - "array", - "null" - ] + "timeoutMs": { + "description": "Clamped by the server ceiling; the result reports what was used.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" } }, "required": [ - "pane" + "paneId" ], "type": "object" }, "outputSchema": { - "$defs": { - "WaitOutcome": { - "description": "How a wait for text finished.", - "oneOf": [ - { - "const": "present_at_entry", - "description": "A wanted pattern was already in the pane's output before this began\nwatching, on a row above the one still being typed into, and is not\na line this server itself submitted moments earlier.\n\nA wait only sees what a pane writes after it starts, so this is never\nfolded into [`Self::Matched`]: the same pattern printed moments\nearlier -- an earlier command's own output, say -- can already be\nsitting there, and a caller that treated that as a fresh match would\nact on something that happened before this call, not because of it.\nA line this server typed and submitted with `send_keys` is discounted\nrather than reported here or as [`Self::Matched`], for a short time\nafter it was submitted.", - "type": "string" - }, - { - "const": "pending", - "description": "A wanted pattern's only occurrence is the row still being typed\ninto: text this server (or a person sharing the pane) sent and has\nnot submitted, not anything that has run.\n\nSubmit it, then wait again: the next wait sees the command's own\noutput on a row above a new one still being typed into, which is\n[`Self::PresentAtEntry`] or [`Self::Matched`] depending on when it\narrived, never this -- and never the submitted line's own echo,\nwhich stays discounted for a short time after.", - "type": "string" - }, - { - "const": "matched", - "description": "A pattern matched, in output that arrived after the wait attached.", - "type": "string" - }, - { - "const": "stopped", - "description": "A stop pattern matched, so the wait ended early.", - "type": "string" - }, - { - "const": "deadline", - "description": "The time the caller allowed ran out.", - "type": "string" - }, + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "alreadyOnScreen": { + "description": "The pattern is on the pane now but printed before this wait began, so the wait could not match it. Read it with capture_pane rather than waiting again.", + "type": "boolean" + }, + "cursor": { + "anyOf": [ { - "const": "pane_closed", - "description": "The pane stopped writing for good.", + "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", "type": "string" }, { - "const": "cancelled", - "description": "The client withdrew the request while the wait was still running.", - "type": "string" + "type": "null" } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "properties": { - "bytes": { - "description": "How many bytes arrived, before filtering or truncation.", - "minimum": 0, + ], + "description": "Pass to capture_since or another wait; null means the live stream cannot be resumed." + }, + "droppedLines": { + "description": "Output lines omitted by the result limit.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, "type": "integer" }, - "matched_index": { - "description": "Which pattern matched, indexed into the list it came from.", - "minimum": 0, - "type": [ - "integer", - "null" - ] + "effectiveTimeoutMs": { + "description": "The timeout actually enforced, after clamping.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" }, - "matched_pattern": { - "description": "The pattern that matched, as it was given.", + "matched": { + "description": "The text that matched, or null.", "type": [ "string", "null" ] }, + "missedBytes": { + "description": "Retained output lost before this read; non-zero means the result is incomplete.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "omittedBytes": { + "description": "Output bytes omitted by the result ceiling.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, "outcome": { - "$ref": "#/$defs/WaitOutcome", - "description": "How the wait finished." + "description": "Why the wait ended. Read this rather than guessing from the output.", + "enum": [ + "matched", + "timed_out", + "pane_died", + "no_stream", + "cancelled", + "output_lost", + "stream_lost" + ], + "type": "string" }, - "pane": { - "description": "The pane that was watched.", + "output": { + "description": "The bounded tail of what the pane printed while waiting.", "type": "string" }, - "text": { - "description": "What the pane wrote, with escape sequences removed.\n\nThis is the raw output stream, not the rendered screen: a line redrawn\nin place, such as a line editor's echo, repeats. `capture_pane` shows\nthe screen.", + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "returnedBytes": { + "description": "UTF-8 bytes returned across output and screen.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "screen": { + "description": "What the pane shows now after a miss, unless result limits omit it; see screenClamped.", "type": "string" + }, + "screenClamped": { + "description": "Whether result limits shortened the pane screen.", + "type": "boolean" + }, + "streamFailure": { + "anyOf": [ + { + "enum": [ + "connection_lost", + "events_dropped", + "expired", + "hub_closed", + "topology_changed" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Why the live stream ended, or null while it remained valid." } }, "required": [ - "pane", + "alreadyOnScreen", + "cursor", + "droppedLines", + "effectiveTimeoutMs", + "matched", + "missedBytes", + "omittedBytes", "outcome", - "text", - "bytes" + "output", + "paneId", + "returnedBytes", + "screen", + "screenClamped", + "streamFailure" ], "type": "object" }, "annotations": { - "destructiveHint": false, - "idempotentHint": true, + "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": true, - "title": "Wait For Pane Text" + "readOnlyHint": false }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something, streaming tmux's notifications rather than polling. Use for output you did NOT author — another process, a person, a background job. For a command you wrote, use run_shell_command: it knows when the command ended and reports exit status, which no text match can. This discounts text this server itself typed into the pane, for as long as it is unsubmitted or was submitted within the last ten seconds, so a command you just sent cannot match its own echo — but a pane not yet reading input can still echo type-ahead back once it starts, so wait for a prompt before typing into a cold shell. Whatever happens you get back what the pane printed and why the wait ended — a timeout is never an empty answer.", "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" + "inputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "cursor": { + "description": "Start from a cursor an earlier capture_since or wait returned.", + "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" + }, + "patterns": { + "description": "Any one of these ends the wait. Omit to wait for any output at all.", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 64, + "type": "array" + }, + "regex": { + "description": "Interpret patterns using libtmux's bounded regular-expression grammar.", + "type": "boolean" + }, + "timeoutMs": { + "description": "Clamped by the server ceiling; the result reports what was used.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "wait_for_text", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "terminal-content" + ], + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "alreadyOnScreen": { + "description": "The pattern is on the pane now but printed before this wait began, so the wait could not match it. Read it with capture_pane rather than waiting again.", + "type": "boolean" + }, + "cursor": { + "anyOf": [ + { + "pattern": "^ltxc1\\.[0-9a-f]{32}\\.(?:0|[1-9][0-9]*)$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Pass to capture_since or another wait; null means the live stream cannot be resumed." + }, + "droppedLines": { + "description": "Output lines omitted by the result limit.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "effectiveTimeoutMs": { + "description": "The timeout actually enforced, after clamping.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "matched": { + "description": "The text that matched, or null.", + "type": [ + "string", + "null" + ] + }, + "missedBytes": { + "description": "Retained output lost before this read; non-zero means the result is incomplete.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "omittedBytes": { + "description": "Output bytes omitted by the result ceiling.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "outcome": { + "description": "Why the wait ended. Read this rather than guessing from the output.", + "enum": [ + "matched", + "timed_out", + "pane_died", + "no_stream", + "cancelled", + "output_lost", + "stream_lost" + ], + "type": "string" + }, + "output": { + "description": "The bounded tail of what the pane printed while waiting.", + "type": "string" + }, + "paneId": { + "description": "Stable pane id, e.g. %1.", + "pattern": "^%\\d+$", + "type": "string" + }, + "returnedBytes": { + "description": "UTF-8 bytes returned across output and screen.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "screen": { + "description": "What the pane shows now after a miss, unless result limits omit it; see screenClamped.", + "type": "string" + }, + "screenClamped": { + "description": "Whether result limits shortened the pane screen.", + "type": "boolean" + }, + "streamFailure": { + "anyOf": [ + { + "enum": [ + "connection_lost", + "events_dropped", + "expired", + "hub_closed", + "topology_changed" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Why the live stream ended, or null while it remained valid." + } + }, + "required": [ + "alreadyOnScreen", + "cursor", + "droppedLines", + "effectiveTimeoutMs", + "matched", + "missedBytes", + "omittedBytes", + "outcome", + "output", + "paneId", + "returnedBytes", + "screen", + "screenClamped", + "streamFailure" + ], + "type": "object" + }, + "processReach": "none", + "title": "Wait for output", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" } } } ], "wirePrefix": "", "selectable": true, - "source": "crates/tmux-mcp/src/tools", - "repo": "libtmux/libtmux-rs", - "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", - "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "source": "packages/mcp/src", + "repo": "libtmux/libtmux-ts", + "revision": "46cccfef2a546de55ce8b308249b8c76339089a0", + "extractedRevision": "ecc3eaca0b4e05a77360da9d56790b409282c63b", "selection": { "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" }, "protocol": { "capabilities": { - "resources": {}, - "tools": {} + "resources": { + "listChanged": true + }, + "tools": { + "listChanged": true + } }, "prompts": [], "protocolVersion": "2025-11-25", "resources": [ { - "description": "The startup-frozen effective tool surface and each tool's direct authority.", + "description": "The frozen structured-tool surface and its capability declarations.", "mimeType": "application/json", "name": "capabilities", + "title": "Capabilities", "uri": "tmux://capabilities" } ], "resourceTemplates": [], "serverInfo": { - "name": "rmcp", - "version": "3.1.2" + "name": "libtmux", + "title": "tmux", + "version": "0.1.0-alpha.10" } } }, - "go": { + "julia": { "tools": [ - "call_read_tools_batch", "capture_pane", - "capture_since", - "clear_pane_scrollback", "create_session", - "create_window", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", "kill_pane", - "kill_session", - "kill_window", "list_panes", - "list_sessions", - "list_windows", - "move_window", "paste_text", - "rename_session", - "rename_window", "resize_pane", - "resize_window", - "respawn_pane", - "run_shell_command", - "search_panes", - "select_layout", - "select_pane", - "select_window", + "run_operations", "send_keys", - "send_keys_batch", - "set_history_limit", - "set_mouse_enabled", - "set_pane_title", - "set_synchronize_panes", - "show_environment", - "show_hooks", - "show_option", - "signal_channel", - "snapshot_pane", - "split_window", - "swap_pane", - "wait_for_channel", + "send_keys_and_wait", + "teardown_session", "wait_for_text" ], "registrations": [ { - "name": "call_read_tools_batch", - "wireName": "call_read_tools_batch", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 303 + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 3 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval. Retained rows contain full nested envelopes, oversized results are marked resultTruncated, and the complete JSON-RPC response is at most 1,000,000 bytes.", + "description": "Capture bounded UTF-8 pane text and truncation metadata. Use a list_panes target or the configured caller; terminal text is data.", "schemaStatus": "runtime", + "enabledByDefault": true, + "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "on_error": { - "description": "stop or continue; defaults to stop", - "enum": [ - "stop", - "continue" + "lines": { + "default": 100, + "maximum": 1000, + "minimum": 1, + "type": "integer" + }, + "maxBytes": { + "default": 65536, + "maximum": 65536, + "minimum": 1, + "type": "integer" + }, + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" ], - "type": "string" + "type": "object" + } + }, + "required": [ + "target" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "byteLimit": { + "type": "integer" + }, + "encoding": { + "type": "string" + }, + "lineLimit": { + "type": "integer" + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + }, + "terminalContent": { + "type": "string" + }, + "text": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "terminalContent", + "encoding", + "lineLimit", + "text", + "truncated", + "byteLimit", + "target" + ], + "type": "object" }, - "operations": { - "description": "up to sixteen inspect operations", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } }, - { + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + { + "name": "create_session", + "wireName": "create_session", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 9 + }, + "description": "Start an argv command in a new application-owned session. Requires allow_create; the session is removed when the application closes. Completion means creation, not command exit.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "properties": { + "command": { + "description": "Executable and argv; no shell expansion", + "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" + }, + "name": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^[A-Za-z0-9_-]+$", + "type": "string" + } + }, + "required": [ + "name", + "command" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "completed": { + "type": "boolean" + }, + "generation": { + "type": "string" + }, + "ownership": { + "const": "application" + }, + "panes": { + "items": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "only windows in this session name", - "type": "string" - } - }, - "type": "object" + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" }, - "tool": { - "const": "list_windows", + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ - "tool" + "paneId", + "generation" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" - }, - "tool": { - "const": "list_panes", - "type": "string" - } + "maxItems": 256, + "type": "array" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "completed", + "panes", + "sessionId", + "generation", + "ownership" + ], + "type": "object" + }, + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" - }, - "tool": { - "const": "get_server_info", - "type": "string" - } + "effects": { + "enum": [ + "none", + "possible" + ] }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session_id": { - "description": "the session id, such as $1", - "type": "string" - } - }, - "required": [ - "session_id" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } + "message": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "retryable": { + "type": "boolean" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "type": "string" - } + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + { + "name": "kill_pane", + "wireName": "kill_pane", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 7 + }, + "description": "Destroy one explicitly authorized pane and its running process. Its window or session may also disappear.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "properties": { + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + } + }, + "required": [ + "target" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "completed": { + "type": "boolean" + }, + "generationGuarantee": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "tool": { - "const": "get_pane_info", - "type": "string" - } + "required": [ + "paneId", + "generation" + ], + "type": "object" + } + }, + "required": [ + "completed", + "generationGuarantee", + "target" + ], + "type": "object" + }, + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" }, - "required": [ - "tool" - ], - "type": "object" + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } }, - { + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + { + "name": "list_panes", + "wireName": "list_panes", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 2 + }, + "description": "List unique physical panes with generation-bound targets, linked session/window context and caller markers. Terminal fields are data. Pagination observes a fresh graph.", + "schemaStatus": "runtime", + "enabledByDefault": true, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "properties": { + "limit": { + "default": 32, + "maximum": 128, + "minimum": 1, + "type": "integer" + }, + "offset": { + "default": 0, + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "coverage": { + "type": "string" + }, + "generationGuarantee": { + "type": "string" + }, + "nextOffset": { + "type": [ + "integer", + "null" + ] + }, + "panes": { + "items": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" - }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" + "active": { + "type": "boolean" + }, + "caller": { + "type": "boolean" + }, + "command": { + "type": [ + "string", + "null" + ] + }, + "contexts": { + "items": { + "additionalProperties": false, + "properties": { + "sessionId": { + "type": "string" + }, + "sessionName": { + "type": "string" + }, + "windowId": { + "type": "string" + }, + "windowIndex": { + "type": "integer" + }, + "windowName": { + "type": "string" + } }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } + "required": [ + "sessionId", + "sessionName", + "windowId", + "windowName", + "windowIndex" + ], + "type": "object" }, - "required": [ - "pane_id" - ], - "type": "object" + "maxItems": 8, + "type": "array" }, - "tool": { - "const": "capture_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { + "contextsTruncated": { + "type": "boolean" + }, + "dead": { + "type": "boolean" + }, + "fieldsTruncated": { + "type": "boolean" + }, + "height": { + "type": "integer" + }, + "target": { "additionalProperties": false, "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, "type": "string" }, - "max_lines": { - "description": "maximum new lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ - "pane_id" + "paneId", + "generation" ], "type": "object" }, - "tool": { - "const": "capture_since", + "title": { "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" - }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" }, - "tool": { - "const": "snapshot_pane", - "type": "string" + "width": { + "type": "integer" } }, "required": [ - "tool" + "target", + "active", + "dead", + "command", + "title", + "width", + "height", + "caller", + "contexts", + "contextsTruncated", + "fieldsTruncated" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "max_lines": { - "description": "maximum matching panes to return", - "maximum": 200, - "type": "integer" - }, - "max_matches_per_pane": { - "description": "maximum matching lines per pane", - "maximum": 200, - "type": "integer" - }, - "pattern": { - "description": "bounded text or regular expression to search for", - "maxLength": 4096, - "type": "string" - }, - "regex": { - "description": "treat pattern as a regular expression", - "type": "boolean" - } - }, - "required": [ - "pattern" - ], + "maxItems": 128, + "type": "array" + }, + "terminalContent": { + "type": "string" + }, + "total": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "terminalContent", + "nextOffset", + "generationGuarantee", + "panes", + "total", + "truncated", + "coverage" + ], + "type": "object" + }, + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true + } + }, + { + "name": "paste_text", + "wireName": "paste_text", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 5 + }, + "description": "Paste UTF-8 text through a temporary owned buffer without adding Enter. The terminal application may transform input.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "properties": { + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + }, + "text": { + "description": "Valid UTF-8; at most 65536 bytes", + "maxLength": 65536, + "type": "string" + } + }, + "required": [ + "target", + "text" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "completed": { + "type": "boolean" + }, + "generationGuarantee": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + } + }, + "required": [ + "completed", + "generationGuarantee", + "target" + ], + "type": "object" + }, + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + } + }, + { + "name": "resize_pane", + "wireName": "resize_pane", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 6 + }, + "description": "Request pane width or height in cells. tmux may constrain the resulting size to fit its window.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "width" + ] + }, + { + "required": [ + "height" + ] + } + ], + "properties": { + "height": { + "maximum": 10000, + "minimum": 1, + "type": "integer" + }, + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + }, + "width": { + "maximum": 10000, + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "target" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "completed": { + "type": "boolean" + }, + "generationGuarantee": { + "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + } + }, + "required": [ + "completed", + "generationGuarantee", + "target" + ], + "type": "object" + }, + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": false + } + }, + { + "name": "run_operations", + "wireName": "run_operations", + "source": { + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 8 + }, + "description": "Run up to eight enabled tool calls sequentially after validating every item. Stop at the first execution failure and return ordered completed results plus a one-based failedIndex; no rollback.", + "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", + "inputSchema": { + "additionalProperties": false, + "properties": { + "operations": { + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "limit": { + "default": 32, + "maximum": 128, + "minimum": 1, + "type": "integer" + }, + "offset": { + "default": 0, + "maximum": 1000000, + "minimum": 0, + "type": "integer" + } + }, + "required": [], "type": "object" }, "tool": { - "const": "search_panes", - "type": "string" + "const": "list_panes" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" }, @@ -28591,34 +30473,53 @@ "arguments": { "additionalProperties": false, "properties": { - "position": { - "description": "top-left, top-right, bottom-left, or bottom-right", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" + "lines": { + "default": 100, + "maximum": 1000, + "minimum": 1, + "type": "integer" }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" + "maxBytes": { + "default": 65536, + "maximum": 65536, + "minimum": 1, + "type": "integer" + }, + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" } }, "required": [ - "window_id", - "position" + "target" ], "type": "object" }, "tool": { - "const": "find_pane_by_position", - "type": "string" + "const": "capture_pane" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" }, @@ -28628,29 +30529,56 @@ "arguments": { "additionalProperties": false, "properties": { - "names": { - "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", + "keys": { "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, "type": "string" }, - "type": [ - "null", - "array" - ] + "maxItems": 64, + "minItems": 1, + "type": "array" + }, + "literal": { + "default": false, + "type": "boolean" + }, + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" } }, "required": [ - "names" + "target", + "keys" ], "type": "object" }, "tool": { - "const": "get_tmux_variables", - "type": "string" + "const": "send_keys" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" }, @@ -28660,43 +30588,47 @@ "arguments": { "additionalProperties": false, "properties": { - "effective": { - "description": "include an inherited value", - "type": "boolean" - }, - "name": { - "description": "the exact option name", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" ], - "type": "string" + "type": "object" }, - "target": { - "description": "the target required by session, window, and pane scopes", + "text": { + "description": "Valid UTF-8; at most 65536 bytes", + "maxLength": 65536, "type": "string" } }, "required": [ - "name" + "target", + "text" ], "type": "object" }, "tool": { - "const": "show_option", - "type": "string" + "const": "paste_text" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" }, @@ -28705,21 +30637,64 @@ "properties": { "arguments": { "additionalProperties": false, + "anyOf": [ + { + "required": [ + "width" + ] + }, + { + "required": [ + "height" + ] + } + ], "properties": { - "session": { - "description": "a session name; omit for the only session", - "type": "string" + "height": { + "maximum": 10000, + "minimum": 1, + "type": "integer" + }, + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + }, + "width": { + "maximum": 10000, + "minimum": 1, + "type": "integer" } }, + "required": [ + "target" + ], "type": "object" }, "tool": { - "const": "show_environment", - "type": "string" + "const": "resize_pane" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" }, @@ -28729,2144 +30704,1947 @@ "arguments": { "additionalProperties": false, "properties": { - "name": { - "description": "one hook name; omit to read all hooks in the scope", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" } }, + "required": [ + "target" + ], "type": "object" }, "tool": { - "const": "show_hooks", - "type": "string" + "const": "kill_pane" } }, "required": [ - "tool" + "tool", + "arguments" ], "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": [ - "null", - "array" - ] - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "failed": { - "type": "integer" - }, - "onError": { - "type": "string" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": [ - "null", - "string" - ] - }, - "index": { - "type": "integer" - }, - "result": true, - "resultTruncated": { - "type": "boolean" }, - "success": { - "type": "boolean" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "index", - "tool", - "success", - "error", - "result", - "resultTruncated" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "stoppedAt": { - "type": [ - "null", - "integer" - ] - }, - "succeeded": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - } - }, - "required": [ - "results", - "onError", - "succeeded", - "failed", - "stoppedAt", - "truncated", - "truncatedBytes" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Call read tools in a batch" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval. Retained rows contain full nested envelopes, oversized results are marked resultTruncated, and the complete JSON-RPC response is at most 1,000,000 bytes.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "on_error": { - "description": "stop or continue; defaults to stop", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "up to sixteen inspect operations", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { + { + "additionalProperties": false, + "properties": { + "arguments": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "only windows in this session name", - "type": "string" - } + "command": { + "description": "Executable and argv; no shell expansion", + "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "type": "string" }, - "type": "object" + "maxItems": 32, + "minItems": 1, + "type": "array" }, - "tool": { - "const": "list_windows", + "name": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^[A-Za-z0-9_-]+$", "type": "string" } }, "required": [ - "tool" + "name", + "command" ], "type": "object" }, - { + "tool": { + "const": "create_session" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" - }, - "tool": { - "const": "list_panes", + "generation": { + "description": "Valid UTF-8; at most 128 bytes", + "maxLength": 128, "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "type": "object" }, - "tool": { - "const": "get_server_info", + "sessionId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, "type": "string" } }, "required": [ - "tool" + "sessionId", + "generation" ], "type": "object" }, - { + "tool": { + "const": "teardown_session" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { "additionalProperties": false, "properties": { - "arguments": { + "target": { "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "session_id": { - "description": "the session id, such as $1", + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, "type": "string" - } - }, - "required": [ - "session_id" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "window_id": { - "description": "the window id, such as @1", + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ - "window_id" + "paneId", + "generation" ], "type": "object" }, - "tool": { - "const": "get_window_info", + "text": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "minLength": 1, "type": "string" } }, "required": [ - "tool" + "target", + "text" ], "type": "object" }, - { + "tool": { + "const": "wait_for_text" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } + "keys": { + "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "type": "string" }, - "required": [ - "pane_id" - ], - "type": "object" + "maxItems": 64, + "minItems": 1, + "type": "array" }, - "tool": { - "const": "get_pane_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { + "literal": { + "default": false, + "type": "boolean" + }, + "target": { "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" - }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" }, - "pane_id": { - "description": "the pane id, such as %1", + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ - "pane_id" + "paneId", + "generation" ], "type": "object" }, - "tool": { - "const": "capture_pane", + "text": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "minLength": 1, "type": "string" } }, "required": [ - "tool" + "target", + "keys", + "text" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", - "type": "string" - }, - "max_lines": { - "description": "maximum new lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" - }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "tool": { - "const": "snapshot_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "max_lines": { - "description": "maximum matching panes to return", - "maximum": 200, - "type": "integer" - }, - "max_matches_per_pane": { - "description": "maximum matching lines per pane", - "maximum": 200, - "type": "integer" - }, - "pattern": { - "description": "bounded text or regular expression to search for", - "maxLength": 4096, - "type": "string" - }, - "regex": { - "description": "treat pattern as a regular expression", - "type": "boolean" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "tool": { - "const": "search_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "position": { - "description": "top-left, top-right, bottom-left, or bottom-right", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id", - "position" - ], - "type": "object" - }, - "tool": { - "const": "find_pane_by_position", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "names": { - "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "effective": { - "description": "include an inherited value", - "type": "boolean" - }, - "name": { - "description": "the exact option name", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "tool": { - "const": "show_option", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "a session name; omit for the only session", - "type": "string" - } - }, - "type": "object" - }, - "tool": { - "const": "show_environment", - "type": "string" - } - }, - "required": [ - "tool" - ], + "tool": { + "const": "send_keys_and_wait" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + } + ] + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "outputSchema": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "atomic": { + "const": false + }, + "completed": { + "items": { + "additionalProperties": false, + "properties": { + "result": { "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "one hook name; omit to read all hooks in the scope", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" - } - }, - "type": "object" - }, - "tool": { - "const": "show_hooks", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" + "tool": { + "type": "string" } - ] + }, + "required": [ + "tool", + "result" + ], + "type": "object" }, - "maxItems": 16, - "minItems": 1, - "type": [ - "null", - "array" - ] + "maxItems": 8, + "type": "array" + }, + "failedIndex": { + "type": "null" } }, "required": [ - "operations" + "failedIndex", + "completed", + "atomic" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "call_read_tools_batch", - "nestedAuthority": [ - "list_sessions", - "list_windows", - "list_panes", - "get_server_info", - "get_session_info", - "get_window_info", - "get_pane_info", - "capture_pane", - "capture_since", - "snapshot_pane", - "search_panes", - "find_pane_by_position", - "get_tmux_variables", - "show_option", - "show_environment", - "show_hooks" - ], - "outputClasses": [ - "tmux-metadata", - "terminal-content", - "process-environment", - "configured-command" - ], - "outputSchema": { + { "additionalProperties": false, "properties": { - "failed": { - "type": "integer" - }, - "onError": { - "type": "string" + "atomic": { + "const": false }, - "results": { + "completed": { "items": { "additionalProperties": false, "properties": { - "error": { - "type": [ - "null", - "string" - ] - }, - "index": { - "type": "integer" - }, - "result": true, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" + "result": { + "type": "object" }, "tool": { "type": "string" } }, "required": [ - "index", "tool", - "success", - "error", - "result", - "resultTruncated" + "result" ], "type": "object" }, - "type": [ - "array" - ] - }, - "stoppedAt": { - "type": [ - "null", - "integer" - ] - }, - "succeeded": { - "type": "integer" + "maxItems": 8, + "type": "array" }, - "truncated": { - "type": "boolean" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" }, - "truncatedBytes": { + "failedIndex": { + "maximum": 8, + "minimum": 1, "type": "integer" } }, "required": [ - "results", - "onError", - "succeeded", - "failed", - "stoppedAt", - "truncated", - "truncatedBytes" + "failedIndex", + "completed", + "atomic", + "error" ], "type": "object" }, - "processReach": "none", - "title": "Call read tools in a batch", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_pane", - "wireName": "capture_pane", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 191 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns bounded pane content and a cursor.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" - }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "lines": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "paneId": { - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" - } - }, - "required": [ - "paneId", - "truncated" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Capture a pane" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns bounded pane content and a cursor.", - "inputLiteralization": {}, - "inputSchema": { + { "additionalProperties": false, "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" + "atomic": { + "const": false }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" + "completed": { + "items": { + "additionalProperties": false, + "properties": { + "completed": { + "const": true + }, + "resultOmitted": { + "const": true + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "completed", + "resultOmitted" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "const": "result_limit" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + }, + "failedIndex": { + "type": "null" } }, "required": [ - "pane_id" + "completed", + "atomic", + "error", + "failedIndex" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_pane", - "nestedAuthority": null, - "outputClasses": [ - "terminal-content", - "tmux-metadata" - ], - "outputSchema": { + { "additionalProperties": false, "properties": { - "lines": { + "atomic": { + "const": false + }, + "completed": { "items": { - "type": "string" + "additionalProperties": false, + "properties": { + "completed": { + "const": true + }, + "resultOmitted": { + "const": true + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "completed", + "resultOmitted" + ], + "type": "object" }, - "type": [ - "array" - ] - }, - "paneId": { - "type": "string" + "maxItems": 8, + "type": "array" }, - "truncated": { - "type": "boolean" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "const": "result_limit" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" }, - "truncatedBytes": { + "failedIndex": { + "maximum": 8, + "minimum": 1, "type": "integer" }, - "truncatedLines": { - "type": "integer" + "originalError": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" } }, "required": [ - "paneId", - "truncated" + "completed", + "atomic", + "error", + "failedIndex", + "originalError" ], "type": "object" }, - "processReach": "none", - "title": "Capture a pane", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } + { + "properties": { + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false } }, { - "name": "capture_since", - "wireName": "capture_since", + "name": "send_keys", + "wireName": "send_keys", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 199 + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 4 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane output produced after a cursor.", + "description": "Send explicit key tokens or literal text to one captured target. No Enter is added; use a separate Enter token when intended.", "schemaStatus": "runtime", + "enabledByDefault": true, + "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", - "type": "string" - }, - "max_lines": { - "description": "maximum new lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "type": "string" - }, - "lines": { + "keys": { "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, "type": "string" }, - "type": [ - "array" - ] - }, - "linesMissed": { - "type": "boolean" - }, - "paneId": { - "type": "string" + "maxItems": 64, + "minItems": 1, + "type": "array" }, - "truncated": { + "literal": { + "default": false, "type": "boolean" }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" } }, "required": [ - "paneId", - "cursor", - "lines", - "linesMissed", - "truncated" + "target", + "keys" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Capture new pane output" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane output produced after a cursor.", - "inputLiteralization": {}, - "inputSchema": { + "outputSchema": { + "anyOf": [ + { "additionalProperties": false, "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", - "type": "string" - }, - "max_lines": { - "description": "maximum new lines, keeping the newest", - "type": "integer" + "completed": { + "type": "boolean" }, - "pane_id": { - "description": "the pane id, such as %1", + "generationGuarantee": { "type": "string" + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" } }, "required": [ - "pane_id" + "completed", + "generationGuarantee", + "target" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_since", - "nestedAuthority": null, - "outputClasses": [ - "terminal-content", - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, + { "properties": { - "cursor": { - "type": "string" - }, - "lines": { - "items": { - "type": "string" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } }, - "type": [ - "array" - ] - }, - "linesMissed": { - "type": "boolean" - }, - "paneId": { - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" } }, "required": [ - "paneId", - "cursor", - "lines", - "linesMissed", - "truncated" + "error" ], "type": "object" - }, - "processReach": "none", - "title": "Capture new pane output", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false } }, { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", + "name": "send_keys_and_wait", + "wireName": "send_keys_and_wait", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 565 + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 12 }, - "description": "Delete tmux state; accepts no command payload. Deletes retained scrollback from one pane.", + "description": "Register output before sending explicit keys, then wait for literal text in output observed since registration. No Enter is added. Concurrent output may also match; this is not command-exit proof.", "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Clear pane scrollback" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Deletes retained scrollback from one pane.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } + "keys": { + "items": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "type": "string" }, - "required": [ - "pane_id" - ], - "type": "object" + "maxItems": 64, + "minItems": 1, + "type": "array" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "clear_pane_scrollback", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { + "literal": { + "default": false, + "type": "boolean" + }, + "target": { "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "pane_id": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ - "pane_id" + "paneId", + "generation" ], "type": "object" }, - "processReach": "none", - "title": "Clear pane scrollback", - "tmuxEffects": [ - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "create_session", - "wireName": "create_session", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 435 - }, - "description": "Start a pane's configured process; accepts no command payload. Creates a detached session whose first pane runs the configured process.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "description": "initial height; supply with width", - "type": "integer" - }, - "session_name": { - "description": "a literal session name", - "type": "string" - }, - "start_directory": { - "description": "an absolute literal start directory", - "type": "string" - }, - "width": { - "description": "initial width; supply with height", - "type": "integer" - }, - "window_name": { - "description": "a literal first-window name", - "type": "string" - } - }, - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "sessionId": { - "type": "string" - }, - "sessionName": { + "text": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "minLength": 1, "type": "string" } }, "required": [ - "sessionId", - "sessionName" + "target", + "keys", + "text" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Create a session" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Creates a detached session whose first pane runs the configured process.", - "inputLiteralization": { - "session_name": "double-hash-once", - "start_directory": "double-hash-once", - "window_name": "double-hash-once" - }, - "inputSchema": { + "outputSchema": { + "anyOf": [ + { "additionalProperties": false, "properties": { - "height": { - "description": "initial height; supply with width", - "type": "integer" + "continuity": { + "const": "reset" }, - "session_name": { - "description": "a literal session name", - "type": "string" + "evidence": { + "const": "literal_text" }, - "start_directory": { - "description": "an absolute literal start directory", + "generationGuarantee": { "type": "string" }, - "width": { - "description": "initial width; supply with height", - "type": "integer" + "keysSent": { + "type": "boolean" }, - "window_name": { - "description": "a literal first-window name", + "matched": { + "type": "boolean" + }, + "source": { + "enum": [ + "baseline", + "output" + ] + }, + "target": { + "additionalProperties": false, + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" + ], + "type": "object" + }, + "terminalContent": { + "const": "data" + }, + "text": { "type": "string" } }, + "required": [ + "matched", + "source", + "terminalContent", + "evidence", + "continuity", + "text", + "generationGuarantee", + "keysSent", + "target" + ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "create_session", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, + { "properties": { - "sessionId": { - "type": "string" - }, - "sessionName": { - "type": "string" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" } }, "required": [ - "sessionId", - "sessionName" + "error" ], "type": "object" - }, - "processReach": "configured-process", - "title": "Create a session", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false } }, { - "name": "create_window", - "wireName": "create_window", + "name": "teardown_session", + "wireName": "teardown_session", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 452 + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 10 }, - "description": "Start a pane's configured process; accepts no command payload. Creates a window whose first pane runs the configured process.", + "description": "Destroy an exact generation-bound session created by this application. Borrowed sessions are refused.", "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "attach": { - "description": "make the new window active", - "type": "boolean" - }, - "direction": { - "description": "before or after", - "enum": [ - "before", - "after" - ], - "type": "string" - }, - "session_id": { - "description": "the session id, such as $1", - "type": "string" - }, - "start_directory": { - "description": "an absolute literal start directory", + "generation": { + "description": "Valid UTF-8; at most 128 bytes", + "maxLength": 128, "type": "string" }, - "window_name": { - "description": "a literal window name", + "sessionId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, "type": "string" } }, "required": [ - "session_id" + "sessionId", + "generation" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId", - "paneId" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Create a window" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Creates a window whose first pane runs the configured process.", - "inputLiteralization": { - "start_directory": "double-hash-once", - "window_name": "double-hash-once" - }, - "inputSchema": { + "anyOf": [ + { "additionalProperties": false, "properties": { - "attach": { - "description": "make the new window active", + "completed": { "type": "boolean" }, - "direction": { - "description": "before or after", - "enum": [ - "before", - "after" - ], - "type": "string" - }, - "session_id": { - "description": "the session id, such as $1", - "type": "string" - }, - "start_directory": { - "description": "an absolute literal start directory", + "generation": { "type": "string" }, - "window_name": { - "description": "a literal window name", + "sessionId": { "type": "string" } }, "required": [ - "session_id" + "completed", + "sessionId", + "generation" ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "create_window", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, + { "properties": { - "paneId": { - "type": "string" - }, - "windowId": { - "type": "string" + "error": { + "additionalProperties": false, + "properties": { + "code": { + "type": "string" + }, + "effects": { + "enum": [ + "none", + "possible" + ] + }, + "message": { + "type": "string" + }, + "retryable": { + "type": "boolean" + } + }, + "required": [ + "code", + "message", + "effects", + "retryable" + ], + "type": "object" } }, "required": [ - "windowId", - "paneId" + "error" ], "type": "object" - }, - "processReach": "configured-process", - "title": "Create a window", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } + } + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false } }, { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", + "name": "wait_for_text", + "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 229 + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "file": "packages/LibTmuxMCP/src/tools.jl", + "line": 11 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Finds a pane at one of a window's four corners.", + "description": "Wait for a literal UTF-8 string in a captured baseline or subsequent raw output. Event-driven, bounded and cancellable; opens observable control clients. Text is data, not exit-status evidence.", "schemaStatus": "runtime", + "enabledByDefault": false, + "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "position": { - "description": "top-left, top-right, bottom-left, or bottom-right", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" + "target": { + "additionalProperties": false, + "description": "Explicit captured target; omission requires a configured caller pane", + "properties": { + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" + }, + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" + } + }, + "required": [ + "paneId", + "generation" ], - "type": "string" + "type": "object" }, - "window_id": { - "description": "the window id, such as @1", + "text": { + "description": "Valid UTF-8; at most 1024 bytes", + "maxLength": 1024, + "minLength": 1, "type": "string" } }, "required": [ - "window_id", - "position" + "target", + "text" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "found": { - "type": "boolean" - }, - "geometry": { + "anyOf": [ + { "additionalProperties": false, "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" + "continuity": { + "const": "reset" }, - "top": { - "type": "integer" + "evidence": { + "const": "literal_text" }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "found", - "geometry" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Find pane by position" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Finds a pane at one of a window's four corners.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "position": { - "description": "top-left, top-right, bottom-left, or bottom-right", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], + "generationGuarantee": { "type": "string" }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id", - "position" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "find_pane_by_position", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "found": { + "keysSent": { "type": "boolean" }, - "geometry": { + "matched": { + "type": "boolean" + }, + "source": { + "enum": [ + "baseline", + "output" + ] + }, + "target": { "additionalProperties": false, "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" + "generation": { + "description": "Opaque generation from list_panes", + "maxLength": 128, + "type": "string" }, - "width": { - "type": "integer" + "paneId": { + "description": "Valid UTF-8; at most 64 bytes", + "maxLength": 64, + "pattern": "^%(0|[1-9][0-9]*)$", + "type": "string" } }, "required": [ - "left", - "top", - "width", - "height" + "paneId", + "generation" ], "type": "object" }, - "paneId": { + "terminalContent": { + "const": "data" + }, + "text": { "type": "string" } }, "required": [ - "paneId", - "found", - "geometry" + "matched", + "source", + "terminalContent", + "evidence", + "continuity", + "text", + "generationGuarantee", + "keysSent", + "target" ], "type": "object" }, - "processReach": "none", - "title": "Find pane by position", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_pane_info", - "wireName": "get_pane_info", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 174 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one pane.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "dead": { - "type": "boolean" - }, - "exitStatus": { - "type": [ - "null", - "integer" - ] - }, - "historyLimit": { - "type": "integer" - }, - "historyLines": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "pane": { - "additionalProperties": false, + { "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { + "error": { "additionalProperties": false, "properties": { - "height": { - "type": "integer" + "code": { + "type": "string" }, - "left": { - "type": "integer" + "effects": { + "enum": [ + "none", + "possible" + ] }, - "top": { - "type": "integer" + "message": { + "type": "string" }, - "width": { - "type": "integer" + "retryable": { + "type": "boolean" } }, "required": [ - "left", - "top", - "width", - "height" + "code", + "message", + "effects", + "retryable" ], "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" } }, "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" + "error" ], "type": "object" - }, - "path": { - "type": "string" - }, - "pid": { - "type": "integer" - }, - "title": { - "type": "string" - }, - "zoomed": { - "type": "boolean" } - }, - "required": [ - "pane", - "title", - "path", - "pid", - "dead", - "zoomed", - "inMode", - "historyLines", - "historyLimit" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": false, "openWorldHint": true, - "title": "Get pane info" + "readOnlyHint": true + } + } + ], + "wirePrefix": "", + "selectable": false, + "source": "packages/LibTmuxMCP/src", + "repo": "libtmux/libtmux-julia", + "revision": "f3da513be1225d36d5854cd8db5972c01857578e", + "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "selection": { + "mode": "explicit CLI options", + "tools": "all registered tools via repeated --tool", + "allowCreate": "--allow-create" + }, + "protocol": { + "capabilities": { + "tools": { + "listChanged": false + } + }, + "prompts": [], + "protocolVersion": "2025-11-25", + "resources": [], + "resourceTemplates": [], + "serverInfo": { + "name": "libtmux", + "version": "0.1.0-alpha.1" + } + } + }, + "rs": { + "tools": [ + "call_read_tools_batch", + "capture_pane", + "capture_since", + "clear_pane_scrollback", + "create_session", + "create_window", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "kill_pane", + "kill_session", + "kill_window", + "list_panes", + "list_sessions", + "list_windows", + "move_window", + "paste_text", + "rename_session", + "rename_window", + "resize_pane", + "resize_window", + "respawn_pane", + "run_shell_command", + "search_panes", + "select_layout", + "select_pane", + "select_window", + "send_keys", + "send_keys_batch", + "set_history_limit", + "set_mouse_enabled", + "set_pane_title", + "set_synchronize_panes", + "show_environment", + "show_hooks", + "show_option", + "signal_channel", + "snapshot_pane", + "split_window", + "swap_pane", + "wait_for_channel", + "wait_for_text" + ], + "registrations": [ + { + "name": "call_read_tools_batch", + "wireName": "call_read_tools_batch", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 1145 }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one pane.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" + "description": "Call a serial batch of at most sixteen enabled inspect tools. One approval for this batch covers every enabled nested name; inner tools do not receive separate client approval. The complete JSON-RPC response line, including its request ID and newline, is capped at 1,000,000 bytes; truncated payloads and omitted bytes are explicit. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "schemaStatus": "runtime", + "inputSchema": { + "$defs": { + "OnError": { + "enum": [ + "stop", + "continue" ], - "type": "object" + "type": "string" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "on_error": { + "$ref": "#/$defs/OnError", + "default": "stop", + "description": "`stop`, the default, ends at the first failed call; `continue` makes\nthe rest." }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "get_pane_info", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "dead": { - "type": "boolean" - }, - "exitStatus": { - "type": [ - "null", - "integer" - ] - }, - "historyLimit": { - "type": "integer" - }, - "historyLines": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" + "operations": { + "description": "The inspect calls to make, in order.", + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "end": { + "description": "End at this line. Omit for the bottom of the screen.", + "format": "int32", + "type": [ + "integer", + "null" + ] + }, + "history": { + "default": false, + "description": "Read the whole history rather than the visible screen.", + "type": "boolean" + }, + "last_command": { + "default": false, + "description": "Return only the last command's output, when the shell marks its\nprompts.\n\nAnswers far less than the history, because it starts where the last\ncommand's output began. When the pane's shell does not mark its\nprompts -- fish does, bash and zsh do not -- this reports\n`marks: \"absent\"` and returns the visible screen instead.", + "type": "boolean" + }, + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" + }, + "start": { + "description": "Start at this line. Zero is the top of the screen, negative is\nscrollback. Omit for the top of the screen, or of the scrollback with\n`history`.", + "format": "int32", + "type": [ + "integer", + "null" + ] + } }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" + "required": [ + "pane" + ], + "type": "object" + }, + "tool": { + "const": "capture_pane", + "type": "string" + } }, - "isCaller": { - "type": [ - "null", - "boolean" - ] + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "cursor": { + "description": "The cursor from the previous call. Omit to start watching.", + "type": [ + "string", + "null" + ] + }, + "pane": { + "description": "The `%`-prefixed pane to read.", + "type": "string" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "tool": { + "const": "capture_since", + "type": "string" + } }, - "session": { - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "corner": { + "description": "`top-left`, `top-right`, `bottom-left`, or `bottom-right`.", + "type": "string" + }, + "window": { + "description": "The `@`-prefixed window id.", + "type": "string" + } + }, + "required": [ + "window", + "corner" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "type": "string" + } }, - "window": { - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "pane": { + "description": "The `%`-prefixed pane id, as `list_panes` reports it.", + "type": "string" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "tool": { + "const": "get_pane_info", + "type": "string" + } }, - "windowId": { - "type": "string" - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, - "path": { - "type": "string" - }, - "pid": { - "type": "integer" - }, - "title": { - "type": "string" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "pane", - "title", - "path", - "pid", - "dead", - "zoomed", - "inMode", - "historyLines", - "historyLimit" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get pane info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_server_info", - "wireName": "get_server_info", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 151 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Reports whether the pinned server exists and its version.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "alive": { - "type": "boolean" - }, - "attachedClients": { - "items": { - "additionalProperties": false, - "properties": { - "controlMode": { - "type": "boolean" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": {}, + "type": "object" + }, + "tool": { + "const": "get_server_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "name": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "session": { + "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "session": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "names": { + "description": "tmux format variable names, such as `pane_current_path`.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" + }, + "pane": { + "description": "The `%`-prefixed pane to read them against. Omit to let tmux pick\nits current pane.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "tty": { - "type": "string" - } - }, - "required": [ - "name", - "controlMode" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "callerPaneId": { - "type": "string" - }, - "clients": { - "type": "integer" - }, - "insideThisServer": { - "type": "boolean" - }, - "messages": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "messagesUnavailable": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "sessions": { - "type": "integer" - }, - "socketPath": { - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" - }, - "version": { - "type": "string" - }, - "windows": { - "type": "integer" - } - }, - "required": [ - "socketPath", - "version", - "alive", - "sessions", - "windows", - "panes", - "clients", - "attachedClients", - "insideThisServer", - "truncated" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Get server info" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Reports whether the pinned server exists and its version.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "get_server_info", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "alive": { - "type": "boolean" - }, - "attachedClients": { - "items": { + { "additionalProperties": false, "properties": { - "controlMode": { - "type": "boolean" + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "window": { + "description": "The `@`-prefixed window id, as `list_windows` reports it.", + "type": "string" + } + }, + "required": [ + "window" + ], + "type": "object" }, - "name": { + "tool": { + "const": "get_window_info", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": {}, + "type": "object" }, - "session": { + "tool": { + "const": "list_panes", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": {}, + "type": "object" }, - "tty": { + "tool": { + "const": "list_sessions", "type": "string" } }, "required": [ - "name", - "controlMode" + "tool" ], "type": "object" }, - "type": [ - "array" - ] - }, - "callerPaneId": { - "type": "string" - }, - "clients": { - "type": "integer" - }, - "insideThisServer": { - "type": "boolean" - }, - "messages": { - "items": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": {}, + "type": "object" + }, + "tool": { + "const": "list_windows", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "type": [ - "array" - ] - }, - "messagesUnavailable": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "sessions": { - "type": "integer" - }, - "socketPath": { - "type": "string" - }, - "truncated": { - "type": "boolean" + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "history": { + "default": false, + "description": "Search scrollback as well as the visible screen.", + "type": "boolean" + }, + "match_case": { + "default": false, + "description": "Match case. Off by default.", + "type": "boolean" + }, + "pattern": { + "description": "The text to look for.", + "maxLength": 4096, + "type": "string" + }, + "regex": { + "default": false, + "description": "Read the pattern as a regular expression rather than literal text.", + "type": "boolean" + }, + "session": { + "description": "Only search panes in this session, by `$`-prefixed id or name. Omit\nfor every session.", + "type": [ + "string", + "null" + ] + }, + "window": { + "description": "Only search panes in this window, by `@`-prefixed id. Omit for every\nwindow.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "session": { + "description": "The session whose environment to read, by `$`-prefixed id or name.\n\nOmit for the server's own.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "show_environment", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "session": { + "description": "The session whose hooks to read, by `$`-prefixed id or name. Omit for\nthe server's own.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "show_hooks", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "name": { + "description": "The option name, such as `history-limit` or a user option like `@theme`.", + "type": "string" + }, + "scope": { + "anyOf": [ + { + "enum": [ + "server", + "global-session", + "global-window", + "session", + "window", + "pane" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Which tmux object the option belongs to.\n\nOne of `server`, `global-session`, `global-window`, `session`,\n`window`, or `pane`. Defaults to `global-session`, which is what\nsetting an option without a target means in tmux." + }, + "target": { + "description": "The `$`, `@` or `%`-prefixed id, for the scopes that need one. Omit\nfor the others.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "description": "That tool's arguments.", + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen.", + "type": "boolean" + }, + "max_lines": { + "description": "The most content lines to return, oldest dropped first.\n\nDefaults to the whole visible screen. The end of a pane is what says\nwhat just happened, so a limit keeps the end.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "outputSchema": { + "$defs": { + "BatchItem": { + "properties": { + "error": { + "anyOf": [ + { + "$ref": "#/$defs/ErrorData" + }, + { + "type": "null" + } + ] }, - "truncatedBytes": { + "index": { + "minimum": 0, "type": "integer" }, - "truncatedLines": { - "type": "integer" + "result": true, + "resultTruncated": { + "type": "boolean" }, - "version": { + "success": { + "type": "boolean" + }, + "tool": { "type": "string" + } + }, + "required": [ + "index", + "tool", + "success", + "resultTruncated" + ], + "type": "object" + }, + "ErrorCode": { + "description": "Standard JSON-RPC error codes used throughout the MCP protocol.\n\nThese codes follow the JSON-RPC 2.0 specification and provide\nstandardized error reporting across all MCP implementations.", + "format": "int32", + "type": "integer" + }, + "ErrorData": { + "description": "Error information for JSON-RPC error responses.\n\nThis structure follows the JSON-RPC 2.0 specification for error reporting,\nproviding a standardized way to communicate errors between clients and servers.", + "properties": { + "code": { + "$ref": "#/$defs/ErrorCode", + "description": "The error type that occurred (using standard JSON-RPC error codes)" }, - "windows": { - "type": "integer" + "data": { + "description": "Additional information about the error. The value of this member is defined by the\nsender (e.g. detailed error information, nested errors etc.)." + }, + "message": { + "description": "A short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" } }, "required": [ - "socketPath", - "version", - "alive", - "sessions", - "windows", - "panes", - "clients", - "attachedClients", - "insideThisServer", - "truncated" + "code", + "message" ], "type": "object" }, + "OnError": { + "enum": [ + "stop", + "continue" + ], + "type": "string" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "failed": { + "minimum": 0, + "type": "integer" + }, + "onError": { + "$ref": "#/$defs/OnError" + }, + "results": { + "items": { + "$ref": "#/$defs/BatchItem" + }, + "type": "array" + }, + "stoppedAt": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "succeeded": { + "minimum": 0, + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "results", + "succeeded", + "failed", + "truncated", + "truncatedBytes", + "onError" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Call Read Tools Batch" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [ + "capture_pane", + "capture_since", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "list_panes", + "list_sessions", + "list_windows", + "search_panes", + "show_environment", + "show_hooks", + "show_option", + "snapshot_pane" + ], + "outputClasses": [ + "tmux-metadata", + "terminal-content", + "process-environment", + "configured-command" + ], "processReach": "none", - "title": "Get server info", "tmuxEffects": [ "observe" ], @@ -30875,234 +32653,132 @@ } }, { - "name": "get_session_info", - "wireName": "get_session_info", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 158 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 196 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one session.", + "description": "Read a pane's contents. Reads the visible screen by default; set history to reach output that has scrolled off, or give a start and end line. Set last_command to get only what the last command printed, which is usually what you want and is far shorter -- it needs tmux 3.7 and a shell that marks its prompts, and says so when it cannot. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "session_id": { - "description": "the session id, such as $1", + "end": { + "description": "End at this line. Omit for the bottom of the screen.", + "format": "int32", + "type": [ + "integer", + "null" + ] + }, + "history": { + "default": false, + "description": "Read the whole history rather than the visible screen.", + "type": "boolean" + }, + "last_command": { + "default": false, + "description": "Return only the last command's output, when the shell marks its\nprompts.\n\nAnswers far less than the history, because it starts where the last\ncommand's output began. When the pane's shell does not mark its\nprompts -- fish does, bash and zsh do not -- this reports\n`marks: \"absent\"` and returns the visible screen instead.", + "type": "boolean" + }, + "pane": { + "description": "The `%`-prefixed pane id.", "type": "string" + }, + "start": { + "description": "Start at this line. Zero is the top of the screen, negative is\nscrollback. Omit for the top of the screen, or of the scrollback with\n`history`.", + "format": "int32", + "type": [ + "integer", + "null" + ] } }, "required": [ - "session_id" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "activeWindowId": { - "type": "string" - }, - "created": { - "type": "string" - }, - "path": { - "type": "string" - }, - "session": { - "additionalProperties": false, - "properties": { - "attached": { - "type": "integer" + "$defs": { + "Marks": { + "description": "Whether tmux knew where the last command's output began.\n\nReported rather than inferred: an answer that fell back to the whole\nscreen looks exactly like a command that printed a great deal.", + "oneOf": [ + { + "const": "present", + "description": "The prompt marks were there, so the text is one command's output.", + "type": "string" }, - "id": { + { + "const": "absent", + "description": "tmux has the marks but this pane has none, because its shell does not\nemit OSC 133. fish does; bash and zsh need shell integration. The\nvisible screen came back instead -- not the history, which would\nanswer a request for one command with everything the pane ever wrote.", "type": "string" }, - "name": { + { + "const": "unsupported", + "description": "This tmux predates `capture-pane -F`, which arrived in 3.7. The\nvisible screen came back instead.", "type": "string" }, - "windows": { - "type": "integer" + { + "const": "not_asked", + "description": "The caller did not ask for the last command, so nothing was looked up.", + "type": "string" } - }, - "required": [ - "id", - "name", - "windows", - "attached" - ], - "type": "object" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" - }, - "type": [ - "array" ] } }, - "required": [ - "session", - "path", - "created", - "activeWindowId", - "windows" + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "lines": { + "description": "How many lines that is.", + "minimum": 0, + "type": "integer" + }, + "marks": { + "$ref": "#/$defs/Marks", + "description": "Whether the text is one command's output, and why it is not." + }, + "pane": { + "description": "The pane that was read.", + "type": "string" + }, + "text": { + "description": "The text, with lines separated by newlines.", + "type": "string" + } + }, + "required": [ + "pane", + "text", + "lines", + "marks" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": true, "openWorldHint": true, - "title": "Get session info" + "readOnlyHint": true, + "title": "Read Pane Contents" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one session.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session_id": { - "description": "the session id, such as $1", - "type": "string" - } - }, - "required": [ - "session_id" - ], - "type": "object" - }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "get_session_info", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "activeWindowId": { - "type": "string" - }, - "created": { - "type": "string" - }, - "path": { - "type": "string" - }, - "session": { - "additionalProperties": false, - "properties": { - "attached": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "windows": { - "type": "integer" - } - }, - "required": [ - "id", - "name", - "windows", - "attached" - ], - "type": "object" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" - }, - "type": [ - "array" - ] - } - }, - "required": [ - "session", - "path", - "created", - "activeWindowId", - "windows" - ], - "type": "object" - }, "processReach": "none", - "title": "Get session info", "tmuxEffects": [ "observe" ], @@ -31111,113 +32787,95 @@ } }, { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", + "name": "capture_since", + "wireName": "capture_since", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 251 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/observe.rs", + "line": 434 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads a capped list of validated tmux variable names, not free-form formats.", + "description": "Read what a pane wrote since the previous call. The first call, with no cursor, starts watching and returns a cursor; later calls pass it back and receive only what is new, as the raw output stream, not the rendered screen: a line redrawn in place repeats; capture_pane shows the screen. Use this to follow a pane over several turns without re-reading the whole screen. The answer says missed=true if the cursor no longer names retained output, including when the pane outran the buffer, its live tail was evicted, or the server restarted. Starting a tail owns a retained observer until the tail is evicted or the server stops. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "names": { - "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", - "items": { - "type": "string" - }, + "cursor": { + "description": "The cursor from the previous call. Omit to start watching.", "type": [ - "null", - "array" + "string", + "null" ] + }, + "pane": { + "description": "The `%`-prefixed pane to read.", + "type": "string" } }, "required": [ - "names" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "values": { - "additionalProperties": { - "type": "string" - }, - "type": "object" + "closed": { + "description": "Whether the pane has stopped writing for good.", + "type": "boolean" + }, + "cursor": { + "description": "The cursor to pass back next time.", + "type": "string" + }, + "first": { + "description": "Whether this is the first answer, which reports the visible screen\nrather than what is new.", + "type": "boolean" + }, + "missed": { + "description": "Whether output between the previous cursor and this text was lost.", + "type": "boolean" + }, + "pane": { + "description": "The pane that was read.", + "type": "string" + }, + "text": { + "description": "The text, with escape sequences removed.\n\nAfter the first answer this is the raw output stream, not the rendered\nscreen: a line redrawn in place repeats. `capture_pane` shows the\nscreen.", + "type": "string" } }, "required": [ - "values" + "pane", + "text", + "cursor", + "missed", + "closed", + "first" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": true, "openWorldHint": true, - "title": "Get tmux variables" + "readOnlyHint": true, + "title": "Read New Pane Output" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads a capped list of validated tmux variable names, not free-form formats.", - "inputLiteralization": { - "names": "validated-variable-name" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "names": { - "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - } - }, - "required": [ - "names" - ], - "type": "object" - }, + "inputLiteralization": {}, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "get_tmux_variables", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata", - "configured-command" + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "values": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "values" - ], - "type": "object" - }, "processReach": "none", - "title": "Get tmux variables", "tmuxEffects": [ "observe" ], @@ -31226,961 +32884,821 @@ } }, { - "name": "get_window_info", - "wireName": "get_window_info", + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 166 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 584 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one window.", + "description": "Discard a pane's scrollback, so the next capture_pane returns only what happens next. Use this before running something whose output you want to read cleanly: it is far cheaper than reading past the old output every time. The visible screen is left alone. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "window_id": { - "description": "the window id, such as @1", + "pane": { + "description": "The `%`-prefixed pane id, as `list_panes` reports it.", "type": "string" } }, "required": [ - "window_id" + "pane" ], "type": "object" }, "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "pane": { + "description": "The pane that changed.", + "type": "string" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Clear Pane History" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "delete" + ], + "toolset": "teardown" + } + } + }, + { + "name": "create_session", + "wireName": "create_session", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 249 + }, + "description": "Create a new detached tmux session. Start a pane's configured process; accepts no command payload.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "height": { - "type": "integer" - }, - "layout": { + "name": { + "description": "The name for the new session. It must not already exist.", "type": "string" }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, + "start_directory": { + "description": "The first window's working directory. Omit for the directory this MCP\nserver started in.", "type": [ - "array" + "string", + "null" ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "attached": { + "description": "Whether any client is attached.", + "type": "boolean" }, - "width": { - "type": "integer" + "id": { + "description": "The `$`-prefixed tmux identity.", + "type": "string" }, - "window": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" + "name": { + "description": "The session name, absent when tmux reported none.", + "type": "string" }, - "zoomed": { - "type": "boolean" + "windows": { + "description": "How many windows the session holds.", + "minimum": 0, + "type": "integer" } }, "required": [ - "window", - "layout", - "width", - "height", - "zoomed", - "panes" + "id", + "name", + "windows", + "attached" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": false, "openWorldHint": true, - "title": "Get window info" + "readOnlyHint": false, + "title": "Create Session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one window.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id" - ], - "type": "object" + "inputLiteralization": { + "name": "double-hash-once", + "start_directory": "double-hash-once" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "get_window_info", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "layout": { - "type": "string" - }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "width": { - "type": "integer" - }, - "window": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "window", - "layout", - "width", - "height", - "zoomed", - "panes" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get window info", + "processReach": "configured-process", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "kill_pane", - "wireName": "kill_pane", + "name": "create_window", + "wireName": "create_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 570 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 927 }, - "description": "Delete tmux state; accepts no command payload. Deletes one pane and ends its process.", + "description": "Create a window running its configured process. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", - "type": "boolean" + "name": { + "description": "The window name. Omit to let tmux name it after its running command.", + "type": [ + "string", + "null" + ] }, - "pane_id": { - "description": "the pane id, such as %1", + "session": { + "description": "The session to create the window in, by `$`-prefixed id or name.", "type": "string" + }, + "start_directory": { + "description": "The window's working directory. Omit for the directory this MCP\nserver started in.", + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id" + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "killed": { + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" + }, + "id": { + "description": "The `@`-prefixed tmux identity.", "type": "string" }, - "windowEnded": { + "index": { + "description": "The window's index within that session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", "type": "boolean" + }, + "name": { + "description": "The window name.", + "type": "string" + }, + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" + }, + "session_id": { + "description": "The session this window was reached through.", + "type": "string" } }, "required": [ - "killed", - "windowEnded" + "id", + "session_id", + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": false, "openWorldHint": true, - "title": "Kill a pane" + "readOnlyHint": false, + "title": "Create Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Deletes one pane and ends its process.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", - "type": "boolean" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" + "inputLiteralization": { + "name": "double-hash-once", + "start_directory": "double-hash-once" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_pane", - "nestedAuthority": null, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "killed": { - "type": "string" - }, - "windowEnded": { - "type": "boolean" - } - }, - "required": [ - "killed", - "windowEnded" - ], - "type": "object" - }, - "processReach": "none", - "title": "Kill a pane", + "processReach": "configured-process", "tmuxEffects": [ - "observe", - "delete" + "change" ], - "toolset": "teardown" + "toolset": "execute" } } }, { - "name": "kill_session", - "wireName": "kill_session", + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 578 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 609 }, - "description": "Delete tmux state; accepts no command payload. Deletes one session and every window and pane in it.", + "description": "Find the pane touching a named window corner. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", - "type": "boolean" + "corner": { + "description": "`top-left`, `top-right`, `bottom-left`, or `bottom-right`.", + "type": "string" }, - "session_id": { - "description": "the session id, such as $1", + "window": { + "description": "The `@`-prefixed window id.", "type": "string" } }, "required": [ - "session_id" + "window", + "corner" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" + }, + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "killed": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + }, + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", "type": "string" } }, "required": [ - "killed" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Kill a session" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Find Pane By Position" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Deletes one session and every window and pane in it.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", - "type": "boolean" - }, - "session_id": { - "description": "the session id, such as $1", - "type": "string" - } - }, - "required": [ - "session_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_session", - "nestedAuthority": null, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "killed": { - "type": "string" - } - }, - "required": [ - "killed" - ], - "type": "object" - }, "processReach": "none", - "title": "Kill a session", "tmuxEffects": [ - "observe", - "delete" + "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "kill_window", - "wireName": "kill_window", + "name": "get_pane_info", + "wireName": "get_pane_info", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 574 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 593 }, - "description": "Delete tmux state; accepts no command payload. Deletes one window and every pane in it.", + "description": "Return metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", - "type": "boolean" - }, - "window_id": { - "description": "the window id, such as @1", + "pane": { + "description": "The `%`-prefixed pane id, as `list_panes` reports it.", "type": "string" } }, "required": [ - "window_id" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "killed": { - "type": "string" - }, - "sessionEnded": { - "type": "boolean" + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" + }, + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] } }, - "required": [ - "killed", - "sessionEnded" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Kill a window" - }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + }, + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", + "type": "string" + } + }, + "required": [ + "id", + "window_id", + "active", + "caller" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Get Pane Info" + }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Deletes one window and every pane in it.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_server_info", + "wireName": "get_server_info", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 149 + }, + "description": "Report every session with its windows and panes, in one call. Prefer this over calling the three listing tools separately: it costs tmux four commands rather than one per object. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "outputSchema": { + "$defs": { + "Branch": { + "description": "One session with everything under it.", "properties": { - "confirm_self": { - "description": "permit ending the pane this MCP process runs in", + "attached": { + "description": "Whether any client is attached.", "type": "boolean" }, - "window_id": { - "description": "the window id, such as @1", + "id": { + "description": "The `$`-prefixed tmux identity.", + "type": "string" + }, + "name": { + "description": "The session name.", "type": "string" + }, + "windows": { + "description": "The windows it holds.", + "items": { + "$ref": "#/$defs/BranchWindow" + }, + "type": "array" } }, "required": [ - "window_id" + "id", + "name", + "attached", + "windows" ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_window", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, + "BranchPane": { + "description": "One pane inside a described window.", "properties": { - "killed": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + } + }, + "required": [ + "id", + "active" + ], + "type": "object" + }, + "BranchWindow": { + "description": "One window inside a described session.", + "properties": { + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" + }, + "id": { + "description": "The `@`-prefixed tmux identity.", "type": "string" }, - "sessionEnded": { + "index": { + "description": "The window's index within its session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", "type": "boolean" + }, + "name": { + "description": "The window name.", + "type": "string" + }, + "panes": { + "description": "The panes it holds.", + "items": { + "$ref": "#/$defs/BranchPane" + }, + "type": "array" } }, "required": [ - "killed", - "sessionEnded" + "id", + "index", + "name", + "active", + "linked", + "panes" ], "type": "object" - }, + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "sessions": { + "description": "Every session, with its windows and their panes.", + "items": { + "$ref": "#/$defs/Branch" + }, + "type": "array" + } + }, + "required": [ + "sessions" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Describe Server" + }, + "meta": { + "anthropic/alwaysLoad": true, + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], "processReach": "none", - "title": "Kill a window", "tmuxEffects": [ - "observe", - "delete" + "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "list_panes", - "wireName": "list_panes", + "name": "get_session_info", + "wireName": "get_session_info", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 143 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 555 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists pane metadata and stable pane IDs.", + "description": "Return metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, + "properties": { + "session": { + "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", + "type": "string" + } + }, + "required": [ + "session" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "status": { - "additionalProperties": false, - "properties": { - "dead": { - "type": "boolean" - }, - "exitStatus": { - "type": [ - "null", - "integer" - ] - }, - "historyLines": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "path": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "dead", - "historyLines", - "inMode" - ], - "type": [ - "null", - "object" - ] - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, - "type": [ - "array" - ] + "attached": { + "description": "Whether any client is attached.", + "type": "boolean" }, - "serverNote": { + "id": { + "description": "The `$`-prefixed tmux identity.", "type": "string" }, - "skipped": { - "type": "integer" + "name": { + "description": "The session name, absent when tmux reported none.", + "type": "string" }, - "total": { + "windows": { + "description": "How many windows the session holds.", + "minimum": 0, "type": "integer" } }, "required": [ - "panes", - "total" + "id", + "name", + "windows", + "attached" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "List panes" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Get Session Info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists pane metadata and stable pane IDs.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 652 + }, + "description": "Read a bounded set of tmux variables against one pane. tmux reads a name it does not know as a format from its environment, so a name the server or session environment holds is refused unless the operator listed it in LIBTMUX_ENVIRONMENT_VALUES at startup. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "names": { + "description": "tmux format variable names, such as `pane_current_path`.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" + }, + "pane": { + "description": "The `%`-prefixed pane to read them against. Omit to let tmux pick\nits current pane.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "values": { + "additionalProperties": { + "type": "string" + }, "type": "object" + } + }, + "required": [ + "values" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Get tmux Variables" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "names": "validated-variable-name" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "list_panes", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "status": { - "additionalProperties": false, - "properties": { - "dead": { - "type": "boolean" - }, - "exitStatus": { - "type": [ - "null", - "integer" - ] - }, - "historyLines": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "path": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "dead", - "historyLines", - "inMode" - ], - "type": [ - "null", - "object" - ] - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "serverNote": { - "type": "string" - }, - "skipped": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "panes", - "total" - ], - "type": "object" - }, "processReach": "none", - "title": "List panes", "tmuxEffects": [ "observe" ], @@ -32189,146 +33707,94 @@ } }, { - "name": "list_sessions", - "wireName": "list_sessions", + "name": "get_window_info", + "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 127 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 579 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists sessions on the pinned tmux server.", + "description": "Return metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, + "properties": { + "window": { + "description": "The `@`-prefixed window id, as `list_windows` reports it.", + "type": "string" + } + }, + "required": [ + "window" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "serverNote": { - "type": "string" + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" }, - "sessions": { - "items": { - "additionalProperties": false, - "properties": { - "attached": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "windows": { - "type": "integer" - } - }, - "required": [ - "id", - "name", - "windows", - "attached" - ], - "type": "object" - }, - "type": [ - "array" - ] + "id": { + "description": "The `@`-prefixed tmux identity.", + "type": "string" }, - "skipped": { + "index": { + "description": "The window's index within that session.", + "format": "int32", "type": "integer" }, - "total": { + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" + }, + "name": { + "description": "The window name.", + "type": "string" + }, + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, "type": "integer" + }, + "session_id": { + "description": "The session this window was reached through.", + "type": "string" } }, "required": [ - "sessions", - "total" + "id", + "session_id", + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "List sessions" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Get Window Info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists sessions on the pinned tmux server.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "list_sessions", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "serverNote": { - "type": "string" - }, - "sessions": { - "items": { - "additionalProperties": false, - "properties": { - "attached": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "windows": { - "type": "integer" - } - }, - "required": [ - "id", - "name", - "windows", - "attached" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "skipped": { - "type": "integer" - }, - "total": { - "type": "integer" - } - }, - "required": [ - "sessions", - "total" - ], - "type": "object" - }, "processReach": "none", - "title": "List sessions", "tmuxEffects": [ "observe" ], @@ -32337,661 +33803,615 @@ } }, { - "name": "list_windows", - "wireName": "list_windows", + "name": "kill_pane", + "wireName": "kill_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 135 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 227 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists windows, optionally only those in one named session.", + "description": "Kill a pane. Killing a window's last pane closes the window. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "session": { - "description": "only windows in this session name", + "pane": { + "description": "The `%`-prefixed pane id, as `list_panes` reports it.", "type": "string" } }, + "required": [ + "pane" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "serverNote": { + "id": { + "description": "The id of what was destroyed.", "type": "string" - }, - "skipped": { - "type": "integer" - }, - "total": { - "type": "integer" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" - }, - "type": [ - "array" - ] } }, "required": [ - "windows", - "total" + "id" ], "type": "object" }, "annotations": { "destructiveHint": true, - "openWorldHint": true, - "title": "List windows" + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Kill Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists windows, optionally only those in one named session.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "only windows in this session name", - "type": "string" - } - }, - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "list_windows", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "serverNote": { - "type": "string" - }, - "skipped": { - "type": "integer" - }, - "total": { - "type": "integer" - }, - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "name", - "index", - "panes", - "active" - ], - "type": "object" - }, - "type": [ - "array" - ] - } - }, - "required": [ - "windows", - "total" - ], - "type": "object" - }, "processReach": "none", - "title": "List windows", "tmuxEffects": [ - "observe" + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "move_window", - "wireName": "move_window", + "name": "kill_session", + "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 379 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 299 }, - "description": "Change tmux state; no client-supplied executable input. Moves a window to another session, optionally at an index.", + "description": "Kill a tmux session and everything in it. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "index": { - "description": "a destination window index; omit for tmux's choice", - "type": [ - "null", - "integer" - ] - }, - "session_id": { - "description": "the destination session id, such as $1", - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", + "session": { + "description": "The session, by `$`-prefixed id as `list_sessions` reports it, or by\nname.", "type": "string" } }, "required": [ - "window_id", - "session_id" + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "index": { - "type": "integer" - }, - "session": { - "type": "string" - }, - "windowId": { + "id": { + "description": "The id of what was destroyed.", "type": "string" } }, "required": [ - "windowId", - "session", - "index" + "id" ], "type": "object" }, "annotations": { "destructiveHint": true, - "openWorldHint": true, - "title": "Move a window" + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Kill Session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Moves a window to another session, optionally at an index.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "index": { - "description": "a destination window index; omit for tmux's choice", - "type": [ - "null", - "integer" - ] - }, - "session_id": { - "description": "the destination session id, such as $1", - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id", - "session_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "move_window", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "session": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId", - "session", - "index" - ], - "type": "object" - }, "processReach": "none", - "title": "Move a window", "tmuxEffects": [ - "observe", - "change" + "delete" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "kill_window", + "wireName": "kill_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 527 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 207 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Pastes literal text only to its target; optional Enter appends one newline to the same private buffer.", + "description": "Kill a window, closing it in every session that links it. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "enter": { - "description": "append a newline that submits the text", - "type": "boolean" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "text": { - "description": "the literal text to paste", + "window": { + "description": "The `@`-prefixed window id, as `list_windows` reports it.", "type": "string" } }, "required": [ - "pane_id", - "text" + "window" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "bytes": { - "type": "integer" - }, - "pane_id": { + "id": { + "description": "The id of what was destroyed.", "type": "string" } }, "required": [ - "pane_id", - "bytes" + "id" ], "type": "object" }, "annotations": { "destructiveHint": true, - "openWorldHint": true, - "title": "Paste text" + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Kill Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Pastes literal text only to its target; optional Enter appends one newline to the same private buffer.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "delete" + ], + "toolset": "teardown" + } + } + }, + { + "name": "list_panes", + "wireName": "list_panes", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 137 + }, + "description": "List every pane on the server. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "outputSchema": { + "$defs": { + "PaneView": { + "description": "One pane, as the protocol sees it.", "properties": { - "enter": { - "description": "append a newline that submits the text", + "active": { + "description": "Whether this is the window's active pane.", "type": "boolean" }, - "pane_id": { - "description": "the pane id, such as %1", + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", "type": "string" }, - "text": { - "description": "the literal text to paste", + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", "type": "string" } }, "required": [ - "pane_id", - "text" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "paste_text", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "bytes": { - "type": "integer" + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" }, - "pane_id": { + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", "type": "string" } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "panes": { + "description": "The panes, in tmux's own order.", + "items": { + "$ref": "#/$defs/PaneView" }, - "required": [ - "pane_id", - "bytes" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Paste text", + "type": "array" + } + }, + "required": [ + "panes" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "List Panes" + }, + "meta": { + "anthropic/alwaysLoad": true, + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "rename_session", - "wireName": "rename_session", + "name": "list_sessions", + "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 333 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 110 }, - "description": "Change tmux state; no client-supplied executable input. Replaces a session's name.", + "description": "List every tmux session on the server. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "new_name": { - "description": "the literal new session name", - "type": "string" - }, - "session_id": { - "description": "the session id, such as $1", - "type": "string" - } - }, - "required": [ - "session_id", - "new_name" - ], + "properties": {}, "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "SessionView": { + "description": "One session, as the protocol sees it.", + "properties": { + "attached": { + "description": "Whether any client is attached.", + "type": "boolean" + }, + "id": { + "description": "The `$`-prefixed tmux identity.", + "type": "string" + }, + "name": { + "description": "The session name, absent when tmux reported none.", + "type": "string" + }, + "windows": { + "description": "How many windows the session holds.", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "id", + "name", + "windows", + "attached" + ], + "type": "object" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "name": { - "type": "string" - }, - "sessionId": { - "type": "string" + "sessions": { + "description": "The sessions, in tmux's own order.", + "items": { + "$ref": "#/$defs/SessionView" + }, + "type": "array" } }, "required": [ - "sessionId", - "name" + "sessions" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Rename a session" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "List Sessions" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Replaces a session's name.", - "inputLiteralization": { - "new_name": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "list_windows", + "wireName": "list_windows", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 125 + }, + "description": "List every window on the server. A window linked into several sessions appears once per link, so an id can repeat with a different session_id. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "outputSchema": { + "$defs": { + "WindowView": { + "description": "One window, as the protocol sees it.", "properties": { - "new_name": { - "description": "the literal new session name", + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" + }, + "id": { + "description": "The `@`-prefixed tmux identity.", + "type": "string" + }, + "index": { + "description": "The window's index within that session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" + }, + "name": { + "description": "The window name.", "type": "string" }, + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" + }, "session_id": { - "description": "the session id, such as $1", + "description": "The session this window was reached through.", "type": "string" } }, "required": [ + "id", "session_id", - "new_name" + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" - }, - "mayExposeSecrets": false, + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "windows": { + "description": "The windows, in tmux's own order.", + "items": { + "$ref": "#/$defs/WindowView" + }, + "type": "array" + } + }, + "required": [ + "windows" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "List Windows" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "rename_session", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "sessionId", - "name" - ], - "type": "object" - }, "processReach": "none", - "title": "Rename a session", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "rename_window", - "wireName": "rename_window", + "name": "move_window", + "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 341 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 791 }, - "description": "Change tmux state; no client-supplied executable input. Replaces a window's name.", + "description": "Move one window to a session and index. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "new_name": { - "description": "the literal new window name", + "destination_index": { + "description": "The window index there. tmux refuses one already in use.", + "format": "int32", + "type": "integer" + }, + "destination_session": { + "description": "The session to move the window into, by `$`-prefixed id or name.", "type": "string" }, - "window_id": { - "description": "the window id, such as @1", + "window": { + "description": "The `@`-prefixed window id to move.", "type": "string" } }, "required": [ - "window_id", - "new_name" + "window", + "destination_session", + "destination_index" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "name": { - "type": "string" + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" }, - "windowId": { + "id": { + "description": "The `@`-prefixed tmux identity.", "type": "string" - } + }, + "index": { + "description": "The window's index within that session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" + }, + "name": { + "description": "The window name.", + "type": "string" + }, + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" + }, + "session_id": { + "description": "The session this window was reached through.", + "type": "string" + } }, "required": [ - "windowId", - "name" + "id", + "session_id", + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Rename a window" + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Move Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Replaces a window's name.", - "inputLiteralization": { - "new_name": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "new_name": { - "description": "the literal new window name", - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id", - "new_name" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "rename_window", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId", - "name" - ], - "type": "object" - }, "processReach": "none", - "title": "Rename a window", "tmuxEffects": [ - "observe", "change" ], "toolset": "manage" @@ -32999,253 +34419,166 @@ } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "paste_text", + "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 372 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 608 }, - "description": "Change tmux state; no client-supplied executable input. Sets a pane's width, height, or both.", + "description": "Put text into a pane through a tmux paste buffer instead of typing it key by key. Use this for anything long or awkward: send_keys types the text, so a shell reading it can react to each character, and a bracketed-paste aware program treats a paste as one block. Optional Enter is appended to that same block. Empty text without Enter is a guarded buffer-free no-op. Paste targets only the named pane, even when synchronized input is enabled. A dead, input-disabled, mode-owned, terminal-attended, or inherited-caller target is refused before setup and again immediately before paste. The private buffer is deleted after setup, refusal, and paste outcomes; observations can still race with tmux. A submitted paste is remembered briefly so wait_for_text can discount its own echo. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "height": { - "description": "height in terminal cells; omit to retain it", - "type": "integer" + "enter": { + "default": false, + "description": "Whether to append Enter to the same paste block.", + "type": "boolean" }, - "pane_id": { - "description": "the pane id, such as %1", + "pane": { + "description": "The `%`-prefixed pane to paste into.", "type": "string" }, - "width": { - "description": "width in terminal cells; omit to retain it", - "type": "integer" + "text": { + "description": "The text to deliver.", + "type": "string" } }, "required": [ - "pane_id" + "pane", + "text" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "height": { + "bytes": { + "description": "How many bytes came from `text`, excluding optional Enter.", + "minimum": 0, "type": "integer" }, - "paneId": { + "pane": { + "description": "The pane it went into.", "type": "string" - }, - "width": { - "type": "integer" } }, "required": [ - "paneId", - "width", - "height" + "pane", + "bytes" ], "type": "object" }, "annotations": { "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "title": "Resize a pane" + "readOnlyHint": false, + "title": "Paste Text Into Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Sets a pane's width, height, or both.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "description": "height in terminal cells; omit to retain it", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "width": { - "description": "width in terminal cells; omit to retain it", - "type": "integer" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "resize_pane", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "paneId": { - "type": "string" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "paneId", - "width", - "height" - ], - "type": "object" - }, - "processReach": "none", - "title": "Resize a pane", + "processReach": "pane-input", "tmuxEffects": [ - "observe", "change" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "resize_window", - "wireName": "resize_window", + "name": "rename_session", + "wireName": "rename_session", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 365 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 713 }, - "description": "Change tmux state; no client-supplied executable input. Sets a window's width, height, or both.", + "description": "Rename one session. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "height": { - "description": "height in terminal cells; omit to retain it", - "type": "integer" - }, - "width": { - "description": "width in terminal cells; omit to retain it", - "type": "integer" + "name": { + "description": "The new name. tmux refuses one another session has.", + "type": "string" }, - "window_id": { - "description": "the window id, such as @1", + "session": { + "description": "The session to rename, by `$`-prefixed id or name.", "type": "string" } }, "required": [ - "window_id" + "session", + "name" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "height": { - "type": "integer" + "attached": { + "description": "Whether any client is attached.", + "type": "boolean" }, - "width": { - "type": "integer" + "id": { + "description": "The `$`-prefixed tmux identity.", + "type": "string" }, - "windowId": { + "name": { + "description": "The session name, absent when tmux reported none.", "type": "string" + }, + "windows": { + "description": "How many windows the session holds.", + "minimum": 0, + "type": "integer" } }, "required": [ - "windowId", - "width", - "height" + "id", + "name", + "windows", + "attached" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Resize a window" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Rename Session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Sets a window's width, height, or both.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "description": "height in terminal cells; omit to retain it", - "type": "integer" - }, - "width": { - "description": "width in terminal cells; omit to retain it", - "type": "integer" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id" - ], - "type": "object" + "inputLiteralization": { + "name": "double-hash-once" }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "resize_window", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "width": { - "type": "integer" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId", - "width", - "height" - ], - "type": "object" - }, "processReach": "none", - "title": "Resize a window", "tmuxEffects": [ - "observe", "change" ], "toolset": "manage" @@ -33253,1658 +34586,1061 @@ } }, { - "name": "respawn_pane", - "wireName": "respawn_pane", + "name": "rename_window", + "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 481 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 745 }, - "description": "Start a pane's configured process; accepts no command payload. Kills the pane's current process and starts its configured process again.", + "description": "Rename one window. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "pane_id": { - "description": "the pane id, such as %1", + "name": { + "description": "The new name. tmux then stops renaming the window automatically.", "type": "string" }, - "start_directory": { - "description": "an absolute literal start directory", + "window": { + "description": "The `@`-prefixed window id.", "type": "string" } }, "required": [ - "pane_id" + "window", + "name" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "gone": { + "active": { + "description": "Whether this is the session's active window.", "type": "boolean" }, - "paneId": { + "id": { + "description": "The `@`-prefixed tmux identity.", + "type": "string" + }, + "index": { + "description": "The window's index within that session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" + }, + "name": { + "description": "The window name.", + "type": "string" + }, + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" + }, + "session_id": { + "description": "The session this window was reached through.", "type": "string" } }, "required": [ - "paneId" + "id", + "session_id", + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Respawn a pane" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Rename Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Kills the pane's current process and starts its configured process again.", "inputLiteralization": { - "start_directory": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "start_directory": { - "description": "an absolute literal start directory", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" + "name": "double-hash-once" }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "respawn_pane", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "gone": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Respawn a pane", + "processReach": "none", "tmuxEffects": [ - "observe", - "change", - "delete" + "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "run_shell_command", - "wireName": "run_shell_command", + "name": "resize_pane", + "wireName": "resize_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 493 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 319 }, - "description": "Run a shell command in a pane with your user's permissions. Runs one command you author in a pane that is not synchronized with others, rechecks the pane just before sending, and waits for it to finish, reporting its exit status.", + "description": "Move one edge of a pane by a number of rows or columns. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$defs": { + "ResizeDirectionSchema": { + "enum": [ + "up", + "down", + "left", + "right" + ], + "type": "string" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "command": { - "description": "the shell command run in the pane's interactive shell", - "type": "string" - }, - "max_lines": { - "description": "maximum output lines, keeping the newest", + "cells": { + "description": "How many rows or columns to move it by.", "minimum": 0, "type": "integer" }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "suppress_history": { - "description": "best-effort persistent history suppression", - "type": "boolean" + "direction": { + "$ref": "#/$defs/ResizeDirectionSchema", + "description": "Which edge to move: `up`, `down`, `left`, or `right`." }, - "timeout": { - "description": "seconds to wait before giving up", - "minimum": 0, - "type": "number" + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" } }, "required": [ - "pane_id", - "command" + "pane", + "direction", + "cells" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "effective_timeout_seconds": { + "height": { + "description": "How tall it is now, in rows.", + "minimum": 0, "type": "integer" }, - "exit_status": { - "type": [ - "null", - "integer" - ] - }, - "lines_missed": { - "type": "boolean" - }, - "output": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "output_unavailable": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "running": { + "pane": { + "description": "The pane that was resized.", "type": "string" }, - "timed_out": { - "type": "boolean" - }, - "timeout_clamped": { - "type": "boolean" + "width": { + "description": "How wide it is now, in columns.", + "minimum": 0, + "type": "integer" } }, "required": [ - "pane_id", - "resolved_pane_ids", - "timed_out", - "output" + "pane", + "width", + "height" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Run a shell command" + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Resize Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Run a shell command in a pane with your user's permissions. Runs one command you author in a pane that is not synchronized with others, rechecks the pane just before sending, and waits for it to finish, reporting its exit status.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "command": { - "description": "the shell command run in the pane's interactive shell", - "type": "string" - }, - "max_lines": { - "description": "maximum output lines, keeping the newest", - "minimum": 0, - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "suppress_history": { - "description": "best-effort persistent history suppression", - "type": "boolean" - }, - "timeout": { - "description": "seconds to wait before giving up", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "pane_id", - "command" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "run_shell_command", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "effective_timeout_seconds": { - "type": "integer" - }, - "exit_status": { - "type": [ - "null", - "integer" - ] - }, - "lines_missed": { - "type": "boolean" - }, - "output": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "output_unavailable": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "running": { - "type": "string" - }, - "timed_out": { - "type": "boolean" - }, - "timeout_clamped": { - "type": "boolean" - } - }, - "required": [ - "pane_id", - "resolved_pane_ids", - "timed_out", - "output" - ], - "type": "object" - }, - "processReach": "pane-command", - "title": "Run a shell command", + "processReach": "none", "tmuxEffects": [ - "observe", "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "search_panes", - "wireName": "search_panes", + "name": "resize_window", + "wireName": "resize_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 218 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 768 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Searches the visible output of every pane.", + "description": "Resize one window to exact cell dimensions. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "max_lines": { - "description": "maximum matching panes to return", - "maximum": 200, + "height": { + "description": "Height in rows.", + "minimum": 0, "type": "integer" }, - "max_matches_per_pane": { - "description": "maximum matching lines per pane", - "maximum": 200, + "width": { + "description": "Width in columns.", + "minimum": 0, "type": "integer" }, - "pattern": { - "description": "bounded text or regular expression to search for", - "maxLength": 4096, + "window": { + "description": "The `@`-prefixed window id.", "type": "string" - }, - "regex": { - "description": "treat pattern as a regular expression", - "type": "boolean" } }, "required": [ - "pattern" + "window", + "width", + "height" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "bytesInspected": { - "type": "integer" + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" }, - "linesInspected": { - "type": "integer" + "id": { + "description": "The `@`-prefixed tmux identity.", + "type": "string" }, - "morePanes": { + "index": { + "description": "The window's index within that session.", + "format": "int32", "type": "integer" }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "matches": { - "items": { - "additionalProperties": false, - "properties": { - "row": { - "type": "integer" - }, - "text": { - "type": "string" - } - }, - "required": [ - "row", - "text" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "moreMatches": { - "type": "integer" - }, - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - } - }, - "required": [ - "pane", - "matches" - ], - "type": "object" - }, - "type": [ - "array" - ] + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" }, - "panesInspected": { - "type": "integer" + "name": { + "description": "The window name.", + "type": "string" }, - "workLimited": { - "type": "boolean" + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" }, - "workTimeLimitSeconds": { - "type": "number" + "session_id": { + "description": "The session this window was reached through.", + "type": "string" } }, "required": [ + "id", + "session_id", + "index", + "name", "panes", - "panesInspected", - "linesInspected", - "bytesInspected", - "workLimited", - "workTimeLimitSeconds" + "active", + "linked" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Search panes" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Resize Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Searches the visible output of every pane.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "max_lines": { - "description": "maximum matching panes to return", - "maximum": 200, - "type": "integer" - }, - "max_matches_per_pane": { - "description": "maximum matching lines per pane", - "maximum": 200, - "type": "integer" - }, - "pattern": { - "description": "bounded text or regular expression to search for", - "maxLength": 4096, - "type": "string" - }, - "regex": { - "description": "treat pattern as a regular expression", - "type": "boolean" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "search_panes", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "bytesInspected": { - "type": "integer" - }, - "linesInspected": { - "type": "integer" + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "respawn_pane", + "wireName": "respawn_pane", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 1020 + }, + "description": "Restart a pane's configured process with no command payload. Start a pane's configured process; accepts no command payload.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "kill_first": { + "default": false, + "description": "Kill a running process first. Defaults to `false`, which respawns\nonly a dead pane.", + "type": "boolean" + }, + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "outputSchema": { + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" }, - "morePanes": { - "type": "integer" + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "matches": { - "items": { - "additionalProperties": false, - "properties": { - "row": { - "type": "integer" - }, - "text": { - "type": "string" - } - }, - "required": [ - "row", - "text" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "moreMatches": { - "type": "integer" - }, - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - } - }, - "required": [ - "pane", - "matches" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "panesInspected": { - "type": "integer" - }, - "workLimited": { - "type": "boolean" - }, - "workTimeLimitSeconds": { - "type": "number" + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" } - }, - "required": [ - "panes", - "panesInspected", - "linesInspected", - "bytesInspected", - "workLimited", - "workTimeLimitSeconds" - ], - "type": "object" - }, - "processReach": "none", - "title": "Search panes", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "select_layout", - "wireName": "select_layout", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 357 - }, - "description": "Change tmux state; no client-supplied executable input. Applies a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info. Invalid syntax is rejected before window lookup; tmux validates geometry when applying the layout.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "description": "a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info", - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" + ] } }, - "required": [ - "window_id", - "layout" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "layout": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", "type": "string" }, - "windowId": { + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", "type": "string" } }, "required": [ - "windowId", - "layout" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, "annotations": { "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "title": "Select a layout" + "readOnlyHint": false, + "title": "Respawn Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Applies a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info. Invalid syntax is rejected before window lookup; tmux validates geometry when applying the layout.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "description": "a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info", - "type": "string" - }, - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id", - "layout" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "select_layout", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId", - "layout" - ], - "type": "object" - }, - "processReach": "none", - "title": "Select a layout", + "processReach": "configured-process", "tmuxEffects": [ - "observe", - "change" + "change", + "delete" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "select_pane", - "wireName": "select_pane", + "name": "run_shell_command", + "wireName": "run_shell_command", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 353 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/observe.rs", + "line": 208 }, - "description": "Change tmux state; no client-supplied executable input. Makes one pane active.", + "description": "Run a shell command in a pane, wait for it to finish, and report its exit status with everything it wrote. This is the tool for \"run this and tell me if it worked\". Output is the pane's raw output stream, not the rendered screen: nothing is missed, the shell prompt is not included, and a line redrawn in place repeats; capture_pane shows the screen. The command runs in a subshell, so cd and export do not persist and invalid syntax completes with a nonzero status. Valid inherited Bash and zsh ERR and DEBUG traps remain visible to the command while parent-shell traps and options remain unchanged. It requires one configured input recipient and observes its mode, liveness, input-off state, attended-client state, cohort, inherited-caller relation, known POSIX shell, and resolved route before watcher setup and again before dispatch. A process-wide endpoint-and-pane reservation blocks other MCP pane input until the completion marker or pane closure is proved. The resolved tmux executable and socket path must contain no ASCII terminal-control bytes. The reservation serializes this MCP's input, but tmux observations can still race with dispatch. The pane shell, tmux server, and configuration must be trusted. Reaching the deadline, cancelling, or an uncertain dispatch stops this request while its watcher keeps the reservation until completion is proved. To stop the command, send_keys with keys [\"C-c\"] alone passes the reservation, and the command reports completion when it ends; respawn_pane with kill_first replaces a program that ignores C-c and C-\\. Run a shell command in a pane with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "pane_id": { - "description": "the pane id, such as %1", + "command": { + "description": "The command for the pane's trusted POSIX-compatible shell.\n\nShell reserved words and special builtins must retain their standard\nmeanings. The command runs inside a subshell, so several lines are fine\nand a bare `exit` does not end the pane's own shell. Invalid syntax is\ncontained and completes with the shell's nonzero status. Valid inherited\nBash and zsh `ERR` and `DEBUG` traps remain visible to the command while\nthe pane's parent-shell traps and options remain unchanged.", + "type": "string" + }, + "pane": { + "description": "The `%`-prefixed pane to run in.", "type": "string" + }, + "seconds": { + "description": "How long to allow, in seconds. Defaults to 30, capped at 600.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "suppress_history": { + "default": false, + "description": "Whether to keep the command out of the shell's history.", + "type": "boolean" } }, "required": [ - "pane_id" + "pane", + "command" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "RunOutcome": { + "description": "How a run finished.\n\nSplit from the wait outcomes rather than shared with them: a run cannot\nmatch a pattern and a wait cannot report a missing shell, and a vocabulary\ncarrying both would have an agent checking for answers that never come.", + "oneOf": [ + { + "const": "completed", + "description": "The command ran to completion and reported its status.", + "type": "string" + }, + { + "const": "deadline", + "description": "The time the caller allowed ran out.\n\nThis ends the waiting, not the command. The pane stays reserved for it\nuntil it ends, so other pane input is refused; `send_keys` with keys\n`[\"C-c\"]` alone interrupts it.", + "type": "string" + }, + { + "const": "pane_closed", + "description": "The pane stopped writing for good.", + "type": "string" + }, + { + "const": "cancelled", + "description": "The client withdrew the request while the run was still going.", + "type": "string" + }, + { + "const": "no_shell", + "description": "The pane never acknowledged the command.\n\nThe keys were sent but the opening sentinel never came back. That is\nwhat a pane looks like when it is not at a shell prompt: sitting in an\neditor or a REPL, or still running something an earlier call left\nbehind. The text was typed into whatever is there.\n\nThe evidence is absence, so a deadline too short for the pane's shell\nto have echoed anything yet looks the same. Read it as \"nothing came\nback in the time allowed\" and check the pane with `snapshot_pane`\nbefore concluding it is stuck.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "paneId": { + "bytes": { + "description": "How many bytes that was, before any truncation.", + "minimum": 0, + "type": "integer" + }, + "exit_status": { + "description": "The command's exit status, when it completed.\n\nAbsent when the run did not complete, and when the command was killed\nby a signal rather than exiting.", + "format": "int32", + "type": [ + "integer", + "null" + ] + }, + "outcome": { + "$ref": "#/$defs/RunOutcome", + "description": "How the run finished." + }, + "output": { + "description": "Everything the command wrote, stdout and stderr interleaved in the\norder the program wrote them.\n\nThis is the raw output stream with escape sequences removed, not the\nrendered screen: a line redrawn in place, such as a progress bar,\nrepeats. `capture_pane` shows the screen.", "type": "string" + }, + "pane": { + "description": "The pane the command ran in.", + "type": "string" + }, + "truncated": { + "description": "Whether the output was truncated from the front.", + "type": "boolean" } }, "required": [ - "paneId" + "pane", + "outcome", + "output", + "bytes", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "title": "Select a pane" + "readOnlyHint": false, + "title": "Run Command In Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Makes one pane active.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "select_pane", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "processReach": "none", - "title": "Select a pane", + "processReach": "pane-command", "tmuxEffects": [ - "observe", "change" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "select_window", - "wireName": "select_window", + "name": "search_panes", + "wireName": "search_panes", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 349 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 344 }, - "description": "Change tmux state; no client-supplied executable input. Makes one window active.", + "description": "Search what panes are displaying with Rust's linear-time regex engine. Accept at most 4,096 pattern bytes; search at most 64 panes, 8,192 lines, and 1 MiB; spend at most 250 ms matching and five seconds capturing. Report the pane and line of every match. Use this to find where something is -- which pane has the failing test, which one printed the error -- instead of capturing panes one at a time. Searches the visible screen by default; set history to include scrollback. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "window_id": { - "description": "the window id, such as @1", + "history": { + "default": false, + "description": "Search scrollback as well as the visible screen.", + "type": "boolean" + }, + "match_case": { + "default": false, + "description": "Match case. Off by default.", + "type": "boolean" + }, + "pattern": { + "description": "The text to look for.", + "maxLength": 4096, "type": "string" + }, + "regex": { + "default": false, + "description": "Read the pattern as a regular expression rather than literal text.", + "type": "boolean" + }, + "session": { + "description": "Only search panes in this session, by `$`-prefixed id or name. Omit\nfor every session.", + "type": [ + "string", + "null" + ] + }, + "window": { + "description": "Only search panes in this window, by `@`-prefixed id. Omit for every\nwindow.", + "type": [ + "string", + "null" + ] } }, "required": [ - "window_id" + "pattern" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "MatchView": { + "description": "One line of one pane that matched a search.", + "properties": { + "line": { + "description": "Which line of the capture matched, counting from the top.", + "minimum": 0, + "type": "integer" + }, + "pane": { + "description": "The pane the line was found in.", + "type": "string" + }, + "text": { + "description": "The line itself.", + "type": "string" + }, + "window_id": { + "description": "The window that pane belongs to.", + "type": "string" + } + }, + "required": [ + "pane", + "window_id", + "line", + "text" + ], + "type": "object" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "windowId": { - "type": "string" + "capped": { + "description": "Whether the match ceiling was reached, so there may be more.", + "type": "boolean" + }, + "matches": { + "description": "Every matching line, in the order the panes were read.", + "items": { + "$ref": "#/$defs/MatchView" + }, + "type": "array" + }, + "panes_searched": { + "description": "How many panes were read to answer this.", + "minimum": 0, + "type": "integer" } }, "required": [ - "windowId" + "matches", + "panes_searched", + "capped" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": true, "openWorldHint": true, - "title": "Select a window" + "readOnlyHint": true, + "title": "Search Pane Contents" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Makes one window active.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "window_id": { - "description": "the window id, such as @1", - "type": "string" - } - }, - "required": [ - "window_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "select_window", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Select a window", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "send_keys", - "wireName": "send_keys", + "name": "select_layout", + "wireName": "select_layout", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 506 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 551 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends keys to a pane and to every pane synchronize-panes links it with; the ids reported are the panes checked before sending, not proof that each one received the keys.", + "description": "Rearrange a window's panes using a saved tmux layout or a named layout and its unique abbreviation. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Invalid syntax is refused before window lookup. Return the saved layout tmux actually applied. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "enter": { - "description": "press Enter after keys, as a real key press, to submit them", - "type": "boolean" - }, - "keys": { - "description": "key names or literal strings to send; do not put \"Enter\" here when literal is true, it types the five letters - set enter instead", - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - }, - "literal": { - "description": "send strings literally instead of as key names", - "type": "boolean" + "layout": { + "description": "A saved tmux layout, or a named layout and its unique abbreviation.\n\nThe names are `even-horizontal`, `even-vertical`, `main-horizontal`,\n`main-vertical` and `tiled`. The running daemon determines which names\nand abbreviations are supported; mirrored main layouts require tmux 3.5.", + "type": "string" }, - "pane_id": { - "description": "the pane id, such as %1", + "window": { + "description": "The `@`-prefixed window to arrange.", "type": "string" } }, "required": [ - "pane_id", - "keys" + "window", + "layout" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "pane_id": { + "layout": { + "description": "The layout it now has, in tmux's own syntax.", "type": "string" }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "sent": { - "type": "integer" + "window": { + "description": "The window that was arranged.", + "type": "string" } }, "required": [ - "pane_id", - "resolved_pane_ids", - "sent" + "window", + "layout" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Send keys" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Arrange Window Panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends keys to a pane and to every pane synchronize-panes links it with; the ids reported are the panes checked before sending, not proof that each one received the keys.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enter": { - "description": "press Enter after keys, as a real key press, to submit them", - "type": "boolean" - }, - "keys": { - "description": "key names or literal strings to send; do not put \"Enter\" here when literal is true, it types the five letters - set enter instead", - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - }, - "literal": { - "description": "send strings literally instead of as key names", - "type": "boolean" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id", - "keys" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "send_keys", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "type": "string" - }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "sent": { - "type": "integer" - } - }, - "required": [ - "pane_id", - "resolved_pane_ids", - "sent" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys", + "processReach": "none", "tmuxEffects": [ - "observe", "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "send_keys_batch", - "wireName": "send_keys_batch", + "name": "select_pane", + "wireName": "select_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 517 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 388 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends up to sixty-four key sequences in order, rechecking before each one which panes synchronize-panes links to its target.", + "description": "Select a pane, making it its window's active pane. Give a direction to move relative to it instead: up, down, left, and right follow the layout, last returns to the previously active pane, and next and previous step through the window in order. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": { - "on_error": { - "description": "stop or continue; defaults to stop", + "$defs": { + "SelectPaneDirectionSchema": { "enum": [ - "stop", - "continue" + "up", + "down", + "left", + "right", + "last", + "next", + "previous" ], "type": "string" - }, - "operations": { - "description": "up to sixty-four ordered pane-input operations", - "items": { - "additionalProperties": false, - "properties": { - "enter": { - "type": "boolean" - }, - "keys": { - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - }, - "literal": { - "type": "boolean" - }, - "pane_id": { - "type": "string" - } + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "direction": { + "anyOf": [ + { + "$ref": "#/$defs/SelectPaneDirectionSchema" }, - "required": [ - "pane_id", - "keys" - ], - "type": "object" - }, - "type": [ - "null", - "array" - ] + { + "type": "null" + } + ], + "description": "Move relative to that pane instead of selecting it.\n\n`up`, `down`, `left`, and `right` follow the layout, so `up` selects\nwhatever pane is drawn above. `last` returns to the previously active\npane, and `next` and `previous` step through the window's panes in\norder. Omit to select the named pane itself." + }, + "pane": { + "description": "The `%`-prefixed pane to select, or to move relative to.", + "type": "string" } }, "required": [ - "operations" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" + }, + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "completed": { - "type": "integer" + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" }, - "failed": { - "type": "integer" + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "sent": { - "type": "integer" - } - }, - "required": [ - "pane_id", - "resolved_pane_ids", - "sent" - ], - "type": "object" - }, + "command": { + "description": "The command currently running.", "type": [ - "array" + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + }, + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" ] + }, + "window_id": { + "description": "The window that contains the pane.", + "type": "string" } }, "required": [ - "results", - "completed" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Send keys in a batch" + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Select Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends up to sixty-four key sequences in order, rechecking before each one which panes synchronize-panes links to its target.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "on_error": { - "description": "stop or continue; defaults to stop", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "up to sixty-four ordered pane-input operations", - "items": { - "additionalProperties": false, - "properties": { - "enter": { - "type": "boolean" - }, - "keys": { - "items": { - "type": "string" - }, - "type": [ - "null", - "array" - ] - }, - "literal": { - "type": "boolean" - }, - "pane_id": { - "type": "string" - } - }, - "required": [ - "pane_id", - "keys" - ], - "type": "object" - }, - "type": [ - "null", - "array" - ] - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "send_keys_batch", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "completed": { - "type": "integer" - }, - "failed": { - "type": "integer" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "resolved_pane_ids": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "sent": { - "type": "integer" - } - }, - "required": [ - "pane_id", - "resolved_pane_ids", - "sent" - ], - "type": "object" - }, - "type": [ - "array" - ] - } - }, - "required": [ - "results", - "completed" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys in a batch", + "processReach": "none", "tmuxEffects": [ - "observe", "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "set_history_limit", - "wireName": "set_history_limit", + "name": "select_window", + "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 422 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 475 }, - "description": "Change tmux state; no client-supplied executable input. Sets a bounded integer scrollback limit for future panes in a session.", + "description": "Select a window, making it its session's active window. Give a direction to move relative to it instead: next and previous step through the session in index order, and last returns to the previously active window. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": { - "lines": { - "description": "the nonnegative retained line count", - "type": "integer" - }, - "session_id": { - "description": "the session id, such as $1", + "$defs": { + "SelectWindowDirectionSchema": { + "enum": [ + "next", + "previous", + "last" + ], "type": "string" } }, - "required": [ - "session_id", - "lines" - ], - "type": "object" - }, - "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] - }, - "name": { - "type": "string" - }, - "target": { - "type": "string" + "direction": { + "anyOf": [ + { + "$ref": "#/$defs/SelectWindowDirectionSchema" + }, + { + "type": "null" + } + ], + "description": "Move relative to that window instead of selecting it.\n\n`next` and `previous` step through the session in index order, and\n`last` returns to the previously active window. Omit to select the\nnamed window itself." }, - "value": { + "window": { + "description": "The `@`-prefixed window to select, or to move relative to.", "type": "string" } }, "required": [ - "name" + "window" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Set history limit" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Sets a bounded integer scrollback limit for future panes in a session.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "outputSchema": { + "$defs": { + "WindowView": { + "description": "One window, as the protocol sees it.", "properties": { - "lines": { - "description": "the nonnegative retained line count", - "type": "integer" + "active": { + "description": "Whether this is the session's active window.", + "type": "boolean" }, - "session_id": { - "description": "the session id, such as $1", + "id": { + "description": "The `@`-prefixed tmux identity.", "type": "string" - } - }, - "required": [ - "session_id", - "lines" - ], - "type": "object" - }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "set_history_limit", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] + }, + "index": { + "description": "The window's index within that session.", + "format": "int32", + "type": "integer" + }, + "linked": { + "description": "Whether more than one session links this window.", + "type": "boolean" }, "name": { + "description": "The window name.", "type": "string" }, - "target": { - "type": "string" + "panes": { + "description": "How many panes the window holds.", + "minimum": 0, + "type": "integer" }, - "value": { + "session_id": { + "description": "The session this window was reached through.", "type": "string" } }, "required": [ - "name" + "id", + "session_id", + "index", + "name", + "panes", + "active", + "linked" ], "type": "object" - }, - "processReach": "none", - "title": "Set history limit", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "set_mouse_enabled", - "wireName": "set_mouse_enabled", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 417 - }, - "description": "Change tmux state; no client-supplied executable input. Enables or disables tmux mouse handling.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "whether the setting is enabled", - "type": "boolean" } }, - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] - }, - "name": { - "type": "string" - }, - "target": { - "type": "string" - }, - "value": { - "type": "string" + "windows": { + "description": "The windows, in tmux's own order.", + "items": { + "$ref": "#/$defs/WindowView" + }, + "type": "array" } }, "required": [ - "name" + "windows" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Set mouse handling" + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Select Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Enables or disables tmux mouse handling.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "whether the setting is enabled", - "type": "boolean" - } - }, - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "set_mouse_enabled", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] - }, - "name": { - "type": "string" - }, - "target": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, "processReach": "none", - "title": "Set mouse handling", "tmuxEffects": [ "change" ], @@ -34913,639 +35649,443 @@ } }, { - "name": "set_pane_title", - "wireName": "set_pane_title", + "name": "send_keys", + "wireName": "send_keys", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 391 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 356 }, - "description": "Change tmux state; no client-supplied executable input. Replaces a pane's literal title.", + "description": "Type text into a pane, press named keys in it, or both. `text` is sent literally, so C-c in it types those three characters. Use `keys` for anything without a character of its own -- C-c to interrupt a running command, Escape, Up, C-d -- which are tmux key names and are interpreted. Text, keys, and optional Enter keep that order in one tmux dispatch. Before input, the configured synchronized-pane cohort is observed; a dead, input-disabled, mode-owned, terminal-attended, or inherited-caller member refuses the whole call, and so does an active run_shell_command, except for keys C-c or C-\\ sent alone, which interrupt it. Returned pane IDs describe configured membership, not confirmed delivery. The observation can race with tmux processing the input. A submitted line is remembered briefly so wait_for_text can discount its own echo; an unrecognized key stops that for the pane's current line rather than mask it inaccurately. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" + "enter": { + "default": false, + "description": "Whether to press Enter afterwards.", + "type": "boolean" }, - "title": { - "description": "the literal title", + "keys": { + "description": "tmux key names to press, in order, after any text.\n\nThese are interpreted rather than typed, which is the only way to send\na key that has no character: `C-c` to interrupt, `Escape`, `Up`,\n`C-d`. Sending `C-c` as `text` would type those three characters.\nOmit to press none.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "pane": { + "description": "The `%`-prefixed pane id.", "type": "string" + }, + "text": { + "description": "Text typed literally into the pane. Key names are not interpreted. Omit\nto type none.", + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id", - "title" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "paneId": { + "pane": { + "description": "The pane the caller targeted.", "type": "string" }, - "title": { - "type": "string" + "panes": { + "description": "The effective configured recipient IDs observed before dispatch.\n\nMembership does not confirm delivery and may change after observation.", + "items": { + "type": "string" + }, + "type": "array" } }, "required": [ - "paneId", - "title" + "pane", + "panes" ], "type": "object" }, "annotations": { "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "title": "Set pane title" + "readOnlyHint": false, + "title": "Send Keys To Pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Replaces a pane's literal title.", - "inputLiteralization": { - "title": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "title": { - "description": "the literal title", - "type": "string" - } - }, - "required": [ - "pane_id", - "title" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "set_pane_title", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "paneId", - "title" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set pane title", + "processReach": "pane-input", "tmuxEffects": [ - "observe", "change" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "set_synchronize_panes", - "wireName": "set_synchronize_panes", + "name": "send_keys_batch", + "wireName": "send_keys_batch", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 538 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 1078 }, - "description": "Change tmux state; no client-supplied executable input. Sets the window synchronization default (synchronize-panes); pane-level overrides still decide which panes receive later input.", + "description": "Send an ordered batch of input operations to panes. Each executed row repeats send_keys' effective synchronized-cohort, dead-pane, input-off, pane-mode, attended-client, and inherited-caller preflight, then crosses one tmux dispatch. These observations can race with tmux processing the input. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "whether pane input is synchronized", - "type": "boolean" - }, - "window_id": { - "description": "the window id, such as @1", + "$defs": { + "OnError": { + "enum": [ + "stop", + "continue" + ], "type": "string" + }, + "SendOperation": { + "additionalProperties": false, + "properties": { + "enter": { + "default": false, + "description": "Whether to press Enter afterwards.", + "type": "boolean" + }, + "keys": { + "description": "tmux key names to press, in order, after any text, such as `C-c`. Omit\nto press none.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" + }, + "text": { + "description": "Text typed literally. Key names are not interpreted. Omit to type\nnone.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "pane" + ], + "type": "object" } }, - "required": [ - "window_id" - ], - "type": "object" - }, - "outputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] - }, - "name": { - "type": "string" - }, - "target": { - "type": "string" + "on_error": { + "$ref": "#/$defs/OnError", + "default": "stop", + "description": "`stop`, the default, ends at the first refused row; `continue` sends\nthe rest." }, - "value": { - "type": "string" + "operations": { + "description": "The rows to send, in order, 1 to 64.", + "items": { + "$ref": "#/$defs/SendOperation" + }, + "type": "array" } }, "required": [ - "name" + "operations" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Set synchronized panes" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": true, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Sets the window synchronization default (synchronize-panes); pane-level overrides still decide which panes receive later input.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "outputSchema": { + "$defs": { + "BatchItem": { "properties": { - "enabled": { - "description": "whether pane input is synchronized", + "error": { + "anyOf": [ + { + "$ref": "#/$defs/ErrorData" + }, + { + "type": "null" + } + ] + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "result": true, + "resultTruncated": { "type": "boolean" }, - "window_id": { - "description": "the window id, such as @1", + "success": { + "type": "boolean" + }, + "tool": { "type": "string" } }, "required": [ - "window_id" + "index", + "tool", + "success", + "resultTruncated" ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "set_synchronize_panes", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, + "ErrorCode": { + "description": "Standard JSON-RPC error codes used throughout the MCP protocol.\n\nThese codes follow the JSON-RPC 2.0 specification and provide\nstandardized error reporting across all MCP implementations.", + "format": "int32", + "type": "integer" + }, + "ErrorData": { + "description": "Error information for JSON-RPC error responses.\n\nThis structure follows the JSON-RPC 2.0 specification for error reporting,\nproviding a standardized way to communicate errors between clients and servers.", "properties": { - "enabled": { - "type": [ - "null", - "boolean" - ] - }, - "name": { - "type": "string" + "code": { + "$ref": "#/$defs/ErrorCode", + "description": "The error type that occurred (using standard JSON-RPC error codes)" }, - "target": { - "type": "string" + "data": { + "description": "Additional information about the error. The value of this member is defined by the\nsender (e.g. detailed error information, nested errors etc.)." }, - "value": { + "message": { + "description": "A short description of the error. The message SHOULD be limited to a concise single sentence.", "type": "string" } }, "required": [ - "name" + "code", + "message" ], "type": "object" }, - "processReach": "none", - "title": "Set synchronized panes", - "tmuxEffects": [ - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "show_environment", - "wireName": "show_environment", - "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 275 - }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Reads the environment tmux passes to processes.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "a session name; omit for the only session", + "OnError": { + "enum": [ + "stop", + "continue" + ], "type": "string" } }, - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "sessionName": { - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { + "failed": { + "minimum": 0, "type": "integer" }, - "valuesWithheld": { - "type": "boolean" + "onError": { + "$ref": "#/$defs/OnError" }, - "variables": { + "results": { "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "removed": { - "type": "boolean" - }, - "scope": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "name", - "scope" - ], - "type": "object" + "$ref": "#/$defs/BatchItem" }, + "type": "array" + }, + "stoppedAt": { + "minimum": 0, "type": [ - "array" + "integer", + "null" ] + }, + "succeeded": { + "minimum": 0, + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "minimum": 0, + "type": "integer" } }, "required": [ - "sessionName", - "variables", - "truncated" + "results", + "succeeded", + "failed", + "truncated", + "truncatedBytes", + "onError" ], "type": "object" }, "annotations": { "destructiveHint": true, + "idempotentHint": false, "openWorldHint": true, - "title": "Show tmux environment" + "readOnlyHint": false, + "title": "Send Keys Batch" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Reads the environment tmux passes to processes.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "a session name; omit for the only session", - "type": "string" - } - }, - "type": "object" - }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "show_environment", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ - "process-environment" + "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "sessionName": { - "type": "string" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" - }, - "valuesWithheld": { - "type": "boolean" - }, - "variables": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "removed": { - "type": "boolean" - }, - "scope": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "name", - "scope" - ], - "type": "object" - }, - "type": [ - "array" - ] - } - }, - "required": [ - "sessionName", - "variables", - "truncated" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show tmux environment", + "processReach": "pane-input", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "show_hooks", - "wireName": "show_hooks", + "name": "set_history_limit", + "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 283 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 895 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads configured tmux hooks.", + "description": "Set the scrollback history limit for a session or its global default. From tmux 3.7 existing panes take it too, and lowering it discards their scrollback past the new limit. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "name": { - "description": "one hook name; omit to read all hooks in the scope", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" + "limit": { + "description": "Lines of scrollback to keep per pane.", + "minimum": 0, + "type": "integer" }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" + "session": { + "description": "The session to change, by `$`-prefixed id or name. Omit to change the\nglobal default.", + "type": [ + "string", + "null" + ] } }, + "required": [ + "limit" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "hooks": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "name", - "command" - ], - "type": "object" - }, + "name": { + "type": "string" + }, + "target": { "type": [ - "array" + "string", + "null" ] }, - "scope": { + "value": { "type": "string" } }, "required": [ - "scope", - "hooks" + "name", + "value" ], "type": "object" }, "annotations": { "destructiveHint": true, - "openWorldHint": true, - "title": "Show hooks" + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Set History Limit" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads configured tmux hooks.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "description": "one hook name; omit to read all hooks in the scope", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" - } - }, - "type": "object" - }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "show_hooks", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ - "configured-command" + "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "hooks": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "name", - "command" - ], - "type": "object" - }, - "type": [ - "array" - ] - }, - "scope": { - "type": "string" - } - }, - "required": [ - "scope", - "hooks" - ], - "type": "object" - }, "processReach": "none", - "title": "Show hooks", "tmuxEffects": [ - "observe" + "change", + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "show_option", - "wireName": "show_option", + "name": "set_mouse_enabled", + "wireName": "set_mouse_enabled", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 263 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 864 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads one named tmux option.", + "description": "Set mouse handling for a session or the global session default. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "effective": { - "description": "include an inherited value", + "enabled": { + "description": "`true` turns mouse handling on; `false` turns it off.", "type": "boolean" }, - "name": { - "description": "the exact option name", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" + "session": { + "description": "The session to change, by `$`-prefixed id or name. Omit to change the\nglobal default.", + "type": [ + "string", + "null" + ] } }, "required": [ - "name" + "enabled" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "inherited": { - "type": "boolean" - }, "name": { "type": "string" }, - "scope": { - "type": "string" - }, - "set": { - "type": "boolean" + "target": { + "type": [ + "string", + "null" + ] }, "value": { "type": "string" @@ -35553,192 +36093,150 @@ }, "required": [ "name", - "scope", - "value", - "set" + "value" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Show one option" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Set Mouse Enabled" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads one named tmux option.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "effective": { - "description": "include an inherited value", - "type": "boolean" - }, - "name": { - "description": "the exact option name", - "type": "string" - }, - "scope": { - "description": "global, server, session, window, or pane", - "enum": [ - "", - "global", - "server", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "the target required by session, window, and pane scopes", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "show_option", - "nestedAuthority": null, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "configured-command" + "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "inherited": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "scope": { - "type": "string" - }, - "set": { - "type": "boolean" - }, - "value": { - "type": "string" - } - }, - "required": [ - "name", - "scope", - "value", - "set" - ], - "type": "object" - }, "processReach": "none", - "title": "Show one option", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "signal_channel", - "wireName": "signal_channel", + "name": "set_pane_title", + "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 412 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 841 }, - "description": "Change tmux state; no client-supplied executable input. Signals one server-wide tmux channel.", + "description": "Set one pane's title. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "channel": { - "description": "the tmux wait-for channel to signal", + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" + }, + "title": { + "description": "The new title, stored as given.", "type": "string" } }, "required": [ - "channel" + "pane", + "title" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" + }, + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "channel": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + }, + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", "type": "string" } }, "required": [ - "channel" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Signal a channel" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Set Pane Title" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Signals one server-wide tmux channel.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "description": "the tmux wait-for channel to signal", - "type": "string" - } - }, - "required": [ - "channel" - ], - "type": "object" + "inputLiteralization": { + "title": "double-hash-once" }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "signal_channel", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, "processReach": "none", - "title": "Signal a channel", "tmuxEffects": [ "change" ], @@ -35747,297 +36245,292 @@ } }, { - "name": "snapshot_pane", - "wireName": "snapshot_pane", + "name": "set_synchronize_panes", + "wireName": "set_synchronize_panes", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 210 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 1045 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane metadata and bounded terminal content together.", + "description": "Set the window default for synchronized pane input. Individual pane overrides still determine the effective configured cohort, so enabling this can amplify what one send_keys call reaches. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "history": { - "description": "include scrollback as well as the visible screen", + "enabled": { + "description": "`true` turns synchronized input on; `false` turns it off.", "type": "boolean" }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", + "window": { + "description": "The `@`-prefixed window id.", "type": "string" } }, "required": [ - "pane_id" + "window", + "enabled" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "dead": { - "type": "boolean" + "name": { + "type": "string" }, - "exitStatus": { + "target": { "type": [ - "null", - "integer" + "string", + "null" ] }, - "lines": { - "items": { - "type": "string" - }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Set Synchronize Panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": true, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "show_environment", + "wireName": "show_environment", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 510 + }, + "description": "List the variables tmux hands to processes it starts, for the server or for one session, and whether each is set or marked for removal. Values are withheld: a tmux server inherits the environment of the shell that started it, tokens and keys included. A value is returned only for a name the operator listed in LIBTMUX_ENVIRONMENT_VALUES at startup, and is then returned in clear. This is not the environment of anything already running: a pane started before a change keeps what it was given. Read the tmux environment; accepts no client-supplied executable input. Values are withheld unless the operator allowed the name.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "session": { + "description": "The session whose environment to read, by `$`-prefixed id or name.\n\nOmit for the server's own.", "type": [ - "array" + "string", + "null" ] - }, - "pane": { - "additionalProperties": false, + } + }, + "type": "object" + }, + "outputSchema": { + "$defs": { + "EnvironmentEntry": { + "description": "One tmux environment entry.", "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { + "name": { + "description": "The variable name.", "type": "string" }, - "index": { - "type": "integer" + "state": { + "$ref": "#/$defs/EnvironmentState", + "description": "Whether the name holds a value or is marked for removal." }, - "isCaller": { + "value": { + "description": "The value, only for a set variable whose name the operator allowed in\n`LIBTMUX_ENVIRONMENT_VALUES` at startup.", "type": [ - "null", - "boolean" + "string", + "null" ] }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" + "withheld": { + "description": "True for a set variable whose value was not returned because the\noperator did not allow its name.", + "type": "boolean" } }, "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" + "name", + "state", + "withheld" ], "type": "object" }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" + "EnvironmentState": { + "description": "What tmux holds under one environment name.", + "oneOf": [ + { + "const": "set", + "description": "tmux holds a value and hands it to processes it starts.", + "type": "string" + }, + { + "const": "removed", + "description": "tmux removes the name from the environment of processes it starts.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "entries": { + "description": "The entries, in tmux's own order.", + "items": { + "$ref": "#/$defs/EnvironmentEntry" + }, + "type": "array" }, - "truncatedLines": { - "type": "integer" + "session": { + "description": "The session the environment belongs to, or absent for the server's.", + "type": [ + "string", + "null" + ] } }, "required": [ - "lines", - "pane", - "dead", - "truncated" + "entries" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Snapshot a pane" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Show tmux Environment" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane metadata and bounded terminal content together.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "process-environment" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "show_hooks", + "wireName": "show_hooks", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 560 + }, + "description": "List the hooks tmux runs when something happens on the server, such as a pane exiting. This tool does not set hooks. Hooks set through another path remain in their server or session until unset; configuration files persist them across server restarts. Reach for this when tmux does something no tool here asked for. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "session": { + "description": "The session whose hooks to read, by `$`-prefixed id or name. Omit for\nthe server's own.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "$defs": { + "Hook": { + "description": "One tmux hook.", "properties": { - "history": { - "description": "include scrollback as well as the visible screen", - "type": "boolean" + "command": { + "description": "The command tmux runs.", + "type": "string" }, - "max_lines": { - "description": "maximum lines, keeping the newest", - "type": "integer" + "index": { + "description": "Its index, when the hook is an array.", + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "pane_id": { - "description": "the pane id, such as %1", + "name": { + "description": "The hook name, such as `pane-exited`.", "type": "string" } }, "required": [ - "pane_id" + "name", + "command" ], "type": "object" - }, + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "hooks": { + "description": "The hooks, in tmux's own order.", + "items": { + "$ref": "#/$defs/Hook" + }, + "type": "array" + } + }, + "required": [ + "hooks" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Show tmux Hooks" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "snapshot_pane", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "terminal-content", - "tmux-metadata" + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "dead": { - "type": "boolean" - }, - "exitStatus": { - "type": [ - "null", - "integer" - ] - }, - "lines": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "pane": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "geometry": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "left": { - "type": "integer" - }, - "top": { - "type": "integer" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "left", - "top", - "width", - "height" - ], - "type": "object" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isCaller": { - "type": [ - "null", - "boolean" - ] - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "session", - "window", - "windowId", - "index", - "currentCommand", - "active", - "geometry", - "isCaller" - ], - "type": "object" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" - } - }, - "required": [ - "lines", - "pane", - "dead", - "truncated" - ], - "type": "object" - }, "processReach": "none", - "title": "Snapshot a pane", "tmuxEffects": [ "observe" ], @@ -36046,247 +36539,176 @@ } }, { - "name": "split_window", - "wireName": "split_window", + "name": "show_option", + "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 468 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 457 }, - "description": "Start a pane's configured process; accepts no command payload. Creates a pane whose configured process starts after the split.", + "description": "Read a tmux option, such as history-limit or a user option like @theme. Name the scope the option lives in; global-session is what tmux uses when a command names no target. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": { - "direction": { - "description": "below, above, left, or right", + "$defs": { + "OptionScopeSchema": { "enum": [ - "", - "below", - "above", - "right", - "left" + "server", + "global-session", + "global-window", + "session", + "window", + "pane" ], "type": "string" - }, - "pane_id": { - "description": "the pane id, such as %1", + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "name": { + "description": "The option name, such as `history-limit` or a user option like `@theme`.", "type": "string" }, - "percent": { - "description": "share of the split occupied by the new pane", - "type": "integer" + "scope": { + "anyOf": [ + { + "$ref": "#/$defs/OptionScopeSchema" + }, + { + "type": "null" + } + ], + "description": "Which tmux object the option belongs to.\n\nOne of `server`, `global-session`, `global-window`, `session`,\n`window`, or `pane`. Defaults to `global-session`, which is what\nsetting an option without a target means in tmux." }, - "start_directory": { - "description": "an absolute literal start directory", - "type": "string" + "target": { + "description": "The `$`, `@` or `%`-prefixed id, for the scopes that need one. Omit\nfor the others.", + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id" + "name" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "paneId": { + "name": { + "description": "The option name.", "type": "string" + }, + "value": { + "description": "Its value, absent when it has never been set at that scope.", + "type": [ + "string", + "null" + ] } }, "required": [ - "paneId" + "name" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Split a window" + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": false, + "readOnlyHint": true, + "title": "Read tmux Option" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Creates a pane whose configured process starts after the split.", "inputLiteralization": { - "start_directory": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "direction": { - "description": "below, above, left, or right", - "enum": [ - "", - "below", - "above", - "right", - "left" - ], - "type": "string" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "percent": { - "description": "share of the split occupied by the new pane", - "type": "integer" - }, - "start_directory": { - "description": "an absolute literal start directory", - "type": "string" - } - }, - "required": [ - "pane_id" - ], - "type": "object" + "name": "double-hash-once" }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "split_window", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Split a window", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "swap_pane", - "wireName": "swap_pane", + "name": "signal_channel", + "wireName": "signal_channel", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 386 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/control.rs", + "line": 733 }, - "description": "Change tmux state; no client-supplied executable input. Swaps the positions of two panes.", + "description": "Signal a tmux wait-for channel, releasing every current waiter. With no waiter, one signal is latched; signalling the same channel again clears that latch. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "other_pane_id": { - "description": "the other pane id, such as %2", + "channel": { + "description": "The channel name, which is any string both sides agree on.", "type": "string" }, - "pane_id": { - "description": "one pane id, such as %1", - "type": "string" + "seconds": { + "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", + "minimum": 0, + "type": [ + "integer", + "null" + ] } }, "required": [ - "pane_id", - "other_pane_id" + "channel" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "paneId": { - "type": "string" - }, - "withPaneId": { + "channel": { + "description": "The channel that was signalled.", "type": "string" } }, "required": [ - "paneId", - "withPaneId" + "channel" ], "type": "object" }, "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Swap panes" + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Signal Channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Swaps the positions of two panes.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "other_pane_id": { - "description": "the other pane id, such as %2", - "type": "string" - }, - "pane_id": { - "description": "one pane id, such as %1", - "type": "string" - } - }, - "required": [ - "pane_id", - "other_pane_id" - ], - "type": "object" - }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "swap_pane", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - }, - "withPaneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "withPaneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Swap panes", "tmuxEffects": [ - "observe", "change" ], "toolset": "manage" @@ -36294,449 +36716,789 @@ } }, { - "name": "wait_for_channel", - "wireName": "wait_for_channel", + "name": "snapshot_pane", + "wireName": "snapshot_pane", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 402 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/inspect.rs", + "line": 257 }, - "description": "Change tmux state; no client-supplied executable input. Waits on tmux's channel state with a bounded timeout.", + "description": "Read pane content with cursor position, mode state, and scroll position in one reply. The state query and capture are separate, so the result is not atomic. Prefer this over capture_pane when you need to reason about where the pane is rather than only what it says -- a cursor at column zero on a fresh line is a shell waiting, and a pane in a mode may route keys to tmux instead of the workload. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "channel": { - "description": "a server-wide tmux channel name", - "type": "string" - }, - "drain_first": { - "description": "consume a pending signal before waiting", + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen.", "type": "boolean" }, - "timeout": { - "description": "seconds to wait before giving up", + "max_lines": { + "description": "The most content lines to return, oldest dropped first.\n\nDefaults to the whole visible screen. The end of a pane is what says\nwhat just happened, so a limit keeps the end.", "minimum": 0, - "type": "number" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "effectiveTimeoutSeconds": { - "type": "integer" - }, - "signalled": { - "type": "boolean" + "type": [ + "integer", + "null" + ] }, - "timeoutClamped": { - "type": "boolean" + "pane": { + "description": "The `%`-prefixed pane id.", + "type": "string" } }, "required": [ - "signalled", - "effectiveTimeoutSeconds" + "pane" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "openWorldHint": true, - "title": "Wait for a channel" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Waits on tmux's channel state with a bounded timeout.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, + "outputSchema": { + "$defs": { + "PaneView": { + "description": "One pane, as the protocol sees it.", "properties": { - "channel": { - "description": "a server-wide tmux channel name", + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" + }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", "type": "string" }, - "drain_first": { - "description": "consume a pending signal before waiting", - "type": "boolean" + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] }, - "timeout": { - "description": "seconds to wait before giving up", - "minimum": 0, - "type": "number" + "window_id": { + "description": "The window that contains the pane.", + "type": "string" } }, "required": [ - "channel" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "wait_for_channel", - "nestedAuthority": null, - "outputClasses": [ - "tmux-metadata" - ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "effectiveTimeoutSeconds": { - "type": "integer" + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" }, - "signalled": { - "type": "boolean" + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" }, - "timeoutClamped": { - "type": "boolean" - } - }, - "required": [ - "signalled", - "effectiveTimeoutSeconds" - ], - "type": "object" + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "content": { + "description": "What the pane is showing.", + "type": "string" + }, + "cursor_x": { + "description": "Where the cursor sits, counting from the left.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "cursor_y": { + "description": "Where the cursor sits, counting from the top.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "dead": { + "description": "Whether the process in it has ended.", + "type": "boolean" + }, + "dropped": { + "description": "How many older lines were dropped to honour `max_lines`.", + "minimum": 0, + "type": "integer" + }, + "height": { + "description": "How tall it is, in rows.", + "minimum": 0, + "type": "integer" + }, + "in_mode": { + "description": "Whether the pane is in a mode, where keys navigate rather than type.", + "type": "boolean" + }, + "lines": { + "description": "How many lines of it are reported.", + "minimum": 0, + "type": "integer" + }, + "mode": { + "description": "Which mode, when it is in one.", + "type": [ + "string", + "null" + ] + }, + "pane": { + "$ref": "#/$defs/PaneView", + "description": "The pane itself." + }, + "scroll_position": { + "description": "How far it is scrolled back, when it is in copy mode.", + "format": "int32", + "type": [ + "integer", + "null" + ] }, + "width": { + "description": "How wide it is, in columns.", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "pane", + "width", + "height", + "in_mode", + "dead", + "content", + "lines", + "dropped" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Snapshot Pane State" + }, + "meta": { + "anthropic/alwaysLoad": true, + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "terminal-content" + ], "processReach": "none", - "title": "Wait for a channel", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "wait_for_text", - "wireName": "wait_for_text", + "name": "split_window", + "wireName": "split_window", "source": { - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "file": "mcp/manifest_catalog.go", - "line": 239 + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 964 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Waits for new pane output without accepting executable input.", + "description": "Split a window and start the configured process with no command payload. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { + "$defs": { + "SplitDirectionSchema": { + "enum": [ + "above", + "below", + "left", + "right" + ], + "type": "string" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", - "type": "string" - }, - "max_lines": { - "description": "maximum observed lines to return", - "type": "integer" + "direction": { + "anyOf": [ + { + "$ref": "#/$defs/SplitDirectionSchema" + }, + { + "type": "null" + } + ], + "description": "Where the new pane goes relative to `pane`. Defaults to `below`." }, - "pane_id": { - "description": "the pane id, such as %1", + "pane": { + "description": "The `%`-prefixed pane to split.", "type": "string" }, - "patterns": { - "description": "text to wait for; any one ends the wait", - "items": { - "maxLength": 4096, - "type": "string" - }, - "maxItems": 32, + "percent": { + "description": "The new pane's share of the split, 1 to 100. Defaults to half.", + "minimum": 0, "type": [ - "null", - "array" + "integer", + "null" ] }, - "regex": { - "description": "treat patterns and stops as regular expressions", - "type": "boolean" - }, - "stop": { - "description": "failure text; any one ends the wait", - "items": { - "maxLength": 4096, - "type": "string" - }, - "maxItems": 32, + "start_directory": { + "description": "The new pane's working directory. Omit for the directory this MCP\nserver started in, not `pane`'s current directory.", "type": [ - "null", - "array" + "string", + "null" ] - }, - "timeout": { - "description": "seconds to wait before giving up", - "minimum": 0, - "type": "number" } }, "required": [ - "pane_id" + "pane" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", + "type": "string" + }, + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", + "type": "string" + }, + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { - "effectiveTimeoutSeconds": { - "type": "integer" - }, - "elapsedSeconds": { - "type": "number" - }, - "entryNote": { - "type": "string" - }, - "found": { + "active": { + "description": "Whether this is the window's active pane.", "type": "boolean" }, - "lines": { - "items": { - "type": "string" - }, + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", "type": [ - "array" + "string", + "null" ] }, - "matched": { + "id": { + "description": "The `%`-prefixed tmux identity.", "type": "string" }, - "matchedAtEntry": { - "type": "boolean" - }, - "outcome": { - "type": "string" + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] }, - "paneId": { + "window_id": { + "description": "The window that contains the pane.", "type": "string" - }, - "pendingInputOnly": { - "type": "boolean" - }, - "timeoutClamped": { - "type": "boolean" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" } }, "required": [ - "paneId", - "outcome", - "found", - "matchedAtEntry", - "pendingInputOnly", - "elapsedSeconds", - "effectiveTimeoutSeconds", - "truncated" + "id", + "window_id", + "active", + "caller" ], "type": "object" }, "annotations": { - "destructiveHint": true, + "destructiveHint": false, + "idempotentHint": false, "openWorldHint": true, - "title": "Wait for pane text" + "readOnlyHint": false, + "title": "Split Window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Waits for new pane output without accepting executable input.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "a cursor returned by an earlier capture", - "type": "string" - }, - "max_lines": { - "description": "maximum observed lines to return", - "type": "integer" - }, - "pane_id": { - "description": "the pane id, such as %1", - "type": "string" - }, - "patterns": { - "description": "text to wait for; any one ends the wait", - "items": { - "maxLength": 4096, - "type": "string" - }, - "maxItems": 32, - "type": [ - "null", - "array" - ] - }, - "regex": { - "description": "treat patterns and stops as regular expressions", - "type": "boolean" - }, - "stop": { - "description": "failure text; any one ends the wait", - "items": { - "maxLength": 4096, - "type": "string" - }, - "maxItems": 32, - "type": [ - "null", - "array" - ] - }, - "timeout": { - "description": "seconds to wait before giving up", - "minimum": 0, - "type": "number" - } - }, - "required": [ - "pane_id" - ], - "type": "object" + "inputLiteralization": { + "start_directory": "double-hash-once" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "wait_for_text", - "nestedAuthority": null, + "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "effectiveTimeoutSeconds": { - "type": "integer" - }, - "elapsedSeconds": { - "type": "number" - }, - "entryNote": { - "type": "string" - }, - "found": { - "type": "boolean" - }, - "lines": { - "items": { - "type": "string" - }, - "type": [ - "array" - ] - }, - "matched": { + "processReach": "configured-process", + "tmuxEffects": [ + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "swap_pane", + "wireName": "swap_pane", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/contract.rs", + "line": 817 + }, + "description": "Swap the positions of two panes. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "source_pane": { + "description": "The `%`-prefixed pane id to move; the result describes it.", + "type": "string" + }, + "target_pane": { + "description": "The `%`-prefixed pane id it trades places with.", + "type": "string" + } + }, + "required": [ + "source_pane", + "target_pane" + ], + "type": "object" + }, + "outputSchema": { + "$defs": { + "Relation": { + "description": "How a pane relates to the process answering the request.\n\nThree values rather than a boolean, because \"not the caller's pane\" and\n\"there is no caller\" are different answers and an agent acts differently on\neach.", + "oneOf": [ + { + "const": "unknown", + "description": "This process is not running inside tmux, so no pane is its own.", "type": "string" }, - "matchedAtEntry": { - "type": "boolean" - }, - "outcome": { + { + "const": "self", + "description": "Confirmed: the same tmux server, and the same pane.", "type": "string" }, - "paneId": { + { + "const": "other", + "description": "Some other pane, or a pane this crate cannot prove is the caller's.", "type": "string" - }, - "pendingInputOnly": { - "type": "boolean" - }, - "timeoutClamped": { - "type": "boolean" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - }, - "truncatedLines": { - "type": "integer" } - }, - "required": [ - "paneId", - "outcome", - "found", - "matchedAtEntry", - "pendingInputOnly", - "elapsedSeconds", - "effectiveTimeoutSeconds", - "truncated" - ], - "type": "object" + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "active": { + "description": "Whether this is the window's active pane.", + "type": "boolean" }, - "processReach": "none", - "title": "Wait for pane text", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - } - ], - "wirePrefix": "", - "selectable": true, - "source": "mcp", - "repo": "libtmux/libtmux-go", - "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", - "selection": { - "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" - }, - "protocol": { - "capabilities": { - "logging": {}, - "resources": { - "listChanged": true + "caller": { + "$ref": "#/$defs/Relation", + "description": "Whether this is the pane the MCP server itself runs in.\n\n`self` only on a confirmed match of both socket and pane id; `other`\nfor every pane that is not, including one this crate cannot prove\neither way; `unknown` when the server is not running inside tmux, so\nthe question has no answer." + }, + "command": { + "description": "The command currently running.", + "type": [ + "string", + "null" + ] + }, + "id": { + "description": "The `%`-prefixed tmux identity.", + "type": "string" + }, + "path": { + "description": "The pane's working directory.", + "type": [ + "string", + "null" + ] + }, + "window_id": { + "description": "The window that contains the pane.", + "type": "string" + } + }, + "required": [ + "id", + "window_id", + "active", + "caller" + ], + "type": "object" }, - "tools": { - "listChanged": true + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Swap Panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "wait_for_channel", + "wireName": "wait_for_channel", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/observe.rs", + "line": 490 + }, + "description": "Block until something signals a tmux wait-for channel. A pending signal is consumed. Pair this with a shell command that ends in `tmux wait-for -S ` to synchronise with work this server did not start. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "channel": { + "description": "The channel name, which is any string both sides agree on.", + "type": "string" + }, + "seconds": { + "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "channel" + ], + "type": "object" + }, + "outputSchema": { + "$defs": { + "ChannelWaitOutcomeSchema": { + "enum": [ + "signalled", + "deadline" + ], + "type": "string" + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "channel": { + "description": "The channel that was waited on.", + "type": "string" + }, + "outcome": { + "$ref": "#/$defs/ChannelWaitOutcomeSchema", + "description": "`signalled` or `deadline`." + } + }, + "required": [ + "channel", + "outcome" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": false, + "openWorldHint": false, + "readOnlyHint": false, + "title": "Wait For Channel" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "wait_for_text", + "wireName": "wait_for_text", + "source": { + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "file": "crates/tmux-mcp/src/tools/observe.rs", + "line": 344 + }, + "description": "Wait until a pane writes matching text. Reads the pane's live output stream, so text that scrolls past between checks is still seen. The returned text is that raw stream, not the rendered screen: a line redrawn in place repeats; capture_pane shows the screen. Prefer run_shell_command for commands you are sending yourself: it reports an exit status instead of guessing from output. Use this for output you did not author, such as a server logging that it is ready. A line this server itself types and submits -- with send_keys, paste_text, or run_shell_command's own dispatch -- is discounted from a match for a short time afterward, so waiting for text you just sent does not match its own echo; output that happens to repeat the same words still does. A submitted line that wrapped across terminal rows when it was typed is not discounted. A pattern still on the row being typed into, not yet submitted, reports outcome pending instead of matched, and one already on a completed row before this call attached reports present_at_entry. Waiting owns an observer client until the wait ends. Each list accepts at most 32 patterns, each at most 4,096 bytes, using Rust's linear-time regex engine. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "schemaStatus": "runtime", + "inputSchema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "match_case": { + "default": false, + "description": "Match case. Off by default.", + "type": "boolean" + }, + "pane": { + "description": "The `%`-prefixed pane to watch.", + "type": "string" + }, + "patterns": { + "description": "Text that ends the wait successfully. Omit to wait for any output.", + "items": { + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "null" + ] + }, + "regex": { + "default": false, + "description": "Read both lists as regular expressions rather than literal text.", + "type": "boolean" + }, + "seconds": { + "description": "How long to wait, in seconds. Defaults to 30, capped at 600.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "stop": { + "description": "Text that ends the wait as a failure, reported as `stopped`. Omit for\nnone.\n\nGive the failure markers you already know — `error:`, `Traceback` — and\na failed run returns at once instead of at the deadline.", + "items": { + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "null" + ] + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "outputSchema": { + "$defs": { + "WaitOutcome": { + "description": "How a wait for text finished.", + "oneOf": [ + { + "const": "present_at_entry", + "description": "A wanted pattern was already in the pane's output before this began\nwatching, on a row above the one still being typed into, and is not\na line this server itself submitted moments earlier.\n\nA wait only sees what a pane writes after it starts, so this is never\nfolded into [`Self::Matched`]: the same pattern printed moments\nearlier -- an earlier command's own output, say -- can already be\nsitting there, and a caller that treated that as a fresh match would\nact on something that happened before this call, not because of it.\nA line this server typed and submitted with `send_keys` is discounted\nrather than reported here or as [`Self::Matched`], for a short time\nafter it was submitted.", + "type": "string" + }, + { + "const": "pending", + "description": "A wanted pattern's only occurrence is the row still being typed\ninto: text this server (or a person sharing the pane) sent and has\nnot submitted, not anything that has run.\n\nSubmit it, then wait again: the next wait sees the command's own\noutput on a row above a new one still being typed into, which is\n[`Self::PresentAtEntry`] or [`Self::Matched`] depending on when it\narrived, never this -- and never the submitted line's own echo,\nwhich stays discounted for a short time after.", + "type": "string" + }, + { + "const": "matched", + "description": "A pattern matched, in output that arrived after the wait attached.", + "type": "string" + }, + { + "const": "stopped", + "description": "A stop pattern matched, so the wait ended early.", + "type": "string" + }, + { + "const": "deadline", + "description": "The time the caller allowed ran out.", + "type": "string" + }, + { + "const": "pane_closed", + "description": "The pane stopped writing for good.", + "type": "string" + }, + { + "const": "cancelled", + "description": "The client withdrew the request while the wait was still running.", + "type": "string" + } + ] + } + }, + "$schema": "https://json-schema.org/draft/2020-12/schema", + "properties": { + "bytes": { + "description": "How many bytes arrived, before filtering or truncation.", + "minimum": 0, + "type": "integer" + }, + "matched_index": { + "description": "Which pattern matched, indexed into the list it came from.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "matched_pattern": { + "description": "The pattern that matched, as it was given.", + "type": [ + "string", + "null" + ] + }, + "outcome": { + "$ref": "#/$defs/WaitOutcome", + "description": "How the wait finished." + }, + "pane": { + "description": "The pane that was watched.", + "type": "string" + }, + "text": { + "description": "What the pane wrote, with escape sequences removed.\n\nThis is the raw output stream, not the rendered screen: a line redrawn\nin place, such as a line editor's echo, repeats. `capture_pane` shows\nthe screen.", + "type": "string" + } + }, + "required": [ + "pane", + "outcome", + "text", + "bytes" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true, + "readOnlyHint": true, + "title": "Wait For Pane Text" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "terminal-content" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } } + } + ], + "wirePrefix": "", + "selectable": true, + "source": "crates/tmux-mcp/src/tools", + "repo": "libtmux/libtmux-rs", + "revision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "extractedRevision": "a6fc2a65674177b92b17fa380757155d2ba150fd", + "selection": { + "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" + }, + "protocol": { + "capabilities": { + "resources": {}, + "tools": {} }, "prompts": [], "protocolVersion": "2025-11-25", "resources": [ { - "description": "The selected socket, effective tools, schemas, input literalization, and aggregate authority.", + "description": "The startup-frozen effective tool surface and each tool's direct authority.", "mimeType": "application/json", - "name": "tmux capabilities", - "title": "Startup-frozen tmux MCP capabilities", + "name": "capabilities", "uri": "tmux://capabilities" } ], "resourceTemplates": [], "serverInfo": { - "name": "libtmux", - "version": "v0.0.1-alpha.12" + "name": "rmcp", + "version": "3.1.2" } } }, - "java": { + "go": { "tools": [ "call_read_tools_batch", "capture_pane", @@ -36789,19 +37551,19 @@ "name": "call_read_tools_batch", "wireName": "call_read_tools_batch", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 391 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 303 }, - "description": "Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval, and its nested authority is disclosed. The complete JSON-RPC response is capped at 1,000,000 bytes; a removed nested envelope is marked on its row and counted in truncatedBytes. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval. Retained rows contain full nested envelopes, oversized results are marked resultTruncated, and the complete JSON-RPC response is at most 1,000,000 bytes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "stop or continue; defaults to stop.", + "on_error": { + "description": "stop or continue; defaults to stop", "enum": [ "stop", "continue" @@ -36809,7 +37571,7 @@ "type": "string" }, "operations": { - "description": "Typed calls within the disclosed nested authority.", + "description": "up to sixteen inspect operations", "items": { "oneOf": [ { @@ -36817,8 +37579,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -36837,16 +37597,11 @@ "arguments": { "additionalProperties": false, "properties": { - "session_id": { - "description": "Only windows in this session, such as $1.", - "type": "string" - }, - "session_name": { - "description": "Only windows in the session with this exact name.", + "session": { + "description": "only windows in this session name", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -36864,8 +37619,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -36883,8 +37636,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -36904,7 +37655,7 @@ "additionalProperties": false, "properties": { "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -36930,7 +37681,7 @@ "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -36956,7 +37707,7 @@ "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -36982,17 +37733,15 @@ "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37018,16 +37767,15 @@ "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "description": "maximum new lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37053,17 +37801,15 @@ "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37089,23 +37835,22 @@ "additionalProperties": false, "properties": { "max_lines": { - "default": 200, - "description": "Maximum matches across all panes. Defaults to 200.", + "description": "maximum matching panes to return", + "maximum": 200, "type": "integer" }, "max_matches_per_pane": { - "default": 5, - "description": "Maximum matching lines per pane. Defaults to 5.", + "description": "maximum matching lines per pane", + "maximum": 200, "type": "integer" }, "pattern": { - "description": "The bounded text or regular expression to search for.", + "description": "bounded text or regular expression to search for", "maxLength": 4096, "type": "string" }, "regex": { - "default": false, - "description": "Treat pattern as a regular expression. Defaults to false.", + "description": "treat pattern as a regular expression", "type": "boolean" } }, @@ -37131,11 +37876,17 @@ "additionalProperties": false, "properties": { "position": { - "description": "top-left, top-right, bottom-left or bottom-right.", + "description": "top-left, top-right, bottom-left, or bottom-right", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -37162,20 +37913,14 @@ "additionalProperties": false, "properties": { "names": { - "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", "items": { - "maxLength": 128, "type": "string" }, - "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] - }, - "pane": { - "description": "An optional pane context.", - "type": "string" } }, "required": [ @@ -37200,20 +37945,27 @@ "additionalProperties": false, "properties": { "effective": { - "default": true, - "description": "Include an inherited value. Defaults to true.", + "description": "include an inherited value", "type": "boolean" }, "name": { - "description": "The exact option name.", + "description": "the exact option name", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, @@ -37238,16 +37990,11 @@ "arguments": { "additionalProperties": false, "properties": { - "session_id": { - "description": "A session, such as $1; omit both for the global environment.", - "type": "string" - }, - "session_name": { - "description": "A session's exact name, in place of session_id.", + "session": { + "description": "a session name; omit for the only session", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -37267,19 +38014,26 @@ "additionalProperties": false, "properties": { "name": { - "description": "One hook name; omit to read all hooks in the scope.", + "description": "one hook name; omit to read all hooks in the scope", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -37296,7 +38050,10 @@ }, "maxItems": 16, "minItems": 1, - "type": "array" + "type": [ + "null", + "array" + ] } }, "required": [ @@ -37318,50 +38075,15 @@ "additionalProperties": false, "properties": { "error": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "type": [ + "null", + "string" ] }, "index": { "type": "integer" }, - "result": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "_meta": { - "type": "object" - }, - "content": { - "items": { - "type": "object" - }, - "type": "array" - }, - "isError": { - "type": "boolean" - }, - "structuredContent": { - "type": "object" - } - }, - "required": [ - "content", - "isError" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, + "result": true, "resultTruncated": { "type": "boolean" }, @@ -37382,16 +38104,14 @@ ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] }, "stoppedAt": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "null" - } + "type": [ + "null", + "integer" ] }, "succeeded": { @@ -37406,20 +38126,18 @@ }, "required": [ "results", + "onError", "succeeded", "failed", "stoppedAt", "truncated", - "truncatedBytes", - "onError" + "truncatedBytes" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Call read tools in a batch" }, "meta": { @@ -37431,13 +38149,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval, and its nested authority is disclosed. The complete JSON-RPC response is capped at 1,000,000 bytes; a removed nested envelope is marked on its row and counted in truncatedBytes. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval. Retained rows contain full nested envelopes, oversized results are marked resultTruncated, and the complete JSON-RPC response is at most 1,000,000 bytes.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "stop or continue; defaults to stop.", + "on_error": { + "description": "stop or continue; defaults to stop", "enum": [ "stop", "continue" @@ -37445,7 +38163,7 @@ "type": "string" }, "operations": { - "description": "Typed calls within the disclosed nested authority.", + "description": "up to sixteen inspect operations", "items": { "oneOf": [ { @@ -37453,8 +38171,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -37473,16 +38189,11 @@ "arguments": { "additionalProperties": false, "properties": { - "session_id": { - "description": "Only windows in this session, such as $1.", - "type": "string" - }, - "session_name": { - "description": "Only windows in the session with this exact name.", + "session": { + "description": "only windows in this session name", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -37500,8 +38211,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -37519,8 +38228,6 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "tool": { @@ -37540,7 +38247,7 @@ "additionalProperties": false, "properties": { "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -37566,7 +38273,7 @@ "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -37592,7 +38299,7 @@ "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37618,17 +38325,15 @@ "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37654,16 +38359,15 @@ "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "description": "maximum new lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37689,17 +38393,15 @@ "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -37725,23 +38427,22 @@ "additionalProperties": false, "properties": { "max_lines": { - "default": 200, - "description": "Maximum matches across all panes. Defaults to 200.", + "description": "maximum matching panes to return", + "maximum": 200, "type": "integer" }, "max_matches_per_pane": { - "default": 5, - "description": "Maximum matching lines per pane. Defaults to 5.", + "description": "maximum matching lines per pane", + "maximum": 200, "type": "integer" }, "pattern": { - "description": "The bounded text or regular expression to search for.", + "description": "bounded text or regular expression to search for", "maxLength": 4096, "type": "string" }, "regex": { - "default": false, - "description": "Treat pattern as a regular expression. Defaults to false.", + "description": "treat pattern as a regular expression", "type": "boolean" } }, @@ -37767,11 +38468,17 @@ "additionalProperties": false, "properties": { "position": { - "description": "top-left, top-right, bottom-left or bottom-right.", + "description": "top-left, top-right, bottom-left, or bottom-right", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -37798,20 +38505,14 @@ "additionalProperties": false, "properties": { "names": { - "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", "items": { - "maxLength": 128, "type": "string" }, - "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] - }, - "pane": { - "description": "An optional pane context.", - "type": "string" } }, "required": [ @@ -37836,20 +38537,27 @@ "additionalProperties": false, "properties": { "effective": { - "default": true, - "description": "Include an inherited value. Defaults to true.", + "description": "include an inherited value", "type": "boolean" }, "name": { - "description": "The exact option name.", + "description": "the exact option name", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, @@ -37874,16 +38582,11 @@ "arguments": { "additionalProperties": false, "properties": { - "session_id": { - "description": "A session, such as $1; omit both for the global environment.", - "type": "string" - }, - "session_name": { - "description": "A session's exact name, in place of session_id.", + "session": { + "description": "a session name; omit for the only session", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -37903,19 +38606,26 @@ "additionalProperties": false, "properties": { "name": { - "description": "One hook name; omit to read all hooks in the scope.", + "description": "one hook name; omit to read all hooks in the scope", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, - "required": [], "type": "object" }, "tool": { @@ -37932,7 +38642,10 @@ }, "maxItems": 16, "minItems": 1, - "type": "array" + "type": [ + "null", + "array" + ] } }, "required": [ @@ -37981,50 +38694,15 @@ "additionalProperties": false, "properties": { "error": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "type": [ + "null", + "string" ] }, "index": { "type": "integer" }, - "result": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "_meta": { - "type": "object" - }, - "content": { - "items": { - "type": "object" - }, - "type": "array" - }, - "isError": { - "type": "boolean" - }, - "structuredContent": { - "type": "object" - } - }, - "required": [ - "content", - "isError" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, + "result": true, "resultTruncated": { "type": "boolean" }, @@ -38045,16 +38723,14 @@ ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] }, "stoppedAt": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "null" - } + "type": [ + "null", + "integer" ] }, "succeeded": { @@ -38069,12 +38745,12 @@ }, "required": [ "results", + "onError", "succeeded", "failed", "stoppedAt", "truncated", - "truncatedBytes", - "onError" + "truncatedBytes" ], "type": "object" }, @@ -38091,29 +38767,27 @@ "name": "capture_pane", "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 134 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 191 }, - "description": "Returns what a pane shows now, its newest lines first to go when bounded, and a cursor for capture_since. Use it to read a pane once. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns bounded pane content and a cursor.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38125,46 +38799,36 @@ "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "lines": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "cursor": { + "paneId": { "type": "string" }, - "lines": { - "type": "integer" + "truncated": { + "type": "boolean" }, - "lines_dropped": { + "truncatedBytes": { "type": "integer" }, - "note": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "truncated": { - "type": "boolean" + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", - "lines", - "content", - "truncated", - "lines_dropped", - "cursor" + "paneId", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Capture a pane" }, "meta": { @@ -38176,23 +38840,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns what a pane shows now, its newest lines first to go when bounded, and a cursor for capture_since. Use it to read a pane once. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns bounded pane content and a cursor.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38204,46 +38866,38 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "capture_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "lines": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "cursor": { + "paneId": { "type": "string" }, - "lines": { - "type": "integer" + "truncated": { + "type": "boolean" }, - "lines_dropped": { + "truncatedBytes": { "type": "integer" }, - "note": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "truncated": { - "type": "boolean" + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", - "lines", - "content", - "truncated", - "lines_dropped", - "cursor" + "paneId", + "truncated" ], "type": "object" }, @@ -38260,28 +38914,27 @@ "name": "capture_since", "wireName": "capture_since", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 153 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 199 }, - "description": "Returns only the output a pane produced after a cursor from capture_pane or an earlier capture_since. Use it to follow a pane across turns without rereading it. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane output produced after a cursor.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "description": "maximum new lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38293,50 +38946,45 @@ "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "cursor": { + "type": "string" + }, + "lines": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "continuous": { + "linesMissed": { "type": "boolean" }, - "cursor": { + "paneId": { "type": "string" }, - "lines_dropped": { - "type": "integer" + "truncated": { + "type": "boolean" }, - "new_lines": { + "truncatedBytes": { "type": "integer" }, - "note": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "truncated": { - "type": "boolean" + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", - "new_lines", - "content", + "paneId", "cursor", - "continuous", - "truncated", - "lines_dropped" + "lines", + "linesMissed", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Capture new pane output" }, "meta": { @@ -38348,22 +38996,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns only the output a pane produced after a cursor from capture_pane or an earlier capture_since. Use it to follow a pane across turns without rereading it. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane output produced after a cursor.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "description": "maximum new lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38375,50 +39022,47 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "capture_since", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "cursor": { + "type": "string" + }, + "lines": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "continuous": { + "linesMissed": { "type": "boolean" }, - "cursor": { + "paneId": { "type": "string" }, - "lines_dropped": { - "type": "integer" + "truncated": { + "type": "boolean" }, - "new_lines": { + "truncatedBytes": { "type": "integer" }, - "note": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "truncated": { - "type": "boolean" + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", - "new_lines", - "content", + "paneId", "cursor", - "continuous", - "truncated", - "lines_dropped" + "lines", + "linesMissed", + "truncated" ], "type": "object" }, @@ -38435,19 +39079,19 @@ "name": "clear_pane_scrollback", "wireName": "clear_pane_scrollback", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", - "line": 25 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 565 }, - "description": "Deletes retained scrollback from one pane. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes retained scrollback from one pane.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38459,24 +39103,18 @@ "outputSchema": { "additionalProperties": false, "properties": { - "cleared": { - "type": "boolean" - }, "pane_id": { "type": "string" } }, "required": [ - "pane_id", - "cleared" + "pane_id" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Clear pane scrollback" }, "meta": { @@ -38488,13 +39126,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Deletes retained scrollback from one pane. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes retained scrollback from one pane.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -38506,23 +39144,19 @@ "mayExposeSecrets": false, "mayReturnUntrustedContent": false, "name": "clear_pane_scrollback", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "cleared": { - "type": "boolean" - }, "pane_id": { "type": "string" } }, "required": [ - "pane_id", - "cleared" + "pane_id" ], "type": "object" }, @@ -38539,72 +39173,59 @@ "name": "create_session", "wireName": "create_session", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 39 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 435 }, - "description": "Creates a detached session whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a detached session whose first pane runs the configured process.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "height": { - "default": -1, - "description": "Initial height; supply with width. Defaults to -1.", + "description": "initial height; supply with width", "type": "integer" }, "session_name": { - "description": "A literal session name.", + "description": "a literal session name", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" }, "width": { - "default": -1, - "description": "Initial width; supply with height. Defaults to -1.", + "description": "initial width; supply with height", "type": "integer" }, "window_name": { - "description": "A literal first-window name.", + "description": "a literal first-window name", "type": "string" } }, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" - }, - "id": { + "sessionId": { "type": "string" }, - "name": { + "sessionName": { "type": "string" - }, - "windows": { - "type": "integer" } }, "required": [ - "id", - "name", - "attached", - "windows" + "sessionId", + "sessionName" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Create a session" }, "meta": { @@ -38616,7 +39237,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Creates a detached session whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a detached session whose first pane runs the configured process.", "inputLiteralization": { "session_name": "double-hash-once", "start_directory": "double-hash-once", @@ -38626,59 +39247,48 @@ "additionalProperties": false, "properties": { "height": { - "default": -1, - "description": "Initial height; supply with width. Defaults to -1.", + "description": "initial height; supply with width", "type": "integer" }, "session_name": { - "description": "A literal session name.", + "description": "a literal session name", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" }, "width": { - "default": -1, - "description": "Initial width; supply with height. Defaults to -1.", + "description": "initial width; supply with height", "type": "integer" }, "window_name": { - "description": "A literal first-window name.", + "description": "a literal first-window name", "type": "string" } }, - "required": [], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "create_session", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" - }, - "id": { + "sessionId": { "type": "string" }, - "name": { + "sessionName": { "type": "string" - }, - "windows": { - "type": "integer" } }, "required": [ - "id", - "name", - "attached", - "windows" + "sessionId", + "sessionName" ], "type": "object" }, @@ -38696,36 +39306,39 @@ "name": "create_window", "wireName": "create_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 67 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 452 }, - "description": "Creates a window whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a window whose first pane runs the configured process.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "attach": { - "default": false, - "description": "Make the new window active. Defaults to false.", + "description": "make the new window active", "type": "boolean" }, "direction": { - "description": "before or after.", + "description": "before or after", + "enum": [ + "before", + "after" + ], "type": "string" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" }, "window_name": { - "description": "A literal window name.", + "description": "a literal window name", "type": "string" } }, @@ -38737,44 +39350,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session_id": { + "paneId": { "type": "string" }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "paneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Create a window" }, "meta": { @@ -38786,7 +39377,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Creates a window whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a window whose first pane runs the configured process.", "inputLiteralization": { "start_directory": "double-hash-once", "window_name": "double-hash-once" @@ -38795,24 +39386,27 @@ "additionalProperties": false, "properties": { "attach": { - "default": false, - "description": "Make the new window active. Defaults to false.", + "description": "make the new window active", "type": "boolean" }, "direction": { - "description": "before or after.", + "description": "before or after", + "enum": [ + "before", + "after" + ], "type": "string" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" }, "window_name": { - "description": "A literal window name.", + "description": "a literal window name", "type": "string" } }, @@ -38821,46 +39415,26 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "create_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session_id": { + "paneId": { "type": "string" }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "paneId" ], "type": "object" }, @@ -38878,23 +39452,29 @@ "name": "find_pane_by_position", "wireName": "find_pane_by_position", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 219 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 229 }, - "description": "Finds a pane at one of a window's four corners. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Finds a pane at one of a window's four corners.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "position": { - "description": "top-left, top-right, bottom-left or bottom-right.", + "description": "top-left, top-right, bottom-left, or bottom-right", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -38907,52 +39487,47 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { + "found": { "type": "boolean" }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId", + "found", + "geometry" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Find pane by position" }, "meta": { @@ -38964,17 +39539,23 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Finds a pane at one of a window's four corners. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Finds a pane at one of a window's four corners.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "position": { - "description": "top-left, top-right, bottom-left or bottom-right.", + "description": "top-left, top-right, bottom-left, or bottom-right", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -38985,53 +39566,50 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "find_pane_by_position", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { + "found": { "type": "boolean" }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId", + "found", + "geometry" ], "type": "object" }, @@ -39048,19 +39626,19 @@ "name": "get_pane_info", "wireName": "get_pane_info", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 117 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 174 }, - "description": "Returns metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one pane.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -39072,52 +39650,121 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { + "dead": { "type": "boolean" }, - "command": { - "type": "string" + "exitStatus": { + "type": [ + "null", + "integer" + ] }, - "id": { - "type": "string" + "historyLimit": { + "type": "integer" }, - "index": { + "historyLines": { "type": "integer" }, - "path": { - "type": "string" + "inMode": { + "type": "boolean" }, - "session_id": { - "type": "string" + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" }, - "size": { + "path": { "type": "string" }, + "pid": { + "type": "integer" + }, "title": { "type": "string" }, - "window_id": { - "type": "string" + "zoomed": { + "type": "boolean" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", + "pane", "title", - "size" + "path", + "pid", + "dead", + "zoomed", + "inMode", + "historyLines", + "historyLimit" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Get pane info" }, "meta": { @@ -39129,13 +39776,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one pane.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -39145,112 +39792,247 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "get_pane_info", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { + "dead": { "type": "boolean" }, - "command": { - "type": "string" - }, - "id": { - "type": "string" + "exitStatus": { + "type": [ + "null", + "integer" + ] }, - "index": { + "historyLimit": { "type": "integer" }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" + "historyLines": { + "type": "integer" }, - "title": { - "type": "string" + "inMode": { + "type": "boolean" }, - "window_id": { - "type": "string" - } - }, - "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get pane info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_server_info", - "wireName": "get_server_info", + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" + }, + "path": { + "type": "string" + }, + "pid": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "zoomed": { + "type": "boolean" + } + }, + "required": [ + "pane", + "title", + "path", + "pid", + "dead", + "zoomed", + "inMode", + "historyLines", + "historyLimit" + ], + "type": "object" + }, + "processReach": "none", + "title": "Get pane info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_server_info", + "wireName": "get_server_info", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 89 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 151 }, - "description": "Reports whether the pinned server exists and its version. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Reports whether the pinned server exists and its version.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "identity": { + "alive": { + "type": "boolean" + }, + "attachedClients": { + "items": { + "additionalProperties": false, + "properties": { + "controlMode": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "session": { + "type": "string" + }, + "tty": { + "type": "string" + } + }, + "required": [ + "name", + "controlMode" + ], + "type": "object" + }, + "type": [ + "array" + ] + }, + "callerPaneId": { "type": "string" }, - "running": { + "clients": { + "type": "integer" + }, + "insideThisServer": { "type": "boolean" }, + "messages": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] + }, + "messagesUnavailable": { + "type": "string" + }, + "panes": { + "type": "integer" + }, "sessions": { "type": "integer" }, + "socketPath": { + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" + }, "version": { "type": "string" + }, + "windows": { + "type": "integer" } }, "required": [ - "running", - "identity", + "socketPath", "version", - "sessions" + "alive", + "sessions", + "windows", + "panes", + "clients", + "attachedClients", + "insideThisServer", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Get server info" }, "meta": { @@ -39262,42 +40044,108 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Reports whether the pinned server exists and its version. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Reports whether the pinned server exists and its version.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "get_server_info", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "identity": { + "alive": { + "type": "boolean" + }, + "attachedClients": { + "items": { + "additionalProperties": false, + "properties": { + "controlMode": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "session": { + "type": "string" + }, + "tty": { + "type": "string" + } + }, + "required": [ + "name", + "controlMode" + ], + "type": "object" + }, + "type": [ + "array" + ] + }, + "callerPaneId": { "type": "string" }, - "running": { + "clients": { + "type": "integer" + }, + "insideThisServer": { "type": "boolean" }, + "messages": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] + }, + "messagesUnavailable": { + "type": "string" + }, + "panes": { + "type": "integer" + }, "sessions": { "type": "integer" }, + "socketPath": { + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" + }, "version": { "type": "string" + }, + "windows": { + "type": "integer" } }, "required": [ - "running", - "identity", + "socketPath", "version", - "sessions" + "alive", + "sessions", + "windows", + "panes", + "clients", + "attachedClients", + "insideThisServer", + "truncated" ], "type": "object" }, @@ -39314,19 +40162,19 @@ "name": "get_session_info", "wireName": "get_session_info", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 101 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 158 }, - "description": "Returns metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one session.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -39338,32 +40186,89 @@ "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" + "activeWindowId": { + "type": "string" }, - "id": { + "created": { "type": "string" }, - "name": { + "path": { "type": "string" }, + "session": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "windows", + "attached" + ], + "type": "object" + }, "windows": { - "type": "integer" + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "name", + "index", + "panes", + "active" + ], + "type": "object" + }, + "type": [ + "array" + ] } }, "required": [ - "id", - "name", - "attached", + "session", + "path", + "created", + "activeWindowId", "windows" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Get session info" }, "meta": { @@ -39375,13 +40280,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one session.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -39391,32 +40296,91 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "get_session_info", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" + "activeWindowId": { + "type": "string" }, - "id": { + "created": { "type": "string" }, - "name": { + "path": { "type": "string" }, + "session": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "windows", + "attached" + ], + "type": "object" + }, "windows": { - "type": "integer" + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "name", + "index", + "panes", + "active" + ], + "type": "object" + }, + "type": [ + "array" + ] } }, "required": [ - "id", - "name", - "attached", + "session", + "path", + "created", + "activeWindowId", "windows" ], "type": "object" @@ -39434,32 +40398,26 @@ "name": "get_tmux_variables", "wireName": "get_tmux_variables", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 272 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 251 }, - "description": "Reads a capped list of validated tmux variable names, not free-form formats. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads a capped list of validated tmux variable names, not free-form formats.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "names": { - "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", "items": { - "maxLength": 128, "type": "string" }, - "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] - }, - "pane": { - "description": "An optional pane context.", - "type": "string" } }, "required": [ @@ -39471,6 +40429,9 @@ "additionalProperties": false, "properties": { "values": { + "additionalProperties": { + "type": "string" + }, "type": "object" } }, @@ -39481,9 +40442,7 @@ }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Get tmux variables" }, "meta": { @@ -39495,7 +40454,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Reads a capped list of validated tmux variable names, not free-form formats. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads a capped list of validated tmux variable names, not free-form formats.", "inputLiteralization": { "names": "validated-variable-name" }, @@ -39503,20 +40462,14 @@ "additionalProperties": false, "properties": { "names": { - "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "description": "variable names matching [A-Za-z][A-Za-z0-9_]*", "items": { - "maxLength": 128, "type": "string" }, - "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] - }, - "pane": { - "description": "An optional pane context.", - "type": "string" } }, "required": [ @@ -39525,9 +40478,9 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "get_tmux_variables", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata", "configured-command" @@ -39536,6 +40489,9 @@ "additionalProperties": false, "properties": { "values": { + "additionalProperties": { + "type": "string" + }, "type": "object" } }, @@ -39557,19 +40513,19 @@ "name": "get_window_info", "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 109 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 166 }, - "description": "Returns metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one window.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -39581,44 +40537,137 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { + "height": { "type": "integer" }, - "name": { + "layout": { "type": "string" }, "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" + }, + "type": [ + "array" + ] + }, + "width": { "type": "integer" }, - "session_id": { - "type": "string" + "window": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "name", + "index", + "panes", + "active" + ], + "type": "object" }, - "size": { - "type": "string" + "zoomed": { + "type": "boolean" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "window", + "layout", + "width", + "height", + "zoomed", + "panes" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Get window info" }, "meta": { @@ -39630,13 +40679,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Returns metadata for one window.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -39646,45 +40695,140 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "get_window_info", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { + "height": { "type": "integer" }, - "name": { + "layout": { "type": "string" }, "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" + }, + "type": [ + "array" + ] + }, + "width": { "type": "integer" }, - "session_id": { - "type": "string" + "window": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "name", + "index", + "panes", + "active" + ], + "type": "object" }, - "size": { - "type": "string" + "zoomed": { + "type": "boolean" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "window", + "layout", + "width", + "height", + "zoomed", + "panes" ], "type": "object" }, @@ -39701,24 +40845,23 @@ "name": "kill_pane", "wireName": "kill_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", - "line": 33 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 570 }, - "description": "Deletes one pane and ends its process. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one pane and ends its process.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "pane_id": { - "description": "The pane ID, such as %1.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -39730,27 +40873,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { + "killed": { "type": "string" }, - "note": { - "type": "string" + "windowEnded": { + "type": "boolean" } }, "required": [ - "kind", - "id" + "killed", + "windowEnded" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Kill a pane" }, "meta": { @@ -39762,18 +40900,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Deletes one pane and ends its process. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one pane and ends its process.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "pane_id": { - "description": "The pane ID, such as %1.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -39785,26 +40922,23 @@ "mayExposeSecrets": false, "mayReturnUntrustedContent": false, "name": "kill_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { + "killed": { "type": "string" }, - "note": { - "type": "string" + "windowEnded": { + "type": "boolean" } }, "required": [ - "kind", - "id" + "killed", + "windowEnded" ], "type": "object" }, @@ -39822,24 +40956,23 @@ "name": "kill_session", "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", - "line": 52 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 578 }, - "description": "Deletes one session and every window and pane in it. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one session and every window and pane in it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -39851,27 +40984,18 @@ "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "note": { + "killed": { "type": "string" } }, "required": [ - "kind", - "id" + "killed" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Kill a session" }, "meta": { @@ -39883,18 +41007,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Deletes one session and every window and pane in it. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one session and every window and pane in it.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -39906,26 +41029,19 @@ "mayExposeSecrets": false, "mayReturnUntrustedContent": false, "name": "kill_session", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "note": { + "killed": { "type": "string" } }, "required": [ - "kind", - "id" + "killed" ], "type": "object" }, @@ -39943,24 +41059,23 @@ "name": "kill_window", "wireName": "kill_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", - "line": 42 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 574 }, - "description": "Deletes one window and every pane in it. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one window and every pane in it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -39972,27 +41087,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { + "killed": { "type": "string" }, - "note": { - "type": "string" + "sessionEnded": { + "type": "boolean" } }, "required": [ - "kind", - "id" + "killed", + "sessionEnded" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Kill a window" }, "meta": { @@ -40004,18 +41114,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Deletes one window and every pane in it. Delete tmux state; accepts no command payload.", + "description": "Delete tmux state; accepts no command payload. Deletes one window and every pane in it.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "confirm_self": { - "default": false, - "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "description": "permit ending the pane this MCP process runs in", "type": "boolean" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -40027,26 +41136,23 @@ "mayExposeSecrets": false, "mayReturnUntrustedContent": false, "name": "kill_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { + "killed": { "type": "string" }, - "note": { - "type": "string" + "sessionEnded": { + "type": "boolean" } }, "required": [ - "kind", - "id" + "killed", + "sessionEnded" ], "type": "object" }, @@ -40064,29 +41170,21 @@ "name": "list_panes", "wireName": "list_panes", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 69 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 143 }, - "description": "Lists pane metadata and stable pane IDs. No filter; use the 'command' field to find a pane by what it runs. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists pane metadata and stable pane IDs.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, - "note": { - "type": "string" - }, "panes": { "items": { "additionalProperties": false, @@ -40094,28 +41192,87 @@ "active": { "type": "boolean" }, - "caller": { - "type": "boolean" - }, - "command": { + "currentCommand": { "type": "string" }, - "id": { - "type": "string" + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" }, - "path": { + "id": { "type": "string" }, - "session": { - "type": "string" + "index": { + "type": "integer" }, - "size": { - "type": "string" + "isCaller": { + "type": [ + "null", + "boolean" + ] }, - "window": { + "session": { "type": "string" }, - "window_id": { + "status": { + "additionalProperties": false, + "properties": { + "dead": { + "type": "boolean" + }, + "exitStatus": { + "type": [ + "null", + "integer" + ] + }, + "historyLines": { + "type": "integer" + }, + "inMode": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "dead", + "historyLines", + "inMode" + ], + "type": [ + "null", + "object" + ] + }, + "window": { + "type": "string" + }, + "windowId": { "type": "string" } }, @@ -40123,28 +41280,38 @@ "id", "session", "window", - "window_id", - "command", - "path", - "size", - "active" + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] + }, + "serverNote": { + "type": "string" + }, + "skipped": { + "type": "integer" + }, + "total": { + "type": "integer" } }, "required": [ - "count", - "panes" + "panes", + "total" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "List panes" }, "meta": { @@ -40156,30 +41323,22 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Lists pane metadata and stable pane IDs. No filter; use the 'command' field to find a pane by what it runs. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists pane metadata and stable pane IDs.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "list_panes", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, - "note": { - "type": "string" - }, "panes": { "items": { "additionalProperties": false, @@ -40187,28 +41346,87 @@ "active": { "type": "boolean" }, - "caller": { - "type": "boolean" - }, - "command": { + "currentCommand": { "type": "string" }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, "id": { "type": "string" }, - "path": { - "type": "string" + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] }, "session": { "type": "string" }, - "size": { - "type": "string" + "status": { + "additionalProperties": false, + "properties": { + "dead": { + "type": "boolean" + }, + "exitStatus": { + "type": [ + "null", + "integer" + ] + }, + "historyLines": { + "type": "integer" + }, + "inMode": { + "type": "boolean" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "dead", + "historyLines", + "inMode" + ], + "type": [ + "null", + "object" + ] }, "window": { "type": "string" }, - "window_id": { + "windowId": { "type": "string" } }, @@ -40216,20 +41434,32 @@ "id", "session", "window", - "window_id", - "command", - "path", - "size", - "active" + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] + }, + "serverNote": { + "type": "string" + }, + "skipped": { + "type": "integer" + }, + "total": { + "type": "integer" } }, "required": [ - "count", - "panes" + "panes", + "total" ], "type": "object" }, @@ -40246,27 +41476,22 @@ "name": "list_sessions", "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 39 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 127 }, - "description": "Lists sessions on the pinned tmux server. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists sessions on the pinned tmux server.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, - "note": { + "serverNote": { "type": "string" }, "sessions": { @@ -40274,7 +41499,7 @@ "additionalProperties": false, "properties": { "attached": { - "type": "boolean" + "type": "integer" }, "id": { "type": "string" @@ -40282,12 +41507,6 @@ "name": { "type": "string" }, - "window_names": { - "items": { - "type": "string" - }, - "type": "array" - }, "windows": { "type": "integer" } @@ -40295,26 +41514,31 @@ "required": [ "id", "name", - "attached", "windows", - "window_names" + "attached" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] + }, + "skipped": { + "type": "integer" + }, + "total": { + "type": "integer" } }, "required": [ - "count", - "sessions" + "sessions", + "total" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "List sessions" }, "meta": { @@ -40326,28 +41550,23 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Lists sessions on the pinned tmux server. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists sessions on the pinned tmux server.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "list_sessions", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, - "note": { + "serverNote": { "type": "string" }, "sessions": { @@ -40355,7 +41574,7 @@ "additionalProperties": false, "properties": { "attached": { - "type": "boolean" + "type": "integer" }, "id": { "type": "string" @@ -40363,12 +41582,6 @@ "name": { "type": "string" }, - "window_names": { - "items": { - "type": "string" - }, - "type": "array" - }, "windows": { "type": "integer" } @@ -40376,18 +41589,25 @@ "required": [ "id", "name", - "attached", "windows", - "window_names" + "attached" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] + }, + "skipped": { + "type": "integer" + }, + "total": { + "type": "integer" } }, "required": [ - "count", - "sessions" + "sessions", + "total" ], "type": "object" }, @@ -40404,37 +41624,35 @@ "name": "list_windows", "wireName": "list_windows", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 53 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 135 }, - "description": "Lists windows, optionally only those in one session, named by ID or by name. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists windows, optionally only those in one named session.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session_id": { - "description": "Only windows in this session, such as $1.", - "type": "string" - }, - "session_name": { - "description": "Only windows in the session with this exact name.", + "session": { + "description": "only windows in this session name", "type": "string" } }, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "count": { + "serverNote": { + "type": "string" + }, + "skipped": { "type": "integer" }, - "note": { - "type": "string" + "total": { + "type": "integer" }, "windows": { "items": { @@ -40461,28 +41679,28 @@ }, "required": [ "id", - "index", - "name", "session", - "active", - "panes" + "name", + "index", + "panes", + "active" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] } }, "required": [ - "count", - "windows" + "windows", + "total" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "List windows" }, "meta": { @@ -40494,38 +41712,36 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Lists windows, optionally only those in one session, named by ID or by name. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Lists windows, optionally only those in one named session.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { - "session_id": { - "description": "Only windows in this session, such as $1.", - "type": "string" - }, - "session_name": { - "description": "Only windows in the session with this exact name.", + "session": { + "description": "only windows in this session name", "type": "string" } }, - "required": [], "type": "object" }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "list_windows", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "count": { + "serverNote": { + "type": "string" + }, + "skipped": { "type": "integer" }, - "note": { - "type": "string" + "total": { + "type": "integer" }, "windows": { "items": { @@ -40552,20 +41768,22 @@ }, "required": [ "id", - "index", - "name", "session", - "active", - "panes" + "name", + "index", + "panes", + "active" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] } }, "required": [ - "count", - "windows" + "windows", + "total" ], "type": "object" }, @@ -40582,28 +41800,30 @@ "name": "move_window", "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 121 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 379 }, - "description": "Moves a window to another session, optionally at an index. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Moves a window to another session, optionally at an index.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "index": { - "default": -1, - "description": "A destination window index; omit for tmux's choice. Defaults to -1.", - "type": "integer" + "description": "a destination window index; omit for tmux's choice", + "type": [ + "null", + "integer" + ] }, "session_id": { - "description": "The destination session ID, such as $1.", + "description": "the destination session id, such as $1", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -40619,25 +41839,23 @@ "index": { "type": "integer" }, - "session_id": { + "session": { "type": "string" }, - "window_id": { + "windowId": { "type": "string" } }, "required": [ - "window_id", - "session_id", + "windowId", + "session", "index" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Move a window" }, "meta": { @@ -40649,22 +41867,24 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Moves a window to another session, optionally at an index. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Moves a window to another session, optionally at an index.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "index": { - "default": -1, - "description": "A destination window index; omit for tmux's choice. Defaults to -1.", - "type": "integer" + "description": "a destination window index; omit for tmux's choice", + "type": [ + "null", + "integer" + ] }, "session_id": { - "description": "The destination session ID, such as $1.", + "description": "the destination session id, such as $1", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -40675,9 +41895,9 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "move_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], @@ -40687,16 +41907,16 @@ "index": { "type": "integer" }, - "session_id": { + "session": { "type": "string" }, - "window_id": { + "windowId": { "type": "string" } }, "required": [ - "window_id", - "session_id", + "windowId", + "session", "index" ], "type": "object" @@ -40715,28 +41935,27 @@ "name": "paste_text", "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 218 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 527 }, - "description": "Pastes one literal text block into one target pane through an ephemeral buffer; paste-buffer input does not fan out to synchronized peers. The target cannot be caller or attended. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Pastes literal text only to its target; optional Enter appends one newline to the same private buffer.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "enter": { - "default": false, - "description": "Append a newline that submits the text. Defaults to false.", + "description": "append a newline that submits the text", "type": "boolean" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "text": { - "description": "The literal text to paste.", + "description": "the literal text to paste", "type": "string" } }, @@ -40749,31 +41968,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "characters": { - "type": "integer" - }, - "lines": { + "bytes": { "type": "integer" }, - "note": { - "type": "string" - }, "pane_id": { "type": "string" } }, "required": [ "pane_id", - "characters", - "lines" + "bytes" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Paste text" }, "meta": { @@ -40785,22 +41995,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Pastes one literal text block into one target pane through an ephemeral buffer; paste-buffer input does not fan out to synchronized peers. The target cannot be caller or attended. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Pastes literal text only to its target; optional Enter appends one newline to the same private buffer.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "enter": { - "default": false, - "description": "Append a newline that submits the text. Defaults to false.", + "description": "append a newline that submits the text", "type": "boolean" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "text": { - "description": "The literal text to paste.", + "description": "the literal text to paste", "type": "string" } }, @@ -40811,32 +42020,25 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "paste_text", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "characters": { - "type": "integer" - }, - "lines": { + "bytes": { "type": "integer" }, - "note": { - "type": "string" - }, "pane_id": { "type": "string" } }, "required": [ "pane_id", - "characters", - "lines" + "bytes" ], "type": "object" }, @@ -40854,23 +42056,23 @@ "name": "rename_session", "wireName": "rename_session", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 31 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 333 }, - "description": "Replaces a session's name. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a session's name.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "new_name": { - "description": "The literal new session name.", + "description": "the literal new session name", "type": "string" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -40883,32 +42085,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" - }, - "id": { - "type": "string" - }, "name": { "type": "string" }, - "windows": { - "type": "integer" + "sessionId": { + "type": "string" } }, "required": [ - "id", - "name", - "attached", - "windows" + "sessionId", + "name" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Rename a session" }, "meta": { @@ -40920,7 +42112,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Replaces a session's name. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a session's name.", "inputLiteralization": { "new_name": "double-hash-once" }, @@ -40928,11 +42120,11 @@ "additionalProperties": false, "properties": { "new_name": { - "description": "The literal new session name.", + "description": "the literal new session name", "type": "string" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -40942,34 +42134,26 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "rename_session", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" - }, - "id": { - "type": "string" - }, "name": { "type": "string" }, - "windows": { - "type": "integer" + "sessionId": { + "type": "string" } }, "required": [ - "id", - "name", - "attached", - "windows" + "sessionId", + "name" ], "type": "object" }, @@ -40987,23 +42171,23 @@ "name": "rename_window", "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 44 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 341 }, - "description": "Replaces a window's name. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a window's name.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "new_name": { - "description": "The literal new window name.", + "description": "the literal new window name", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -41016,44 +42200,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, "name": { "type": "string" }, - "panes": { - "type": "integer" - }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "name" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Rename a window" }, "meta": { @@ -41065,7 +42227,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Replaces a window's name. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a window's name.", "inputLiteralization": { "new_name": "double-hash-once" }, @@ -41073,11 +42235,11 @@ "additionalProperties": false, "properties": { "new_name": { - "description": "The literal new window name.", + "description": "the literal new window name", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -41087,46 +42249,26 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "rename_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, "name": { "type": "string" }, - "panes": { - "type": "integer" - }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "name" ], "type": "object" }, @@ -41144,29 +42286,27 @@ "name": "resize_pane", "wireName": "resize_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 106 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 372 }, - "description": "Sets a pane's width, height or both. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a pane's width, height, or both.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "height": { - "default": 0, - "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "description": "height in terminal cells; omit to retain it", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "width": { - "default": 0, - "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "description": "width in terminal cells; omit to retain it", "type": "integer" } }, @@ -41178,31 +42318,26 @@ "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" + "height": { + "type": "integer" }, - "note": { + "paneId": { "type": "string" }, - "what": { - "type": "string" + "width": { + "type": "integer" } }, "required": [ - "kind", - "id", - "what" + "paneId", + "width", + "height" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Resize a pane" }, "meta": { @@ -41214,23 +42349,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Sets a pane's width, height or both. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a pane's width, height, or both.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "height": { - "default": 0, - "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "description": "height in terminal cells; omit to retain it", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "width": { - "default": 0, - "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "description": "width in terminal cells; omit to retain it", "type": "integer" } }, @@ -41240,32 +42373,29 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "resize_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" + "height": { + "type": "integer" }, - "note": { + "paneId": { "type": "string" }, - "what": { - "type": "string" + "width": { + "type": "integer" } }, "required": [ - "kind", - "id", - "what" + "paneId", + "width", + "height" ], "type": "object" }, @@ -41283,29 +42413,27 @@ "name": "resize_window", "wireName": "resize_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 91 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 365 }, - "description": "Sets a window's width, height or both. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a window's width, height, or both.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "height": { - "default": 0, - "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "description": "height in terminal cells; omit to retain it", "type": "integer" }, "width": { - "default": 0, - "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "description": "width in terminal cells; omit to retain it", "type": "integer" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -41317,44 +42445,26 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { + "height": { "type": "integer" }, - "name": { - "type": "string" - }, - "panes": { + "width": { "type": "integer" }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "width", + "height" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Resize a window" }, "meta": { @@ -41366,23 +42476,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Sets a window's width, height or both. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a window's width, height, or both.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "height": { - "default": 0, - "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "description": "height in terminal cells; omit to retain it", "type": "integer" }, "width": { - "default": 0, - "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "description": "width in terminal cells; omit to retain it", "type": "integer" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -41391,46 +42499,30 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "resize_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { + "height": { "type": "integer" }, - "name": { - "type": "string" - }, - "panes": { + "width": { "type": "integer" }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId", + "width", + "height" ], "type": "object" }, @@ -41448,23 +42540,23 @@ "name": "respawn_pane", "wireName": "respawn_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 118 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 481 }, - "description": "Kills the pane's current process and starts its configured process again. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Kills the pane's current process and starts its configured process again.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" } }, @@ -41476,24 +42568,21 @@ "outputSchema": { "additionalProperties": false, "properties": { - "pane_id": { - "type": "string" - }, - "restarted": { + "gone": { "type": "boolean" + }, + "paneId": { + "type": "string" } }, "required": [ - "pane_id", - "restarted" + "paneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Respawn a pane" }, "meta": { @@ -41505,7 +42594,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Kills the pane's current process and starts its configured process again. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Kills the pane's current process and starts its configured process again.", "inputLiteralization": { "start_directory": "double-hash-once" }, @@ -41513,11 +42602,11 @@ "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" } }, @@ -41527,25 +42616,24 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "respawn_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "pane_id": { - "type": "string" - }, - "restarted": { + "gone": { "type": "boolean" + }, + "paneId": { + "type": "string" } }, "required": [ - "pane_id", - "restarted" + "paneId" ], "type": "object" }, @@ -41564,38 +42652,37 @@ "name": "run_shell_command", "wireName": "run_shell_command", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 142 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 493 }, - "description": "Runs one authored command in a trusted pane shell and waits for singular framed output and completion. Its two preflights refuse caller or attended panes and an effective cohort larger than one. Pre-existing exact-client-path, trap, eval, or exit functions are outside the supported boundary; marker display-message commands honor the trusted server's command aliases and hooks. Run a shell command in a pane with your user's permissions.", + "description": "Run a shell command in a pane with your user's permissions. Runs one command you author in a pane that is not synchronized with others, rechecks the pane just before sending, and waits for it to finish, reporting its exit status.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "command": { - "description": "The shell command, run in the pane's interactive shell.", + "description": "the shell command run in the pane's interactive shell", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum output lines, keeping the newest. Defaults to 200.", + "description": "maximum output lines, keeping the newest", + "minimum": 0, "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "suppress_history": { - "default": true, - "description": "Best-effort persistent history suppression. Defaults to true.", + "description": "best-effort persistent history suppression", "type": "boolean" }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -41608,57 +42695,61 @@ "outputSchema": { "additionalProperties": false, "properties": { - "effective_timeout": { - "type": "number" + "effective_timeout_seconds": { + "type": "integer" }, "exit_status": { - "type": "integer" + "type": [ + "null", + "integer" + ] }, - "framed": { + "lines_missed": { "type": "boolean" }, - "lines_dropped": { - "type": "integer" + "output": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] }, - "note": { + "output_unavailable": { "type": "string" }, - "outcome": { + "pane_id": { "type": "string" }, - "output": { + "resolved_pane_ids": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "pane_id": { + "running": { "type": "string" }, - "seconds": { - "type": "number" + "timed_out": { + "type": "boolean" }, - "truncated": { + "timeout_clamped": { "type": "boolean" } }, "required": [ "pane_id", - "outcome", - "output", - "truncated", - "lines_dropped", - "framed", - "seconds", - "effective_timeout" + "resolved_pane_ids", + "timed_out", + "output" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Run a shell command" }, "meta": { @@ -41670,32 +42761,31 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Runs one authored command in a trusted pane shell and waits for singular framed output and completion. Its two preflights refuse caller or attended panes and an effective cohort larger than one. Pre-existing exact-client-path, trap, eval, or exit functions are outside the supported boundary; marker display-message commands honor the trusted server's command aliases and hooks. Run a shell command in a pane with your user's permissions.", + "description": "Run a shell command in a pane with your user's permissions. Runs one command you author in a pane that is not synchronized with others, rechecks the pane just before sending, and waits for it to finish, reporting its exit status.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "command": { - "description": "The shell command, run in the pane's interactive shell.", + "description": "the shell command run in the pane's interactive shell", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum output lines, keeping the newest. Defaults to 200.", + "description": "maximum output lines, keeping the newest", + "minimum": 0, "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "suppress_history": { - "default": true, - "description": "Best-effort persistent history suppression. Defaults to true.", + "description": "best-effort persistent history suppression", "type": "boolean" }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -41708,57 +42798,63 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "run_shell_command", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "effective_timeout": { - "type": "number" + "effective_timeout_seconds": { + "type": "integer" }, "exit_status": { - "type": "integer" + "type": [ + "null", + "integer" + ] }, - "framed": { + "lines_missed": { "type": "boolean" }, - "lines_dropped": { - "type": "integer" + "output": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] }, - "note": { + "output_unavailable": { "type": "string" }, - "outcome": { + "pane_id": { "type": "string" }, - "output": { + "resolved_pane_ids": { "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] }, - "pane_id": { + "running": { "type": "string" }, - "seconds": { - "type": "number" + "timed_out": { + "type": "boolean" }, - "truncated": { + "timeout_clamped": { "type": "boolean" } }, "required": [ "pane_id", - "outcome", - "output", - "truncated", - "lines_dropped", - "framed", - "seconds", - "effective_timeout" + "resolved_pane_ids", + "timed_out", + "output" ], "type": "object" }, @@ -41776,35 +42872,34 @@ "name": "search_panes", "wireName": "search_panes", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 201 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 218 }, - "description": "Searches the visible output of every pane. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Searches the visible output of every pane.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "max_lines": { - "default": 200, - "description": "Maximum matches across all panes. Defaults to 200.", + "description": "maximum matching panes to return", + "maximum": 200, "type": "integer" }, "max_matches_per_pane": { - "default": 5, - "description": "Maximum matching lines per pane. Defaults to 5.", + "description": "maximum matching lines per pane", + "maximum": 200, "type": "integer" }, "pattern": { - "description": "The bounded text or regular expression to search for.", + "description": "bounded text or regular expression to search for", "maxLength": 4096, "type": "string" }, "regex": { - "default": false, - "description": "Treat pattern as a regular expression. Defaults to false.", + "description": "treat pattern as a regular expression", "type": "boolean" } }, @@ -41816,71 +42911,145 @@ "outputSchema": { "additionalProperties": false, "properties": { - "bytes_searched": { + "bytesInspected": { "type": "integer" }, - "count": { + "linesInspected": { "type": "integer" }, - "lines_searched": { + "morePanes": { "type": "integer" }, - "matches": { + "panes": { "items": { "additionalProperties": false, "properties": { - "line": { - "type": "string" - }, - "pane_id": { - "type": "string" - }, - "session": { - "type": "string" - }, - "window": { - "type": "string" - } - }, - "required": [ - "pane_id", - "session", - "window", - "line" + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "row": { + "type": "integer" + }, + "text": { + "type": "string" + } + }, + "required": [ + "row", + "text" + ], + "type": "object" + }, + "type": [ + "array" + ] + }, + "moreMatches": { + "type": "integer" + }, + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" + } + }, + "required": [ + "pane", + "matches" ], "type": "object" }, - "type": "array" - }, - "note": { - "type": "string" + "type": [ + "array" + ] }, - "panes_searched": { + "panesInspected": { "type": "integer" }, - "truncated": { + "workLimited": { "type": "boolean" }, - "work_seconds": { + "workTimeLimitSeconds": { "type": "number" } }, "required": [ - "count", - "panes_searched", - "lines_searched", - "bytes_searched", - "work_seconds", - "truncated", - "matches" + "panes", + "panesInspected", + "linesInspected", + "bytesInspected", + "workLimited", + "workTimeLimitSeconds" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Search panes" }, "meta": { @@ -41892,29 +43061,28 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Searches the visible output of every pane. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Searches the visible output of every pane.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "max_lines": { - "default": 200, - "description": "Maximum matches across all panes. Defaults to 200.", + "description": "maximum matching panes to return", + "maximum": 200, "type": "integer" }, "max_matches_per_pane": { - "default": 5, - "description": "Maximum matching lines per pane. Defaults to 5.", + "description": "maximum matching lines per pane", + "maximum": 200, "type": "integer" }, "pattern": { - "description": "The bounded text or regular expression to search for.", + "description": "bounded text or regular expression to search for", "maxLength": 4096, "type": "string" }, "regex": { - "default": false, - "description": "Treat pattern as a regular expression. Defaults to false.", + "description": "treat pattern as a regular expression", "type": "boolean" } }, @@ -41926,71 +43094,147 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "search_panes", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "bytes_searched": { + "bytesInspected": { "type": "integer" }, - "count": { + "linesInspected": { "type": "integer" }, - "lines_searched": { + "morePanes": { "type": "integer" }, - "matches": { + "panes": { "items": { "additionalProperties": false, "properties": { - "line": { - "type": "string" - }, - "pane_id": { - "type": "string" + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "row": { + "type": "integer" + }, + "text": { + "type": "string" + } + }, + "required": [ + "row", + "text" + ], + "type": "object" + }, + "type": [ + "array" + ] }, - "session": { - "type": "string" + "moreMatches": { + "type": "integer" }, - "window": { - "type": "string" + "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], + "type": "object" } }, "required": [ - "pane_id", - "session", - "window", - "line" + "pane", + "matches" ], "type": "object" }, - "type": "array" - }, - "note": { - "type": "string" + "type": [ + "array" + ] }, - "panes_searched": { + "panesInspected": { "type": "integer" }, - "truncated": { + "workLimited": { "type": "boolean" }, - "work_seconds": { + "workTimeLimitSeconds": { "type": "number" } }, "required": [ - "count", - "panes_searched", - "lines_searched", - "bytes_searched", - "work_seconds", - "truncated", - "matches" + "panes", + "panesInspected", + "linesInspected", + "bytesInspected", + "workLimited", + "workTimeLimitSeconds" ], "type": "object" }, @@ -42007,23 +43251,23 @@ "name": "select_layout", "wireName": "select_layout", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 75 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 357 }, - "description": "Applies a named tmux layout, a unique abbreviation or a checksummed saved layout. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Malformed syntax is refused before window lookup; tmux validates geometry. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Applies a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info. Invalid syntax is rejected before window lookup; tmux validates geometry when applying the layout.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "layout": { - "description": "A built-in name, unique abbreviation or saved tmux layout. Existing enum-style names are also accepted.", + "description": "a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -42036,31 +43280,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "note": { + "layout": { "type": "string" }, - "what": { + "windowId": { "type": "string" } }, "required": [ - "kind", - "id", - "what" + "windowId", + "layout" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Select a layout" }, "meta": { @@ -42072,17 +43307,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Applies a named tmux layout, a unique abbreviation or a checksummed saved layout. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Malformed syntax is refused before window lookup; tmux validates geometry. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Applies a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info. Invalid syntax is rejected before window lookup; tmux validates geometry when applying the layout.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "layout": { - "description": "A built-in name, unique abbreviation or saved tmux layout. Existing enum-style names are also accepted.", + "description": "a named layout, a unique abbreviation for the running tmux version, or a saved layout from get_window_info", "type": "string" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -42093,32 +43328,25 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "select_layout", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "id": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "note": { + "layout": { "type": "string" }, - "what": { + "windowId": { "type": "string" } }, "required": [ - "kind", - "id", - "what" + "windowId", + "layout" ], "type": "object" }, @@ -42136,19 +43364,19 @@ "name": "select_pane", "wireName": "select_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 66 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 353 }, - "description": "Makes one pane active. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Makes one pane active.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -42160,52 +43388,18 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" - }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Select a pane" }, "meta": { @@ -42217,13 +43411,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Makes one pane active. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Makes one pane active.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -42232,54 +43426,22 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "select_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" - }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId" ], "type": "object" }, @@ -42297,19 +43459,19 @@ "name": "select_window", "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 57 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 349 }, - "description": "Makes one window active. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Makes one window active.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -42321,44 +43483,18 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Select a window" }, "meta": { @@ -42370,13 +43506,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Makes one window active. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Makes one window active.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -42385,46 +43521,22 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "select_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "panes": { - "type": "integer" - }, - "session_id": { - "type": "string" - }, - "size": { + "windowId": { "type": "string" } }, "required": [ - "id", - "index", - "name", - "session_id", - "active", - "panes", - "size" + "windowId" ], "type": "object" }, @@ -42442,59 +43554,49 @@ "name": "send_keys", "wireName": "send_keys", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 176 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 506 }, - "description": "Sends input to the target's configured effective synchronized cohort without waiting for output. Every configured member must be live, nonmodal, and neither caller nor attended. Reports configured pane ids observed before dispatch, not delivery receipts. wait_for_text discounts recognized input; wait for the prompt before typing into a cold shell. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends keys to a pane and to every pane synchronize-panes links it with; the ids reported are the panes checked before sending, not proof that each one received the keys.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "enter": { - "default": false, - "description": "Press Enter afterward, as a real keypress. Unlike a key named \"Enter\" sent under literal:true, which types the four letters, this always submits. Defaults to false.", + "description": "press Enter after keys, as a real key press, to submit them", "type": "boolean" }, "keys": { - "description": "The key names or literal strings to send. One value may be sent on its own, without a list.", + "description": "key names or literal strings to send; do not put \"Enter\" here when literal is true, it types the five letters - set enter instead", "items": { "type": "string" }, "type": [ - "array", - "string" + "null", + "array" ] }, "literal": { - "default": false, - "description": "Send strings literally instead of as key names. Defaults to false.", + "description": "send strings literally instead of as key names", "type": "boolean" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, "required": [ - "pane_id" + "pane_id", + "keys" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "keys": { - "type": "integer" - }, - "literal": { - "type": "boolean" - }, - "note": { - "type": "string" - }, "pane_id": { "type": "string" }, @@ -42502,22 +43604,24 @@ "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] + }, + "sent": { + "type": "integer" } }, "required": [ "pane_id", - "keys", - "literal", - "resolved_pane_ids" + "resolved_pane_ids", + "sent" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Send keys" }, "meta": { @@ -42529,60 +43633,50 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Sends input to the target's configured effective synchronized cohort without waiting for output. Every configured member must be live, nonmodal, and neither caller nor attended. Reports configured pane ids observed before dispatch, not delivery receipts. wait_for_text discounts recognized input; wait for the prompt before typing into a cold shell. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends keys to a pane and to every pane synchronize-panes links it with; the ids reported are the panes checked before sending, not proof that each one received the keys.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "enter": { - "default": false, - "description": "Press Enter afterward, as a real keypress. Unlike a key named \"Enter\" sent under literal:true, which types the four letters, this always submits. Defaults to false.", + "description": "press Enter after keys, as a real key press, to submit them", "type": "boolean" }, "keys": { - "description": "The key names or literal strings to send. One value may be sent on its own, without a list.", + "description": "key names or literal strings to send; do not put \"Enter\" here when literal is true, it types the five letters - set enter instead", "items": { "type": "string" }, "type": [ - "array", - "string" + "null", + "array" ] }, "literal": { - "default": false, - "description": "Send strings literally instead of as key names. Defaults to false.", + "description": "send strings literally instead of as key names", "type": "boolean" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, "required": [ - "pane_id" + "pane_id", + "keys" ], "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "send_keys", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "keys": { - "type": "integer" - }, - "literal": { - "type": "boolean" - }, - "note": { - "type": "string" - }, "pane_id": { "type": "string" }, @@ -42590,14 +43684,18 @@ "items": { "type": "string" }, - "type": "array" + "type": [ + "array" + ] + }, + "sent": { + "type": "integer" } }, "required": [ "pane_id", - "keys", - "literal", - "resolved_pane_ids" + "resolved_pane_ids", + "sent" ], "type": "object" }, @@ -42615,28 +43713,59 @@ "name": "send_keys_batch", "wireName": "send_keys_batch", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 197 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 517 }, - "description": "Sends up to sixty-four ordered pane-input operations, resolving and guarding the configured effective cohort separately for each ordered operation. A later policy or dispatch failure retains observed membership. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends up to sixty-four key sequences in order, rechecking before each one which panes synchronize-panes links to its target.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "stop or continue; defaults to stop.", + "on_error": { + "description": "stop or continue; defaults to stop", + "enum": [ + "stop", + "continue" + ], "type": "string" }, "operations": { - "description": "Objects with pane_id, keys and optional literal and enter fields.", + "description": "up to sixty-four ordered pane-input operations", "items": { + "additionalProperties": false, + "properties": { + "enter": { + "type": "boolean" + }, + "keys": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "literal": { + "type": "boolean" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "keys" + ], "type": "object" }, - "maxItems": 64, - "type": "array" + "type": [ + "null", + "array" + ] } }, "required": [ @@ -42650,6 +43779,9 @@ "completed": { "type": "integer" }, + "failed": { + "type": "integer" + }, "results": { "items": { "additionalProperties": false, @@ -42657,12 +43789,6 @@ "error": { "type": "string" }, - "error_code": { - "type": "string" - }, - "index": { - "type": "integer" - }, "pane_id": { "type": "string" }, @@ -42670,24 +43796,24 @@ "items": { "type": "string" }, - "type": "array" - }, - "retryable": { - "type": "boolean" + "type": [ + "array" + ] }, - "success": { - "type": "boolean" + "sent": { + "type": "integer" } }, "required": [ - "index", "pane_id", "resolved_pane_ids", - "success" + "sent" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] } }, "required": [ @@ -42698,9 +43824,7 @@ }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Send keys in a batch" }, "meta": { @@ -42712,22 +43836,53 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Sends up to sixty-four ordered pane-input operations, resolving and guarding the configured effective cohort separately for each ordered operation. A later policy or dispatch failure retains observed membership. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Sends up to sixty-four key sequences in order, rechecking before each one which panes synchronize-panes links to its target.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "stop or continue; defaults to stop.", + "on_error": { + "description": "stop or continue; defaults to stop", + "enum": [ + "stop", + "continue" + ], "type": "string" }, "operations": { - "description": "Objects with pane_id, keys and optional literal and enter fields.", + "description": "up to sixty-four ordered pane-input operations", "items": { + "additionalProperties": false, + "properties": { + "enter": { + "type": "boolean" + }, + "keys": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "literal": { + "type": "boolean" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "keys" + ], "type": "object" }, - "maxItems": 64, - "type": "array" + "type": [ + "null", + "array" + ] } }, "required": [ @@ -42735,10 +43890,10 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "send_keys_batch", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], @@ -42748,6 +43903,9 @@ "completed": { "type": "integer" }, + "failed": { + "type": "integer" + }, "results": { "items": { "additionalProperties": false, @@ -42755,12 +43913,6 @@ "error": { "type": "string" }, - "error_code": { - "type": "string" - }, - "index": { - "type": "integer" - }, "pane_id": { "type": "string" }, @@ -42768,24 +43920,24 @@ "items": { "type": "string" }, - "type": "array" - }, - "retryable": { - "type": "boolean" + "type": [ + "array" + ] }, - "success": { - "type": "boolean" + "sent": { + "type": "integer" } }, "required": [ - "index", "pane_id", "resolved_pane_ids", - "success" + "sent" ], "type": "object" }, - "type": "array" + "type": [ + "array" + ] } }, "required": [ @@ -42808,23 +43960,23 @@ "name": "set_history_limit", "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 198 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 422 }, - "description": "Sets a bounded integer scrollback limit for future panes in a session. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a bounded integer scrollback limit for future panes in a session.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "lines": { - "description": "The nonnegative retained line count.", + "description": "the nonnegative retained line count", "type": "integer" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -42837,24 +43989,30 @@ "outputSchema": { "additionalProperties": false, "properties": { - "lines": { - "type": "integer" + "enabled": { + "type": [ + "null", + "boolean" + ] }, - "session_id": { + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { "type": "string" } }, "required": [ - "session_id", - "lines" + "name" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Set history limit" }, "meta": { @@ -42866,17 +44024,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Sets a bounded integer scrollback limit for future panes in a session. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets a bounded integer scrollback limit for future panes in a session.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "lines": { - "description": "The nonnegative retained line count.", + "description": "the nonnegative retained line count", "type": "integer" }, "session_id": { - "description": "The session ID, such as $1.", + "description": "the session id, such as $1", "type": "string" } }, @@ -42887,25 +44045,33 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "set_history_limit", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "lines": { - "type": "integer" + "enabled": { + "type": [ + "null", + "boolean" + ] }, - "session_id": { + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { "type": "string" } }, "required": [ - "session_id", - "lines" + "name" ], "type": "object" }, @@ -42922,43 +44088,51 @@ "name": "set_mouse_enabled", "wireName": "set_mouse_enabled", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 189 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 417 }, - "description": "Enables or disables tmux mouse handling. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Enables or disables tmux mouse handling.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "enabled": { - "default": false, - "description": "Whether mouse handling is enabled. Defaults to false.", + "description": "whether the setting is enabled", "type": "boolean" } }, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { "enabled": { - "type": "boolean" + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { + "type": "string" } }, "required": [ - "enabled" + "name" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Set mouse handling" }, "meta": { @@ -42970,24 +44144,22 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Enables or disables tmux mouse handling. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Enables or disables tmux mouse handling.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "enabled": { - "default": false, - "description": "Whether mouse handling is enabled. Defaults to false.", + "description": "whether the setting is enabled", "type": "boolean" } }, - "required": [], "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "set_mouse_enabled", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], @@ -42995,11 +44167,23 @@ "additionalProperties": false, "properties": { "enabled": { - "type": "boolean" + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { + "type": "string" } }, "required": [ - "enabled" + "name" ], "type": "object" }, @@ -43016,23 +44200,23 @@ "name": "set_pane_title", "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 148 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 391 }, - "description": "Replaces a pane's literal title. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a pane's literal title.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "title": { - "description": "The literal title.", + "description": "the literal title", "type": "string" } }, @@ -43045,52 +44229,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { + "paneId": { "type": "string" }, "title": { "type": "string" - }, - "window_id": { - "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId", + "title" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Set pane title" }, "meta": { @@ -43102,7 +44256,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Replaces a pane's literal title. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Replaces a pane's literal title.", "inputLiteralization": { "title": "double-hash-once" }, @@ -43110,11 +44264,11 @@ "additionalProperties": false, "properties": { "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "title": { - "description": "The literal title.", + "description": "the literal title", "type": "string" } }, @@ -43124,54 +44278,26 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "set_pane_title", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { + "paneId": { "type": "string" }, "title": { "type": "string" - }, - "window_id": { - "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId", + "title" ], "type": "object" }, @@ -43189,24 +44315,23 @@ "name": "set_synchronize_panes", "wireName": "set_synchronize_panes", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 239 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 538 }, - "description": "When enabled, sets the inherited window default; pane-level overrides determine each pane's effective synchronized value. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets the window synchronization default (synchronize-panes); pane-level overrides still decide which panes receive later input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "enabled": { - "default": false, - "description": "Whether pane input is synchronized. Defaults to false.", + "description": "whether pane input is synchronized", "type": "boolean" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -43219,23 +44344,29 @@ "additionalProperties": false, "properties": { "enabled": { - "type": "boolean" + "type": [ + "null", + "boolean" + ] }, - "window_id": { + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { "type": "string" } }, "required": [ - "window_id", - "enabled" + "name" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Set synchronized panes" }, "meta": { @@ -43247,18 +44378,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "When enabled, sets the inherited window default; pane-level overrides determine each pane's effective synchronized value. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Sets the window synchronization default (synchronize-panes); pane-level overrides still decide which panes receive later input.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "enabled": { - "default": false, - "description": "Whether pane input is synchronized. Defaults to false.", + "description": "whether pane input is synchronized", "type": "boolean" }, "window_id": { - "description": "The window ID, such as @1.", + "description": "the window id, such as @1", "type": "string" } }, @@ -43268,9 +44398,9 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "set_synchronize_panes", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], @@ -43278,15 +44408,23 @@ "additionalProperties": false, "properties": { "enabled": { - "type": "boolean" + "type": [ + "null", + "boolean" + ] }, - "window_id": { + "name": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { "type": "string" } }, "required": [ - "window_id", - "enabled" + "name" ], "type": "object" }, @@ -43303,64 +44441,80 @@ "name": "show_environment", "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 328 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 275 }, - "description": "Reads the environment tmux passes to processes. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Reads the environment tmux passes to processes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session_id": { - "description": "A session, such as $1; omit both for the global environment.", - "type": "string" - }, - "session_name": { - "description": "A session's exact name, in place of session_id.", + "session": { + "description": "a session name; omit for the only session", "type": "string" } }, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "count": { + "sessionName": { + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { "type": "integer" }, - "session": { - "type": "string" + "truncatedLines": { + "type": "integer" }, - "unset": { - "items": { - "type": "string" - }, - "type": "array" + "valuesWithheld": { + "type": "boolean" }, "variables": { - "additionalProperties": { - "type": "string" + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "removed": { + "type": "boolean" + }, + "scope": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "scope" + ], + "type": "object" }, - "type": "object" + "type": [ + "array" + ] } }, "required": [ - "session", - "count", + "sessionName", "variables", - "unset" + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Show tmux environment" }, "meta": { @@ -43372,57 +44526,75 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Reads the environment tmux passes to processes. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Reads the environment tmux passes to processes.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { - "session_id": { - "description": "A session, such as $1; omit both for the global environment.", - "type": "string" - }, - "session_name": { - "description": "A session's exact name, in place of session_id.", + "session": { + "description": "a session name; omit for the only session", "type": "string" } }, - "required": [], "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "show_environment", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "process-environment" ], "outputSchema": { "additionalProperties": false, "properties": { - "count": { + "sessionName": { + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { "type": "integer" }, - "session": { - "type": "string" + "truncatedLines": { + "type": "integer" }, - "unset": { - "items": { - "type": "string" - }, - "type": "array" + "valuesWithheld": { + "type": "boolean" }, "variables": { - "additionalProperties": { - "type": "string" + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "removed": { + "type": "boolean" + }, + "scope": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "scope" + ], + "type": "object" }, - "type": "object" + "type": [ + "array" + ] } }, "required": [ - "session", - "count", + "sessionName", "variables", - "unset" + "truncated" ], "type": "object" }, @@ -43439,62 +44611,77 @@ "name": "show_hooks", "wireName": "show_hooks", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 352 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 283 }, - "description": "Reads configured tmux hooks. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads configured tmux hooks.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "name": { - "description": "One hook name; omit to read all hooks in the scope.", + "description": "one hook name; omit to read all hooks in the scope", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, - "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, "hooks": { - "type": "object" + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "command" + ], + "type": "object" + }, + "type": [ + "array" + ] }, "scope": { "type": "string" - }, - "target": { - "type": "string" } }, "required": [ "scope", - "target", - "count", "hooks" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Show hooks" }, "meta": { @@ -43506,54 +44693,71 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Reads configured tmux hooks. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads configured tmux hooks.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "name": { - "description": "One hook name; omit to read all hooks in the scope.", + "description": "one hook name; omit to read all hooks in the scope", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, - "required": [], "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "show_hooks", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "configured-command" ], "outputSchema": { "additionalProperties": false, "properties": { - "count": { - "type": "integer" - }, "hooks": { - "type": "object" + "items": { + "additionalProperties": false, + "properties": { + "command": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "command" + ], + "type": "object" + }, + "type": [ + "array" + ] }, "scope": { "type": "string" - }, - "target": { - "type": "string" } }, "required": [ "scope", - "target", - "count", "hooks" ], "type": "object" @@ -43571,32 +44775,39 @@ "name": "show_option", "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 306 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 263 }, - "description": "Reads one named tmux option. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads one named tmux option.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "effective": { - "default": true, - "description": "Include an inherited value. Defaults to true.", + "description": "include an inherited value", "type": "boolean" }, "name": { - "description": "The exact option name.", + "description": "the exact option name", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, @@ -43608,32 +44819,33 @@ "outputSchema": { "additionalProperties": false, "properties": { + "inherited": { + "type": "boolean" + }, "name": { "type": "string" }, "scope": { "type": "string" }, - "target": { - "type": "string" + "set": { + "type": "boolean" }, "value": { "type": "string" } }, "required": [ - "scope", - "target", "name", - "value" + "scope", + "value", + "set" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Show one option" }, "meta": { @@ -43645,26 +44857,33 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Reads one named tmux option. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Reads one named tmux option.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "effective": { - "default": true, - "description": "Include an inherited value. Defaults to true.", + "description": "include an inherited value", "type": "boolean" }, "name": { - "description": "The exact option name.", + "description": "the exact option name", "type": "string" }, "scope": { - "description": "global, server, session, window or pane.", + "description": "global, server, session, window, or pane", + "enum": [ + "", + "global", + "server", + "session", + "window", + "pane" + ], "type": "string" }, "target": { - "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "description": "the target required by session, window, and pane scopes", "type": "string" } }, @@ -43674,9 +44893,9 @@ "type": "object" }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, "name": "show_option", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata", "configured-command" @@ -43684,24 +44903,27 @@ "outputSchema": { "additionalProperties": false, "properties": { + "inherited": { + "type": "boolean" + }, "name": { "type": "string" }, "scope": { "type": "string" }, - "target": { - "type": "string" + "set": { + "type": "boolean" }, "value": { "type": "string" } }, "required": [ - "scope", - "target", "name", - "value" + "scope", + "value", + "set" ], "type": "object" }, @@ -43718,19 +44940,19 @@ "name": "signal_channel", "wireName": "signal_channel", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 180 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 412 }, - "description": "Signals one server-wide tmux channel. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Signals one server-wide tmux channel.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "channel": { - "description": "The channel name.", + "description": "the tmux wait-for channel to signal", "type": "string" } }, @@ -43744,22 +44966,16 @@ "properties": { "channel": { "type": "string" - }, - "note": { - "type": "string" } }, "required": [ - "channel", - "note" + "channel" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Signal a channel" }, "meta": { @@ -43771,13 +44987,13 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Signals one server-wide tmux channel. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Signals one server-wide tmux channel.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "channel": { - "description": "The channel name.", + "description": "the tmux wait-for channel to signal", "type": "string" } }, @@ -43786,10 +45002,10 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "signal_channel", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], @@ -43798,14 +45014,10 @@ "properties": { "channel": { "type": "string" - }, - "note": { - "type": "string" } }, "required": [ - "channel", - "note" + "channel" ], "type": "object" }, @@ -43822,29 +45034,27 @@ "name": "snapshot_pane", "wireName": "snapshot_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 171 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 210 }, - "description": "Returns what a pane shows and its metadata, as list_panes describes a pane, in one call. Use it when both are needed; capture_pane alone reads less. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane metadata and bounded terminal content together.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -43856,39 +45066,112 @@ "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "dead": { + "type": "boolean" + }, + "exitStatus": { + "type": [ + "null", + "integer" + ] + }, + "lines": { "items": { "type": "string" }, - "type": "array" - }, - "cursor": { - "type": "string" - }, - "lines_dropped": { - "type": "integer" + "type": [ + "array" + ] }, "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], "type": "object" }, "truncated": { "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" } }, "required": [ + "lines", "pane", - "content", - "cursor", - "truncated", - "lines_dropped" + "dead", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Snapshot a pane" }, "meta": { @@ -43900,23 +45183,21 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Returns what a pane shows and its metadata, as list_panes describes a pane, in one call. Use it when both are needed; capture_pane alone reads less. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Returns pane metadata and bounded terminal content together.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "history": { - "default": false, - "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "description": "include scrollback as well as the visible screen", "type": "boolean" }, "max_lines": { - "default": 200, - "description": "Maximum lines, keeping the newest. Defaults to 200.", + "description": "maximum lines, keeping the newest", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" } }, @@ -43928,39 +45209,114 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "snapshot_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "content": { + "dead": { + "type": "boolean" + }, + "exitStatus": { + "type": [ + "null", + "integer" + ] + }, + "lines": { "items": { "type": "string" }, - "type": "array" - }, - "cursor": { - "type": "string" - }, - "lines_dropped": { - "type": "integer" + "type": [ + "array" + ] }, "pane": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": "string" + }, + "geometry": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "left": { + "type": "integer" + }, + "top": { + "type": "integer" + }, + "width": { + "type": "integer" + } + }, + "required": [ + "left", + "top", + "width", + "height" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isCaller": { + "type": [ + "null", + "boolean" + ] + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "windowId", + "index", + "currentCommand", + "active", + "geometry", + "isCaller" + ], "type": "object" }, "truncated": { "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" } }, "required": [ + "lines", "pane", - "content", - "cursor", - "truncated", - "lines_dropped" + "dead", + "truncated" ], "type": "object" }, @@ -43977,32 +45333,38 @@ "name": "split_window", "wireName": "split_window", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", - "line": 94 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 468 }, - "description": "Creates a pane whose configured process starts after the split. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a pane whose configured process starts after the split.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "direction": { - "description": "below, above, left or right.", + "description": "below, above, left, or right", + "enum": [ + "", + "below", + "above", + "right", + "left" + ], "type": "string" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "percent": { - "default": 50, - "description": "Share of the split occupied by the new pane. Defaults to 50.", + "description": "share of the split occupied by the new pane", "type": "integer" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" } }, @@ -44014,52 +45376,18 @@ "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" - }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Split a window" }, "meta": { @@ -44071,7 +45399,7 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Creates a pane whose configured process starts after the split. Start a pane's configured process; accepts no command payload.", + "description": "Start a pane's configured process; accepts no command payload. Creates a pane whose configured process starts after the split.", "inputLiteralization": { "start_directory": "double-hash-once" }, @@ -44079,20 +45407,26 @@ "additionalProperties": false, "properties": { "direction": { - "description": "below, above, left or right.", + "description": "below, above, left, or right", + "enum": [ + "", + "below", + "above", + "right", + "left" + ], "type": "string" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "percent": { - "default": 50, - "description": "Share of the split occupied by the new pane. Defaults to 50.", + "description": "share of the split occupied by the new pane", "type": "integer" }, "start_directory": { - "description": "An absolute literal start directory.", + "description": "an absolute literal start directory", "type": "string" } }, @@ -44101,54 +45435,22 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "split_window", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "command": { - "type": "string" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "path": { - "type": "string" - }, - "session_id": { - "type": "string" - }, - "size": { - "type": "string" - }, - "title": { - "type": "string" - }, - "window_id": { + "paneId": { "type": "string" } }, "required": [ - "id", - "index", - "window_id", - "session_id", - "active", - "command", - "path", - "title", - "size" + "paneId" ], "type": "object" }, @@ -44166,23 +45468,23 @@ "name": "swap_pane", "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 139 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 386 }, - "description": "Swaps the positions of two panes. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Swaps the positions of two panes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "other_pane_id": { - "description": "The other pane ID, such as %2.", + "description": "the other pane id, such as %2", "type": "string" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "one pane id, such as %1", "type": "string" } }, @@ -44195,24 +45497,22 @@ "outputSchema": { "additionalProperties": false, "properties": { - "other_pane_id": { + "paneId": { "type": "string" }, - "pane_id": { + "withPaneId": { "type": "string" } }, "required": [ - "pane_id", - "other_pane_id" + "paneId", + "withPaneId" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Swap panes" }, "meta": { @@ -44224,17 +45524,17 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Swaps the positions of two panes. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Swaps the positions of two panes.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "other_pane_id": { - "description": "The other pane ID, such as %2.", + "description": "the other pane id, such as %2", "type": "string" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "one pane id, such as %1", "type": "string" } }, @@ -44245,25 +45545,25 @@ "type": "object" }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayReturnUntrustedContent": true, "name": "swap_pane", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "other_pane_id": { + "paneId": { "type": "string" }, - "pane_id": { + "withPaneId": { "type": "string" } }, "required": [ - "pane_id", - "other_pane_id" + "paneId", + "withPaneId" ], "type": "object" }, @@ -44281,29 +45581,28 @@ "name": "wait_for_channel", "wireName": "wait_for_channel", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", - "line": 163 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 402 }, - "description": "Waits on tmux's channel state with a bounded timeout. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Waits on tmux's channel state with a bounded timeout.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "channel": { - "description": "A server-wide tmux channel name.", + "description": "a server-wide tmux channel name", "type": "string" }, "drain_first": { - "default": false, - "description": "Consume a pending signal before waiting. Defaults to false.", + "description": "consume a pending signal before waiting", "type": "boolean" }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -44315,35 +45614,25 @@ "outputSchema": { "additionalProperties": false, "properties": { - "channel": { - "type": "string" - }, - "effective_timeout": { - "type": "number" - }, - "note": { - "type": "string" + "effectiveTimeoutSeconds": { + "type": "integer" }, - "outcome": { - "type": "string" + "signalled": { + "type": "boolean" }, - "seconds": { - "type": "number" + "timeoutClamped": { + "type": "boolean" } }, "required": [ - "channel", - "outcome", - "seconds", - "effective_timeout" + "signalled", + "effectiveTimeoutSeconds" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Wait for a channel" }, "meta": { @@ -44355,23 +45644,22 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Waits on tmux's channel state with a bounded timeout. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Waits on tmux's channel state with a bounded timeout.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "channel": { - "description": "A server-wide tmux channel name.", + "description": "a server-wide tmux channel name", "type": "string" }, "drain_first": { - "default": false, - "description": "Consume a pending signal before waiting. Defaults to false.", + "description": "consume a pending signal before waiting", "type": "boolean" }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -44380,37 +45668,29 @@ ], "type": "object" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, "name": "wait_for_channel", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "channel": { - "type": "string" - }, - "effective_timeout": { - "type": "number" - }, - "note": { - "type": "string" + "effectiveTimeoutSeconds": { + "type": "integer" }, - "outcome": { - "type": "string" + "signalled": { + "type": "boolean" }, - "seconds": { - "type": "number" + "timeoutClamped": { + "type": "boolean" } }, "required": [ - "channel", - "outcome", - "seconds", - "effective_timeout" + "signalled", + "effectiveTimeoutSeconds" ], "type": "object" }, @@ -44427,62 +45707,60 @@ "name": "wait_for_text", "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", - "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", - "line": 246 + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "file": "mcp/manifest_catalog.go", + "line": 239 }, - "description": "Waits for new pane output without accepting executable input. Discounts recognized input from this server while pending and for ten seconds after submission. Output identical to that input and partially redrawn echoes are ambiguous; use run_shell_command for commands you start. Wait for the prompt before typing into a cold shell. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Waits for new pane output without accepting executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum observed lines to return. Defaults to 200.", + "description": "maximum observed lines to return", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "patterns": { - "description": "Text to wait for; any one ends the wait. One value may be sent on its own, without a list.", + "description": "text to wait for; any one ends the wait", "items": { "maxLength": 4096, "type": "string" }, "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] }, "regex": { - "default": false, - "description": "Treat patterns and stops as regular expressions. Defaults to false.", + "description": "treat patterns and stops as regular expressions", "type": "boolean" }, "stop": { - "description": "Failure text; any one ends the wait. One value may be sent on its own, without a list.", + "description": "failure text; any one ends the wait", "items": { "maxLength": 4096, "type": "string" }, "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -44494,60 +45772,69 @@ "outputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "type": "string" + "effectiveTimeoutSeconds": { + "type": "integer" }, - "effective_timeout": { + "elapsedSeconds": { "type": "number" }, - "lines_dropped": { - "type": "integer" - }, - "matched": { + "entryNote": { "type": "string" }, - "matched_line": { - "type": "string" + "found": { + "type": "boolean" }, - "note": { + "lines": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] + }, + "matched": { "type": "string" }, + "matchedAtEntry": { + "type": "boolean" + }, "outcome": { "type": "string" }, - "output": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pane_id": { + "paneId": { "type": "string" }, - "seconds": { - "type": "number" + "pendingInputOnly": { + "type": "boolean" + }, + "timeoutClamped": { + "type": "boolean" }, "truncated": { "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", + "paneId", "outcome", - "output", - "truncated", - "lines_dropped", - "cursor", - "seconds", - "effective_timeout" + "found", + "matchedAtEntry", + "pendingInputOnly", + "elapsedSeconds", + "effectiveTimeoutSeconds", + "truncated" ], "type": "object" }, "annotations": { "destructiveHint": true, - "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false, "title": "Wait for pane text" }, "meta": { @@ -44559,56 +45846,54 @@ "openWorldHint": true, "readOnlyHint": false }, - "description": "Waits for new pane output without accepting executable input. Discounts recognized input from this server while pending and for ten seconds after submission. Output identical to that input and partially redrawn echoes are ambiguous; use run_shell_command for commands you start. Wait for the prompt before typing into a cold shell. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Waits for new pane output without accepting executable input.", "inputLiteralization": {}, "inputSchema": { "additionalProperties": false, "properties": { "cursor": { - "description": "A cursor returned by an earlier capture.", + "description": "a cursor returned by an earlier capture", "type": "string" }, "max_lines": { - "default": 200, - "description": "Maximum observed lines to return. Defaults to 200.", + "description": "maximum observed lines to return", "type": "integer" }, "pane_id": { - "description": "The pane to act on, such as %1. Every listing tool returns these.", + "description": "the pane id, such as %1", "type": "string" }, "patterns": { - "description": "Text to wait for; any one ends the wait. One value may be sent on its own, without a list.", + "description": "text to wait for; any one ends the wait", "items": { "maxLength": 4096, "type": "string" }, "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] }, "regex": { - "default": false, - "description": "Treat patterns and stops as regular expressions. Defaults to false.", + "description": "treat patterns and stops as regular expressions", "type": "boolean" }, "stop": { - "description": "Failure text; any one ends the wait. One value may be sent on its own, without a list.", + "description": "failure text; any one ends the wait", "items": { "maxLength": 4096, "type": "string" }, "maxItems": 32, "type": [ - "array", - "string" + "null", + "array" ] }, "timeout": { - "default": 30, - "description": "Seconds to wait before giving up. Defaults to 30.0.", + "description": "seconds to wait before giving up", + "minimum": 0, "type": "number" } }, @@ -44620,60 +45905,71 @@ "mayExposeSecrets": true, "mayReturnUntrustedContent": true, "name": "wait_for_text", - "nestedAuthority": [], + "nestedAuthority": null, "outputClasses": [ - "tmux-metadata", - "terminal-content" + "terminal-content", + "tmux-metadata" ], "outputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "type": "string" + "effectiveTimeoutSeconds": { + "type": "integer" }, - "effective_timeout": { + "elapsedSeconds": { "type": "number" }, - "lines_dropped": { - "type": "integer" - }, - "matched": { + "entryNote": { "type": "string" }, - "matched_line": { - "type": "string" + "found": { + "type": "boolean" }, - "note": { + "lines": { + "items": { + "type": "string" + }, + "type": [ + "array" + ] + }, + "matched": { "type": "string" }, + "matchedAtEntry": { + "type": "boolean" + }, "outcome": { "type": "string" }, - "output": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pane_id": { + "paneId": { "type": "string" }, - "seconds": { - "type": "number" + "pendingInputOnly": { + "type": "boolean" + }, + "timeoutClamped": { + "type": "boolean" }, "truncated": { "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + }, + "truncatedLines": { + "type": "integer" } }, "required": [ - "pane_id", + "paneId", "outcome", - "output", - "truncated", - "lines_dropped", - "cursor", - "seconds", - "effective_timeout" + "found", + "matchedAtEntry", + "pendingInputOnly", + "elapsedSeconds", + "effectiveTimeoutSeconds", + "truncated" ], "type": "object" }, @@ -44689,10 +45985,10 @@ ], "wirePrefix": "", "selectable": true, - "source": "libtmux-mcp/src/main/java/io/github/libtmux/mcp", - "repo": "libtmux/libtmux-java", - "revision": "a0ecbc16da00140e2520462d478a2af470878272", - "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "source": "mcp", + "repo": "libtmux/libtmux-go", + "revision": "6f3df55f8a41999e41225eefb3940545b834e6a2", + "extractedRevision": "6f3df55f8a41999e41225eefb3940545b834e6a2", "selection": { "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" }, @@ -44700,31 +45996,31 @@ "capabilities": { "logging": {}, "resources": { - "listChanged": false, - "subscribe": false + "listChanged": true }, "tools": { - "listChanged": false + "listChanged": true } }, "prompts": [], "protocolVersion": "2025-11-25", "resources": [ { - "description": "The startup-frozen effective tool surface and selected tmux socket.", + "description": "The selected socket, effective tools, schemas, input literalization, and aggregate authority.", "mimeType": "application/json", "name": "tmux capabilities", + "title": "Startup-frozen tmux MCP capabilities", "uri": "tmux://capabilities" } ], "resourceTemplates": [], "serverInfo": { "name": "libtmux", - "version": "0.0.1-alpha.17-SNAPSHOT" + "version": "v0.0.1-alpha.12" } } }, - "csharp": { + "java": { "tools": [ "call_read_tools_batch", "capture_pane", @@ -44777,28 +46073,27 @@ "name": "call_read_tools_batch", "wireName": "call_read_tools_batch", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 586 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 391 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Execute up to 16 declared inspect operations serially; inner operations receive no separate approval.", + "description": "Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval, and its nested authority is disclosed. The complete JSON-RPC response is capped at 1,000,000 bytes; a removed nested envelope is marked on its row and counted in truncatedBytes. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "onError": { - "default": "stop", - "description": "Stop after the first failed operation, or continue serially.", + "description": "stop or continue; defaults to stop.", "enum": [ - "continue", - "stop" + "stop", + "continue" ], "type": "string" }, "operations": { - "description": "Between 1 and 16 declared inspect calls, executed serially without separate approval for each inner operation.", + "description": "Typed calls within the disclosed nested authority.", "items": { "oneOf": [ { @@ -44806,40 +46101,13 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": { - "includeHistory": { - "default": false, - "description": "Include scrollback.", - "type": "boolean" - }, - "joinWrappedLines": { - "default": false, - "description": "Rejoin tmux-wrapped lines.", - "type": "boolean" - }, - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, + "properties": {}, + "required": [], "type": "object" }, "tool": { - "const": "capture_pane" + "const": "list_sessions", + "type": "string" } }, "required": [ @@ -44853,37 +46121,21 @@ "arguments": { "additionalProperties": false, "properties": { - "cursor": { - "default": null, - "description": "The opaque cursor returned by the previous call. Omit to start from what is on screen now.", - "type": [ - "string", - "null" - ] - }, - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "session_id": { + "description": "Only windows in this session, such as $1.", + "type": "string" }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "session_name": { + "description": "Only windows in the session with this exact name.", + "type": "string" } }, + "required": [], "type": "object" }, "tool": { - "const": "capture_since" + "const": "list_windows", + "type": "string" } }, "required": [ @@ -44896,26 +46148,13 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": { - "position": { - "description": "The zero-based pane index.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": "integer" - }, - "windowId": { - "description": "The window id.", - "type": "string" - } - }, - "required": [ - "windowId", - "position" - ], + "properties": {}, + "required": [], "type": "object" }, "tool": { - "const": "find_pane_by_position" + "const": "list_panes", + "type": "string" } }, "required": [ @@ -44928,19 +46167,13 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": { - "paneId": { - "description": "A pane id.", - "type": "string" - } - }, - "required": [ - "paneId" - ], + "properties": {}, + "required": [], "type": "object" }, "tool": { - "const": "get_pane_info" + "const": "get_server_info", + "type": "string" } }, "required": [ @@ -44953,11 +46186,20 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, + "properties": { + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id" + ], "type": "object" }, "tool": { - "const": "get_server_info" + "const": "get_session_info", + "type": "string" } }, "required": [ @@ -44971,18 +46213,19 @@ "arguments": { "additionalProperties": false, "properties": { - "session": { - "description": "A session id or name.", + "window_id": { + "description": "The window ID, such as @1.", "type": "string" } }, "required": [ - "session" + "window_id" ], "type": "object" }, "tool": { - "const": "get_session_info" + "const": "get_window_info", + "type": "string" } }, "required": [ @@ -44996,29 +46239,19 @@ "arguments": { "additionalProperties": false, "properties": { - "names": { - "description": "Variable names such as session_name, without #{...}. Between 1 and 64 names, each at most 64 letters, digits and underscores.", - "items": { - "type": "string" - }, - "type": "array" - }, - "paneId": { - "default": null, - "description": "A pane id used as the lookup context. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" } }, "required": [ - "names" + "pane_id" ], "type": "object" }, "tool": { - "const": "get_tmux_variables" + "const": "get_pane_info", + "type": "string" } }, "required": [ @@ -45032,18 +46265,29 @@ "arguments": { "additionalProperties": false, "properties": { - "windowId": { - "description": "A window id.", + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" } }, "required": [ - "windowId" + "pane_id" ], "type": "object" }, "tool": { - "const": "get_window_info" + "const": "capture_pane", + "type": "string" } }, "required": [ @@ -45057,27 +46301,28 @@ "arguments": { "additionalProperties": false, "properties": { - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] + "cursor": { + "description": "A cursor returned by an earlier capture.", + "type": "string" }, - "windowId": { - "default": null, - "description": "A window id. Omit for every window.", - "type": [ - "string", - "null" - ] + "max_lines": { + "default": 200, + "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" } }, + "required": [ + "pane_id" + ], "type": "object" }, "tool": { - "const": "list_panes" + "const": "capture_since", + "type": "string" } }, "required": [ @@ -45090,11 +46335,30 @@ "properties": { "arguments": { "additionalProperties": false, - "properties": {}, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], "type": "object" }, "tool": { - "const": "list_sessions" + "const": "snapshot_pane", + "type": "string" } }, "required": [ @@ -45108,19 +46372,35 @@ "arguments": { "additionalProperties": false, "properties": { - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] + "max_lines": { + "default": 200, + "description": "Maximum matches across all panes. Defaults to 200.", + "type": "integer" + }, + "max_matches_per_pane": { + "default": 5, + "description": "Maximum matching lines per pane. Defaults to 5.", + "type": "integer" + }, + "pattern": { + "description": "The bounded text or regular expression to search for.", + "maxLength": 4096, + "type": "string" + }, + "regex": { + "default": false, + "description": "Treat pattern as a regular expression. Defaults to false.", + "type": "boolean" } }, + "required": [ + "pattern" + ], "type": "object" }, "tool": { - "const": "list_windows" + "const": "search_panes", + "type": "string" } }, "required": [ @@ -45134,43 +46414,24 @@ "arguments": { "additionalProperties": false, "properties": { - "ignoreCase": { - "default": true, - "description": "Ignore case.", - "type": "boolean" - }, - "includeHistory": { - "default": false, - "description": "Search scrollback too.", - "type": "boolean" - }, - "maxMatchesPerPane": { - "default": 20, - "description": "Maximum matches per pane.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": "integer" - }, - "pattern": { - "description": "A linear-time regular expression, at most 999 UTF-8 bytes. .NET syntax without lookarounds, backreferences or atomic groups.", + "position": { + "description": "top-left, top-right, bottom-left or bottom-right.", "type": "string" }, - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" } }, "required": [ - "pattern" + "window_id", + "position" ], "type": "object" }, "tool": { - "const": "search_panes" + "const": "find_pane_by_position", + "type": "string" } }, "required": [ @@ -45184,27 +46445,31 @@ "arguments": { "additionalProperties": false, "properties": { - "name": { - "default": null, - "description": "One variable name, which answers its value. Omit for every name with hasValue instead of values.", + "names": { + "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, "type": [ - "string", - "null" + "array", + "string" ] }, - "session": { - "default": null, - "description": "A session id or name. Omit for the server environment.", - "type": [ - "string", - "null" - ] + "pane": { + "description": "An optional pane context.", + "type": "string" } }, + "required": [ + "names" + ], "type": "object" }, "tool": { - "const": "show_environment" + "const": "get_tmux_variables", + "type": "string" } }, "required": [ @@ -45218,30 +46483,32 @@ "arguments": { "additionalProperties": false, "properties": { - "paneId": { - "default": null, - "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "effective": { + "default": true, + "description": "Include an inherited value. Defaults to true.", + "type": "boolean" + }, + "name": { + "description": "The exact option name.", + "type": "string" }, "scope": { - "default": "Session", - "description": "Server, Session, Window, or Pane.", - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", "type": "string" } }, + "required": [ + "name" + ], "type": "object" }, "tool": { - "const": "show_hooks" + "const": "show_option", + "type": "string" } }, "required": [ @@ -45255,37 +46522,21 @@ "arguments": { "additionalProperties": false, "properties": { - "name": { - "description": "The option name.", + "session_id": { + "description": "A session, such as $1; omit both for the global environment.", "type": "string" }, - "paneId": { - "default": null, - "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "scope": { - "default": "Pane", - "description": "Server, Session, Window, or Pane.", - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], + "session_name": { + "description": "A session's exact name, in place of session_id.", "type": "string" } }, - "required": [ - "name" - ], + "required": [], "type": "object" }, "tool": { - "const": "show_option" + "const": "show_environment", + "type": "string" } }, "required": [ @@ -45299,29 +46550,25 @@ "arguments": { "additionalProperties": false, "properties": { - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "name": { + "description": "One hook name; omit to read all hooks in the scope.", + "type": "string" }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" } }, + "required": [], "type": "object" }, "tool": { - "const": "snapshot_pane" + "const": "show_hooks", + "type": "string" } }, "required": [ @@ -45342,6 +46589,7 @@ "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { "failed": { "type": "integer" @@ -45351,17 +46599,53 @@ }, "results": { "items": { + "additionalProperties": false, "properties": { "error": { - "type": [ - "string", - "null" + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } ] }, "index": { "type": "integer" }, - "result": true, + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "_meta": { + "type": "object" + }, + "content": { + "items": { + "type": "object" + }, + "type": "array" + }, + "isError": { + "type": "boolean" + }, + "structuredContent": { + "type": "object" + } + }, + "required": [ + "content", + "isError" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, "resultTruncated": { "type": "boolean" }, @@ -45385,9 +46669,13 @@ "type": "array" }, "stoppedAt": { - "type": [ - "integer", - "null" + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } ] }, "succeeded": { @@ -45416,550 +46704,743 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Call read tools batch" + "title": "Call read tools in a batch" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "call_read_tools_batch", - "nestedAuthority": [ - "capture_pane", - "capture_since", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "list_panes", - "list_sessions", - "list_windows", - "search_panes", - "show_environment", - "show_hooks", - "show_option", - "snapshot_pane" - ], - "outputClasses": [ - "configured-command", - "process-environment", - "terminal-content", - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_pane", - "wireName": "capture_pane", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 576 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read the text a pane is showing, and optionally its scrollback. The newest lines are always kept; anything dropped to fit the budget is reported. To watch a pane across several turns, use capture_since instead — it returns only what is new.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "includeHistory": { - "default": false, - "description": "Include scrollback.", - "type": "boolean" - }, - "joinWrappedLines": { - "default": false, - "description": "Rejoin tmux-wrapped lines.", - "type": "boolean" - }, - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "content": { - "properties": { - "droppedBytes": { - "type": "integer" - }, - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "lines", - "truncated", - "droppedLines", - "droppedBytes" - ], - "type": "object" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "content" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Capture pane" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, + "description": "Calls up to sixteen eligible inspect tools serially; inner tools receive no separate approval, and its nested authority is disclosed. The complete JSON-RPC response is capped at 1,000,000 bytes; a removed nested envelope is marked on its row and counted in truncatedBytes. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_pane", - "nestedAuthority": [], - "outputClasses": [ - "terminal-content", - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_since", - "wireName": "capture_since", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 577 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read only what a pane has printed since the last call. Pass back the cursor each time. Use this to watch a long-running process across turns: the tenth read costs what the first did, where re-capturing the pane would return everything again. Call with no cursor to start watching from now.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "default": null, - "description": "The opaque cursor returned by the previous call. Omit to start from what is on screen now.", - "type": [ - "string", - "null" - ] - }, - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "anchorLost": { - "type": "boolean" - }, - "content": { + "inputSchema": { + "additionalProperties": false, "properties": { - "droppedBytes": { - "type": "integer" - }, - "droppedLines": { - "type": "integer" + "onError": { + "description": "stop or continue; defaults to stop.", + "enum": [ + "stop", + "continue" + ], + "type": "string" }, - "lines": { + "operations": { + "description": "Typed calls within the disclosed nested authority.", "items": { - "type": "string" - }, - "type": "array" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "lines", - "truncated", - "droppedLines", - "droppedBytes" - ], - "type": "object" - }, - "cursor": { - "type": "string" - }, - "linesMissed": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "content", - "cursor", - "linesMissed", - "anchorLost" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Capture since" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_since", - "nestedAuthority": [], - "outputClasses": [ - "terminal-content", - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 613 - }, - "description": "Delete tmux state; accepts no command payload. Delete a pane's scrollback history, keeping what the screen shows. Deleted history cannot be read back.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "changed" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Clear pane scrollback" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "clear_pane_scrollback", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "create_session", - "wireName": "create_session", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 603 - }, - "description": "Start a pane's configured process; accepts no command payload. Create a detached tmux session and return its ids. Give a width and height when nothing will attach to it: a session with no client keeps tmux's default 80x24, which truncates wide output.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "default": null, - "description": "Rows. Omit for tmux's default of 24.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "name": { - "default": null, - "description": "The session name. Omit and tmux names it with a number.", - "type": [ - "string", - "null" - ] - }, - "startDirectory": { - "default": null, - "description": "The literal starting directory. Omit for the MCP server's own working directory.", - "type": [ - "string", - "null" - ] - }, - "width": { - "default": null, - "description": "Columns. Omit for tmux's default of 80.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "changed" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Create session" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once" + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_sessions", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "Only windows in this session, such as $1.", + "type": "string" + }, + "session_name": { + "description": "Only windows in the session with this exact name.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_windows", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_panes", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "get_server_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "tool": { + "const": "get_pane_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "tool": { + "const": "capture_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "A cursor returned by an earlier capture.", + "type": "string" + }, + "max_lines": { + "default": 200, + "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "tool": { + "const": "capture_since", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "max_lines": { + "default": 200, + "description": "Maximum matches across all panes. Defaults to 200.", + "type": "integer" + }, + "max_matches_per_pane": { + "default": 5, + "description": "Maximum matching lines per pane. Defaults to 5.", + "type": "integer" + }, + "pattern": { + "description": "The bounded text or regular expression to search for.", + "maxLength": 4096, + "type": "string" + }, + "regex": { + "default": false, + "description": "Treat pattern as a regular expression. Defaults to false.", + "type": "boolean" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "position": { + "description": "top-left, top-right, bottom-left or bottom-right.", + "type": "string" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "position" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "names": { + "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "pane": { + "description": "An optional pane context.", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "effective": { + "default": true, + "description": "Include an inherited value. Defaults to true.", + "type": "boolean" + }, + "name": { + "description": "The exact option name.", + "type": "string" + }, + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "A session, such as $1; omit both for the global environment.", + "type": "string" + }, + "session_name": { + "description": "A session's exact name, in place of session_id.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_environment", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "One hook name; omit to read all hooks in the scope.", + "type": "string" + }, + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_hooks", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "create_session", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "configured-process", - "tmuxEffects": [ - "change", - "observe" - ], - "toolset": "execute" + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "call_read_tools_batch", + "nestedAuthority": [ + "list_sessions", + "list_windows", + "list_panes", + "get_server_info", + "get_session_info", + "get_window_info", + "get_pane_info", + "capture_pane", + "capture_since", + "snapshot_pane", + "search_panes", + "find_pane_by_position", + "get_tmux_variables", + "show_option", + "show_environment", + "show_hooks" + ], + "outputClasses": [ + "tmux-metadata", + "terminal-content", + "process-environment", + "configured-command" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "failed": { + "type": "integer" + }, + "onError": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "index": { + "type": "integer" + }, + "result": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "_meta": { + "type": "object" + }, + "content": { + "items": { + "type": "object" + }, + "type": "array" + }, + "isError": { + "type": "boolean" + }, + "structuredContent": { + "type": "object" + } + }, + "required": [ + "content", + "isError" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "resultTruncated": { + "type": "boolean" + }, + "success": { + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "index", + "tool", + "success", + "error", + "result", + "resultTruncated" + ], + "type": "object" + }, + "type": "array" + }, + "stoppedAt": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "succeeded": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" + } + }, + "required": [ + "results", + "succeeded", + "failed", + "stoppedAt", + "truncated", + "truncatedBytes", + "onError" + ], + "type": "object" + }, + "processReach": "none", + "title": "Call read tools in a batch", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" } } }, { - "name": "create_window", - "wireName": "create_window", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 604 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 134 }, - "description": "Start a pane's configured process; accepts no command payload. Create a window in a tmux session and return its ids.", + "description": "Returns what a pane shows now, its newest lines first to go when bounded, and a cursor for capture_since. Use it to read a pane once. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "default": null, - "description": "The window name. Omit and tmux names it after the program it runs.", - "type": [ - "string", - "null" - ] + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" }, - "session": { - "default": null, - "description": "A session id or name. Omit for the first session.", - "type": [ - "string", - "null" - ] + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" }, - "startDirectory": { - "default": null, - "description": "The literal starting directory. Omit for the MCP server's own working directory.", - "type": [ - "string", - "null" - ] + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" } }, + "required": [ + "pane_id" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "content": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cursor": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "lines": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "lines_dropped": { + "type": "integer" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" + }, + "pane_id": { + "type": "string" + }, + "truncated": { + "type": "boolean" } }, "required": [ - "changed" + "pane_id", + "lines", + "content", + "truncated", + "lines_dropped", + "cursor" ], "type": "object" }, @@ -45968,153 +47449,170 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Create window" + "title": "Capture a pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "create_window", + "description": "Returns what a pane shows now, its newest lines first to go when bounded, and a cursor for capture_since. Use it to read a pane once. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_pane", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "processReach": "configured-process", + "outputSchema": { + "additionalProperties": false, + "properties": { + "content": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cursor": { + "type": "string" + }, + "lines": { + "type": "integer" + }, + "lines_dropped": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "pane_id": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane_id", + "lines", + "content", + "truncated", + "lines_dropped", + "cursor" + ], + "type": "object" + }, + "processReach": "none", + "title": "Capture a pane", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", + "name": "capture_since", + "wireName": "capture_since", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 580 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 153 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane sitting at an index within a window. Answers nothing rather than failing when no pane is at that position.", + "description": "Returns only the output a pane produced after a cursor from capture_pane or an earlier capture_since. Use it to follow a pane across turns without rereading it. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "position": { - "description": "The zero-based pane index.", - "maximum": 2147483647, - "minimum": -2147483648, + "cursor": { + "description": "A cursor returned by an earlier capture.", + "type": "string" + }, + "max_lines": { + "default": 200, + "description": "Maximum new lines, keeping the newest. Defaults to 200.", "type": "integer" }, - "windowId": { - "description": "The window id.", + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" } }, "required": [ - "windowId", - "position" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": [ - "string", - "null" - ] - }, - "currentPath": { - "type": [ - "string", - "null" - ] + "content": { + "items": { + "type": "string" + }, + "type": "array" }, - "dead": { + "continuous": { "type": "boolean" }, - "height": { - "type": "integer" - }, - "historyLimit": { - "type": [ - "integer", - "null" - ] - }, - "historySize": { - "type": [ - "integer", - "null" - ] + "cursor": { + "type": "string" }, - "index": { + "lines_dropped": { "type": "integer" }, - "inMode": { - "type": "boolean" - }, - "isCaller": { - "type": "boolean" - }, - "paneId": { - "type": "string" - }, - "pid": { - "type": [ - "integer", - "null" - ] + "new_lines": { + "type": "integer" }, - "sessionId": { + "note": { "type": "string" }, - "title": { - "type": [ - "string", - "null" - ] - }, - "width": { - "type": "integer" - }, - "windowId": { + "pane_id": { "type": "string" }, - "zoomed": { + "truncated": { "type": "boolean" } }, "required": [ - "paneId", - "windowId", - "sessionId", - "index", - "width", - "height", - "title", - "active", - "dead", - "zoomed", - "inMode", - "currentCommand", - "currentPath", - "pid", - "historySize", - "historyLimit", - "isCaller" + "pane_id", + "new_lines", + "content", + "cursor", + "continuous", + "truncated", + "lines_dropped" ], "type": "object" }, @@ -46123,142 +47621,138 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Find pane by position" + "title": "Capture new pane output" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Returns only the output a pane produced after a cursor from capture_pane or an earlier capture_since. Use it to follow a pane across turns without rereading it. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "find_pane_by_position", + "inputSchema": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "A cursor returned by an earlier capture.", + "type": "string" + }, + "max_lines": { + "default": 200, + "description": "Maximum new lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_since", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" + "tmux-metadata", + "terminal-content" ], - "toolset": "inspect" - } - } - }, - { - "name": "get_pane_info", - "wireName": "get_pane_info", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 575 + "outputSchema": { + "additionalProperties": false, + "properties": { + "content": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continuous": { + "type": "boolean" + }, + "cursor": { + "type": "string" + }, + "lines_dropped": { + "type": "integer" + }, + "new_lines": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "pane_id": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane_id", + "new_lines", + "content", + "cursor", + "continuous", + "truncated", + "lines_dropped" + ], + "type": "object" + }, + "processReach": "none", + "title": "Capture new pane output", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", + "line": 25 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one pane's size, title, running command, working directory, process ID, history size and limit, and whether it is active, dead, zoomed, in a mode or the pane this server runs in. This is metadata only; to read what the pane shows, use capture_pane or snapshot_pane.", + "description": "Deletes retained scrollback from one pane. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "A pane id.", + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" } }, "required": [ - "paneId" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": [ - "string", - "null" - ] - }, - "currentPath": { - "type": [ - "string", - "null" - ] - }, - "dead": { - "type": "boolean" - }, - "height": { - "type": "integer" - }, - "historyLimit": { - "type": [ - "integer", - "null" - ] - }, - "historySize": { - "type": [ - "integer", - "null" - ] - }, - "index": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "isCaller": { + "cleared": { "type": "boolean" }, - "paneId": { - "type": "string" - }, - "pid": { - "type": [ - "integer", - "null" - ] - }, - "sessionId": { - "type": "string" - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "width": { - "type": "integer" - }, - "windowId": { + "pane_id": { "type": "string" - }, - "zoomed": { - "type": "boolean" } }, "required": [ - "paneId", - "windowId", - "sessionId", - "index", - "width", - "height", - "title", - "active", - "dead", - "zoomed", - "inMode", - "currentCommand", - "currentPath", - "pid", - "historySize", - "historyLimit", - "isCaller" + "pane_id", + "cleared" ], "type": "object" }, @@ -46267,95 +47761,126 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get pane info" + "title": "Clear pane scrollback" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Deletes retained scrollback from one pane. Delete tmux state; accepts no command payload.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "get_pane_info", + "name": "clear_pane_scrollback", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "cleared": { + "type": "boolean" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "cleared" + ], + "type": "object" + }, "processReach": "none", + "title": "Clear pane scrollback", "tmuxEffects": [ - "observe" + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "get_server_info", - "wireName": "get_server_info", + "name": "create_session", + "wireName": "create_session", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 572 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 39 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read the tmux server's version and how many sessions, windows and panes it holds. Use to confirm a socket is alive and which tmux is running it.", + "description": "Creates a detached session whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, - "type": "object" - }, - "outputSchema": { "properties": { - "callerPaneId": { - "type": [ - "string", - "null" - ] + "height": { + "default": -1, + "description": "Initial height; supply with width. Defaults to -1.", + "type": "integer" }, - "callerPaneSocket": { - "type": [ - "string", - "null" - ] + "session_name": { + "description": "A literal session name.", + "type": "string" }, - "paneCount": { - "type": "integer" + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" }, - "sessionCount": { + "width": { + "default": -1, + "description": "Initial width; supply with height. Defaults to -1.", "type": "integer" }, - "socketName": { - "type": [ - "string", - "null" - ] + "window_name": { + "description": "A literal first-window name.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" }, - "socketPath": { - "type": [ - "string", - "null" - ] + "id": { + "type": "string" }, - "version": { - "type": [ - "string", - "null" - ] + "name": { + "type": "string" }, - "windowCount": { + "windows": { "type": "integer" } }, "required": [ - "socketName", - "socketPath", - "version", - "sessionCount", - "windowCount", - "paneCount", - "callerPaneId", - "callerPaneSocket" + "id", + "name", + "attached", + "windows" ], "type": "object" }, @@ -46364,75 +47889,168 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get server info" + "title": "Create a session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "get_server_info", + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Creates a detached session whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "inputLiteralization": { + "session_name": "double-hash-once", + "start_directory": "double-hash-once", + "window_name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "default": -1, + "description": "Initial height; supply with width. Defaults to -1.", + "type": "integer" + }, + "session_name": { + "description": "A literal session name.", + "type": "string" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + }, + "width": { + "default": -1, + "description": "Initial width; supply with height. Defaults to -1.", + "type": "integer" + }, + "window_name": { + "description": "A literal first-window name.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", + "outputSchema": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "attached", + "windows" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Create a session", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "get_session_info", - "wireName": "get_session_info", + "name": "create_window", + "wireName": "create_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 573 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 67 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one session's name, ID, window count and whether a client is attached, without listing every session. Give the session, or a window ID to read the session that holds it.", + "description": "Creates a window whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "A session id or name.", + "attach": { + "default": false, + "description": "Make the new window active. Defaults to false.", + "type": "boolean" + }, + "direction": { + "description": "before or after.", + "type": "string" + }, + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + }, + "window_name": { + "description": "A literal window name.", "type": "string" } }, "required": [ - "session" + "session_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "attached": { + "active": { "type": "boolean" }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, "name": { "type": "string" }, - "sessionId": { + "panes": { + "type": "integer" + }, + "session_id": { "type": "string" }, - "windowCount": { - "type": [ - "integer", - "null" - ] + "size": { + "type": "string" } }, "required": [ - "sessionId", + "id", + "index", "name", - "attached", - "windowCount" + "session_id", + "active", + "panes", + "size" ], "type": "object" }, @@ -46441,67 +48059,177 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get session info" + "title": "Create a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "get_session_info", + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Creates a window whose first pane runs the configured process. Start a pane's configured process; accepts no command payload.", + "inputLiteralization": { + "start_directory": "double-hash-once", + "window_name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "attach": { + "default": false, + "description": "Make the new window active. Defaults to false.", + "type": "boolean" + }, + "direction": { + "description": "before or after.", + "type": "string" + }, + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + }, + "window_name": { + "description": "A literal window name.", + "type": "string" + } + }, + "required": [ + "session_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 582 + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Create a window", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 219 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Expand named tmux format variables for a pane, such as session_name or window_width. Use it for fields nothing else answers; get_pane_info already returns the common ones, and show_option reads configuration rather than live state.", + "description": "Finds a pane at one of a window's four corners. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "names": { - "description": "Variable names such as session_name, without #{...}. Between 1 and 64 names, each at most 64 letters, digits and underscores.", - "items": { - "type": "string" - }, - "type": "array" + "position": { + "description": "top-left, top-right, bottom-left or bottom-right.", + "type": "string" }, - "paneId": { - "default": null, - "description": "A pane id used as the lookup context. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" } }, "required": [ - "names" + "window_id", + "position" ], "type": "object" }, "outputSchema": { - "additionalProperties": { - "type": "string" + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], "type": "object" }, "annotations": { @@ -46509,23 +48237,90 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get tmux variables" + "title": "Find pane by position" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "names": "validated-variable-name" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, + "description": "Finds a pane at one of a window's four corners. Inspect tmux metadata; accepts no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "position": { + "description": "top-left, top-right, bottom-left or bottom-right.", + "type": "string" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "position" + ], + "type": "object" + }, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "get_tmux_variables", + "name": "find_pane_by_position", "nestedAuthority": [], "outputClasses": [ - "configured-command", "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Find pane by position", "tmuxEffects": [ "observe" ], @@ -46534,76 +48329,71 @@ } }, { - "name": "get_window_info", - "wireName": "get_window_info", + "name": "get_pane_info", + "wireName": "get_pane_info", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 574 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 117 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one window's name, index, size, layout, pane count and whether it is its session's current window, without listing every window. Give the window ID, or a pane ID to read the window that holds it.", + "description": "Returns metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "windowId": { - "description": "A window id.", + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" } }, "required": [ - "windowId" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { "active": { "type": "boolean" }, - "height": { - "type": "integer" + "command": { + "type": "string" + }, + "id": { + "type": "string" }, "index": { "type": "integer" }, - "layout": { - "type": [ - "string", - "null" - ] - }, - "name": { + "path": { "type": "string" }, - "paneCount": { - "type": [ - "integer", - "null" - ] + "session_id": { + "type": "string" }, - "sessionId": { + "size": { "type": "string" }, - "width": { - "type": "integer" + "title": { + "type": "string" }, - "windowId": { + "window_id": { "type": "string" } }, "required": [ - "windowId", - "sessionId", + "id", "index", - "name", - "width", - "height", + "window_id", + "session_id", "active", - "paneCount", - "layout" + "command", + "path", + "title", + "size" ], "type": "object" }, @@ -46612,20 +48402,85 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get window info" + "title": "Get pane info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Returns metadata for one pane. Inspect tmux metadata; accepts no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "get_window_info", + "inputSchema": { + "additionalProperties": false, + "properties": { + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_pane_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Get pane info", "tmuxEffects": [ "observe" ], @@ -46634,59 +48489,44 @@ } }, { - "name": "kill_pane", - "wireName": "kill_pane", + "name": "get_server_info", + "wireName": "get_server_info", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 614 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 89 }, - "description": "Delete tmux state; accepts no command payload. Close a pane and end its program. Refuses the pane this server runs in; to remove a whole window, use kill_window.", + "description": "Reports whether the pinned server exists and its version. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "paneId": { - "description": "The pane id to kill.", - "type": "string" - } - }, - "required": [ - "paneId" - ], + "properties": {}, + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "identity": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "running": { + "type": "boolean" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "sessions": { + "type": "integer" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "version": { + "type": "string" } }, "required": [ - "changed" + "running", + "identity", + "version", + "sessions" ], "type": "object" }, @@ -46695,82 +48535,111 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill pane" + "title": "Get server info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Reports whether the pinned server exists and its version. Inspect tmux metadata; accepts no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_pane", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_server_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "identity": { + "type": "string" + }, + "running": { + "type": "boolean" + }, + "sessions": { + "type": "integer" + }, + "version": { + "type": "string" + } + }, + "required": [ + "running", + "identity", + "version", + "sessions" + ], + "type": "object" + }, "processReach": "none", + "title": "Get server info", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "kill_session", - "wireName": "kill_session", + "name": "get_session_info", + "wireName": "get_session_info", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 616 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 101 }, - "description": "Delete tmux state; accepts no command payload. Close a session with all its windows and panes. Refuses the session this server runs in.", + "description": "Returns metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "The session id or name to kill.", + "session_id": { + "description": "The session ID, such as $1.", "type": "string" } }, "required": [ - "session" + "session_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" + "attached": { + "type": "boolean" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "id": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "name": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "windows": { + "type": "integer" } }, "required": [ - "changed" + "id", + "name", + "attached", + "windows" ], "type": "object" }, @@ -46779,82 +48648,118 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill session" + "title": "Get session info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_session", - "nestedAuthority": [], + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Returns metadata for one session. Inspect tmux metadata; accepts no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_session_info", + "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "attached", + "windows" + ], + "type": "object" + }, "processReach": "none", + "title": "Get session info", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "kill_window", - "wireName": "kill_window", + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 615 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 272 }, - "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it. Refuses the window this server runs in.", + "description": "Reads a capped list of validated tmux variable names, not free-form formats. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "windowId": { - "description": "The window id to kill.", + "names": { + "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "pane": { + "description": "An optional pane context.", "type": "string" } }, "required": [ - "windowId" + "names" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "values": { + "type": "object" } }, "required": [ - "changed" + "values" ], "type": "object" }, @@ -46863,163 +48768,133 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill window" + "title": "Get tmux variables" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "kill_window", + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Reads a capped list of validated tmux variable names, not free-form formats. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "inputLiteralization": { + "names": "validated-variable-name" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "names": { + "description": "One to thirty-two variable names matching [A-Za-z][A-Za-z0-9_]*. One value may be sent on its own, without a list.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "pane": { + "description": "An optional pane context.", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_tmux_variables", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "values": { + "type": "object" + } + }, + "required": [ + "values" + ], + "type": "object" + }, "processReach": "none", + "title": "Get tmux variables", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "list_panes", - "wireName": "list_panes", + "name": "get_window_info", + "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 571 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 109 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List tmux panes, optionally within one session or window. Filter for isCaller=true to answer 'which pane am I in?', which finds one only when this server drives the caller's own socket — get_server_info says whose socket that is. This reads sizes and running commands, not terminal text — for that use search_panes.", + "description": "Returns metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "description": "A window id. Omit for every window.", - "type": [ - "string", - "null" - ] + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" } }, + "required": [ + "window_id" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "result": { - "items": { - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": [ - "string", - "null" - ] - }, - "currentPath": { - "type": [ - "string", - "null" - ] - }, - "dead": { - "type": "boolean" - }, - "height": { - "type": "integer" - }, - "historyLimit": { - "type": [ - "integer", - "null" - ] - }, - "historySize": { - "type": [ - "integer", - "null" - ] - }, - "index": { - "type": "integer" - }, - "inMode": { - "type": "boolean" - }, - "isCaller": { - "type": "boolean" - }, - "paneId": { - "type": "string" - }, - "pid": { - "type": [ - "integer", - "null" - ] - }, - "sessionId": { - "type": "string" - }, - "title": { - "type": [ - "string", - "null" - ] - }, - "width": { - "type": "integer" - }, - "windowId": { - "type": "string" - }, - "zoomed": { - "type": "boolean" - } - }, - "required": [ - "paneId", - "windowId", - "sessionId", - "index", - "width", - "height", - "title", - "active", - "dead", - "zoomed", - "inMode", - "currentCommand", - "currentPath", - "pid", - "historySize", - "historyLimit", - "isCaller" - ], - "type": "object" - }, - "type": "array" + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" } }, "required": [ - "result" + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" ], "type": "object" }, @@ -47028,21 +48903,77 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List panes" + "title": "Get window info" }, "meta": { - "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Returns metadata for one window. Inspect tmux metadata; accepts no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "list_panes", + "inputSchema": { + "additionalProperties": false, + "properties": { + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_window_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Get window info", "tmuxEffects": [ "observe" ], @@ -47051,56 +48982,51 @@ } }, { - "name": "list_sessions", - "wireName": "list_sessions", + "name": "kill_pane", + "wireName": "kill_pane", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 569 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", + "line": 33 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List the tmux sessions. This reads names and sizes, not terminal text — to find what a pane is showing, use search_panes.", + "description": "Deletes one pane and ends its process. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, + "properties": { + "confirm_self": { + "default": false, + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "type": "boolean" + }, + "pane_id": { + "description": "The pane ID, such as %1.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "result": { - "items": { - "properties": { - "attached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "sessionId": { - "type": "string" - }, - "windowCount": { - "type": [ - "integer", - "null" - ] - } - }, - "required": [ - "sessionId", - "name", - "attached", - "windowCount" - ], - "type": "object" - }, - "type": "array" + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "note": { + "type": "string" } }, "required": [ - "result" + "kind", + "id" ], "type": "object" }, @@ -47109,212 +49035,119 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List sessions" + "title": "Kill a pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Deletes one pane and ends its process. Delete tmux state; accepts no command payload.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "confirm_self": { + "default": false, + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "type": "boolean" + }, + "pane_id": { + "description": "The pane ID, such as %1.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "list_sessions", + "name": "kill_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "list_windows", - "wireName": "list_windows", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 570 - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List tmux windows, optionally within one session. This reads names and layouts, not terminal text — to find what a pane is showing, use search_panes.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "result": { - "items": { - "properties": { - "active": { - "type": "boolean" - }, - "height": { - "type": "integer" - }, - "index": { - "type": "integer" - }, - "layout": { - "type": [ - "string", - "null" - ] - }, - "name": { - "type": "string" - }, - "paneCount": { - "type": [ - "integer", - "null" - ] - }, - "sessionId": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowId": { - "type": "string" - } + "outputSchema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" }, - "required": [ - "windowId", - "sessionId", - "index", - "name", - "width", - "height", - "active", - "paneCount", - "layout" - ], - "type": "object" + "kind": { + "type": "string" + }, + "note": { + "type": "string" + } }, - "type": "array" - } - }, - "required": [ - "result" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "List windows" - }, - "meta": { - "anthropic/alwaysLoad": true, - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "list_windows", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], + "required": [ + "kind", + "id" + ], + "type": "object" + }, "processReach": "none", + "title": "Kill a pane", "tmuxEffects": [ - "observe" + "observe", + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "move_window", - "wireName": "move_window", + "name": "kill_session", + "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 595 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", + "line": 52 }, - "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session. With replaceExisting it takes an index that is already occupied by killing the window there, which needs the teardown toolset.", + "description": "Deletes one session and every window and pane in it. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "destination": { - "default": "", - "description": "The destination window index. Omit for the next free index, as an empty one does.", - "type": "string" - }, - "replaceExisting": { + "confirm_self": { "default": false, - "description": "Kill the window already at that index and take its place. Needs the same authority as kill_window, because that is what it does to it.", + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", "type": "boolean" }, - "session": { - "default": null, - "description": "The destination session id or name. Omit to stay in the window's session.", - "type": [ - "string", - "null" - ] - }, - "windowId": { - "description": "The window id to move.", + "session_id": { + "description": "The session ID, such as $1.", "type": "string" } }, "required": [ - "windowId" + "session_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "kind": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" } }, "required": [ - "changed" + "kind", + "id" ], "type": "object" }, @@ -47323,100 +49156,119 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Move window" + "title": "Kill a session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Deletes one session and every window and pane in it. Delete tmux state; accepts no command payload.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "confirm_self": { + "default": false, + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "type": "boolean" + }, + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "move_window", + "name": "kill_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "kind", + "id" + ], + "type": "object" + }, "processReach": "none", + "title": "Kill a session", "tmuxEffects": [ - "change", - "observe" + "observe", + "delete" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "kill_window", + "wireName": "kill_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 610 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/TeardownTools.java", + "line": 42 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste a block of text into exactly one pane through a tmux buffer. Use for multi-line text, or anything an editor would mangle if typed — bracketed paste stops auto-indent. Set enter to append a newline to that same private buffer. It refuses a target in a human-owned mode and never fans out to synchronized siblings. The temporary buffer is deleted afterwards; if cleanup fails, the result identifies what remains.", + "description": "Deletes one window and every pane in it. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "bracketed": { - "default": true, - "description": "Use bracketed paste.", - "type": "boolean" - }, - "enter": { + "confirm_self": { "default": false, - "description": "Append Enter to the same paste buffer.", + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", "type": "boolean" }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "text": { - "description": "The text to paste.", + "window_id": { + "description": "The window ID, such as @1.", "type": "string" } }, "required": [ - "text" + "window_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "kind": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" } }, "required": [ - "changed" + "kind", + "id" ], "type": "object" }, @@ -47425,90 +49277,150 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Paste text" + "title": "Kill a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Deletes one window and every pane in it. Delete tmux state; accepts no command payload.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "confirm_self": { + "default": false, + "description": "Permit ending the pane this MCP process runs in. Defaults to false.", + "type": "boolean" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "paste_text", + "name": "kill_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "pane-input", + "outputSchema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "kind", + "id" + ], + "type": "object" + }, + "processReach": "none", + "title": "Kill a window", "tmuxEffects": [ - "change", - "observe" + "observe", + "delete" ], - "toolset": "execute" + "toolset": "teardown" } } }, { - "name": "rename_session", - "wireName": "rename_session", + "name": "list_panes", + "wireName": "list_panes", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 588 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 69 }, - "description": "Change tmux state; no client-supplied executable input. Rename a tmux session. Its id does not change, so anything holding one still works.", + "description": "Lists pane metadata and stable pane IDs. No filter; use the 'command' field to find a pane by what it runs. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "name": { - "description": "The new session name.", - "type": "string" - }, - "session": { - "default": null, - "description": "A session id or name. Omit for the first session.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name" - ], + "properties": {}, + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "count": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "caller": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "path": { + "type": "string" + }, + "session": { + "type": "string" + }, + "size": { + "type": "string" + }, + "window": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "window_id", + "command", + "path", + "size", + "active" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "changed" + "count", + "panes" ], "type": "object" }, @@ -47517,92 +49429,168 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename session" + "title": "List panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "rename_session", + "description": "Lists pane metadata and stable pane IDs. No filter; use the 'command' field to find a pane by what it runs. Inspect tmux metadata; accepts no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_panes", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "change", - "observe" - ], - "toolset": "manage" + "outputSchema": { + "additionalProperties": false, + "properties": { + "count": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "caller": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "path": { + "type": "string" + }, + "session": { + "type": "string" + }, + "size": { + "type": "string" + }, + "window": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "session", + "window", + "window_id", + "command", + "path", + "size", + "active" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "panes" + ], + "type": "object" + }, + "processReach": "none", + "title": "List panes", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" } } }, { - "name": "rename_window", - "wireName": "rename_window", + "name": "list_sessions", + "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 589 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 39 }, - "description": "Change tmux state; no client-supplied executable input. Rename a tmux window. Its id does not change.", + "description": "Lists sessions on the pinned tmux server. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "name": { - "description": "The new window name.", - "type": "string" - }, - "windowId": { - "default": null, - "description": "A window id. Omit for this server's own window, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name" - ], + "properties": {}, + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "count": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "sessions": { + "items": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "window_names": { + "items": { + "type": "string" + }, + "type": "array" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "attached", + "windows", + "window_names" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "changed" + "count", + "sessions" ], "type": "object" }, @@ -47611,110 +49599,166 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename window" + "title": "List sessions" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "rename_window", + "description": "Lists sessions on the pinned tmux server. Inspect tmux metadata; accepts no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_sessions", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "count": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "sessions": { + "items": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "window_names": { + "items": { + "type": "string" + }, + "type": "array" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "attached", + "windows", + "window_names" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "sessions" + ], + "type": "object" + }, "processReach": "none", + "title": "List sessions", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "list_windows", + "wireName": "list_windows", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 594 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 53 }, - "description": "Change tmux state; no client-supplied executable input. Resize a pane, or zoom it to fill its window. Widening a pane before reading it is the fix for output that comes back wrapped across rows.", + "description": "Lists windows, optionally only those in one session, named by ID or by name. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "default": null, - "description": "Rows. Omit to keep the current height.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "width": { - "default": null, - "description": "Columns. Omit to keep the current width.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "session_id": { + "description": "Only windows in this session, such as $1.", + "type": "string" }, - "zoom": { - "default": false, - "description": "Zoom the pane.", - "type": "boolean" + "session_name": { + "description": "Only windows in the session with this exact name.", + "type": "string" } }, + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "count": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session", + "active", + "panes" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "changed" + "count", + "windows" ], "type": "object" }, @@ -47723,103 +49767,153 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize pane" + "title": "List windows" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Lists windows, optionally only those in one session, named by ID or by name. Inspect tmux metadata; accepts no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "resize_pane", + "inputSchema": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "Only windows in this session, such as $1.", + "type": "string" + }, + "session_name": { + "description": "Only windows in the session with this exact name.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_windows", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "count": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session", + "active", + "panes" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "windows" + ], + "type": "object" + }, "processReach": "none", + "title": "List windows", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "resize_window", - "wireName": "resize_window", + "name": "move_window", + "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 593 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 121 }, - "description": "Change tmux state; no client-supplied executable input. Resize a window to a width and height in cells; its panes resize with it. To resize one pane, use resize_pane.", + "description": "Moves a window to another session, optionally at an index. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "default": null, - "description": "Rows. Omit to keep the current height.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "index": { + "default": -1, + "description": "A destination window index; omit for tmux's choice. Defaults to -1.", + "type": "integer" }, - "width": { - "default": null, - "description": "Columns. Omit to keep the current width.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "session_id": { + "description": "The destination session ID, such as $1.", + "type": "string" }, - "windowId": { - "default": null, - "description": "A window id. Omit for this server's own window, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" } }, + "required": [ + "window_id", + "session_id" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "index": { + "type": "integer" + }, + "session_id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "window_id": { + "type": "string" } }, "required": [ - "changed" + "window_id", + "session_id", + "index" ], "type": "object" }, @@ -47828,96 +49922,134 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize window" + "title": "Move a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Moves a window to another session, optionally at an index. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "index": { + "default": -1, + "description": "A destination window index; omit for tmux's choice. Defaults to -1.", + "type": "integer" + }, + "session_id": { + "description": "The destination session ID, such as $1.", + "type": "string" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "session_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "resize_window", + "name": "move_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "window_id", + "session_id", + "index" + ], + "type": "object" + }, "processReach": "none", + "title": "Move a window", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "respawn_pane", - "wireName": "respawn_pane", + "name": "paste_text", + "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 606 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 218 }, - "description": "Start a pane's configured process; accepts no command payload. Only restarts a pane whose command has ALREADY EXITED. killExistingProcess overrides that and kills what is running first — an editor holding unsaved changes, a build part way through. It reruns the command the pane was created with rather than running something new.", + "description": "Pastes one literal text block into one target pane through an ephemeral buffer; paste-buffer input does not fan out to synchronized peers. The target cannot be caller or attended. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "killExistingProcess": { + "enter": { "default": false, - "description": "Kill the existing pane process first.", + "description": "Append a newline that submits the text. Defaults to false.", "type": "boolean" }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" }, - "startDirectory": { - "default": null, - "description": "The literal starting directory. Omit for the directory the pane started in before.", - "type": [ - "string", - "null" - ] + "text": { + "description": "The literal text to paste.", + "type": "string" } }, + "required": [ + "pane_id", + "text" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" + "characters": { + "type": "integer" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "lines": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "pane_id": { + "type": "string" } }, "required": [ - "changed" + "pane_id", + "characters", + "lines" ], "type": "object" }, @@ -47926,157 +50058,133 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Respawn pane" + "title": "Paste text" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "startDirectory": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Pastes one literal text block into one target pane through an ephemeral buffer; paste-buffer input does not fan out to synchronized peers. The target cannot be caller or attended. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "default": false, + "description": "Append a newline that submits the text. Defaults to false.", + "type": "boolean" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "text": { + "description": "The literal text to paste.", + "type": "string" + } + }, + "required": [ + "pane_id", + "text" + ], + "type": "object" }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "respawn_pane", + "name": "paste_text", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "configured-process", + "outputSchema": { + "additionalProperties": false, + "properties": { + "characters": { + "type": "integer" + }, + "lines": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "characters", + "lines" + ], + "type": "object" + }, + "processReach": "pane-input", + "title": "Paste text", "tmuxEffects": [ - "change", - "delete", - "observe" + "observe", + "change" ], "toolset": "execute" } } }, { - "name": "run_shell_command", - "wireName": "run_shell_command", + "name": "rename_session", + "wireName": "rename_session", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 607 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 31 }, - "description": "Run a shell command in a pane with your user's permissions. Run a shell command in one pane, wait for it to finish, and report its singular real exit status and output. This is the tool for 'run X and tell me if it worked'. It reaches only the pane you name: the command travels through a tmux buffer, which synchronize-panes does not fan out, so the exit status is one pane's. Use send_keys when you want a synchronized cohort to receive input. Do NOT send keys and then poll a capture in a loop — this waits deterministically and costs one call. The command runs in a subshell, so cd and export do not persist. It refuses the named pane in a human-owned mode. Check linesMissed and anchorLost. A timed-out command MAY STILL BE RUNNING; inspect it and do not retry it — unless started is false, which means it never ran because something other than an idle shell was reading that pane's input.", + "description": "Replaces a session's name. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "command": { - "description": "The shell command.", + "new_name": { + "description": "The literal new session name.", "type": "string" }, - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "suppressHistory": { - "default": false, - "description": "Keep the command out of shell history on a best-effort basis.", - "type": "boolean" - }, - "timeoutSeconds": { - "default": null, - "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", - "type": [ - "number", - "null" - ] + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" } }, "required": [ - "command" + "session_id", + "new_name" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "anchorLost": { - "default": false, - "type": "boolean" - }, - "effectiveTimeoutSeconds": { - "type": "number" - }, - "elapsedSeconds": { - "type": "number" - }, - "exitStatus": { - "type": [ - "integer", - "null" - ] - }, - "linesMissed": { - "default": false, - "type": "boolean" - }, - "output": { - "properties": { - "droppedBytes": { - "type": "integer" - }, - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "lines", - "truncated", - "droppedLines", - "droppedBytes" - ], - "type": "object" - }, - "paneExited": { - "default": false, + "attached": { "type": "boolean" }, - "paneId": { + "id": { "type": "string" }, - "started": { - "default": true, - "type": "boolean" + "name": { + "type": "string" }, - "timedOut": { - "type": "boolean" + "windows": { + "type": "integer" } }, "required": [ - "paneId", - "exitStatus", - "timedOut", - "output", - "elapsedSeconds", - "effectiveTimeoutSeconds" + "id", + "name", + "attached", + "windows" ], "type": "object" }, @@ -48085,137 +50193,143 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Run shell command" + "title": "Rename a session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Replaces a session's name. Change tmux state; no client-supplied executable input.", + "inputLiteralization": { + "new_name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "new_name": { + "description": "The literal new session name.", + "type": "string" + }, + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id", + "new_name" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "run_shell_command", + "name": "rename_session", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "processReach": "pane-command", + "outputSchema": { + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "windows": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "attached", + "windows" + ], + "type": "object" + }, + "processReach": "none", + "title": "Rename a session", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "search_panes", - "wireName": "search_panes", + "name": "rename_window", + "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 579 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 44 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing text matching a regular expression. This is the tool for 'which pane has the error', 'where is the build running', or any question about what a pane CONTAINS — the list tools only see names and sizes.", + "description": "Replaces a window's name. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "ignoreCase": { - "default": true, - "description": "Ignore case.", - "type": "boolean" + "new_name": { + "description": "The literal new window name.", + "type": "string" }, - "includeHistory": { - "default": false, - "description": "Search scrollback too.", + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "new_name" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { "type": "boolean" }, - "maxMatchesPerPane": { - "default": 20, - "description": "Maximum matches per pane.", - "maximum": 2147483647, - "minimum": -2147483648, + "id": { + "type": "string" + }, + "index": { "type": "integer" }, - "pattern": { - "description": "A linear-time regular expression, at most 999 UTF-8 bytes. .NET syntax without lookarounds, backreferences or atomic groups.", + "name": { "type": "string" }, - "session": { - "default": null, - "description": "A session id or name. Omit for every session.", - "type": [ - "string", - "null" - ] + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" } }, "required": [ - "pattern" - ], - "type": "object" - }, - "outputSchema": { - "properties": { - "panes": { - "items": { - "properties": { - "matches": { - "items": { - "properties": { - "row": { - "type": "integer" - }, - "text": { - "type": "string" - } - }, - "required": [ - "row", - "text" - ], - "type": "object" - }, - "type": "array" - }, - "paneId": { - "type": "string" - }, - "sessionId": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "paneId", - "windowId", - "sessionId", - "matches" - ], - "type": "object" - }, - "type": "array" - }, - "panesSearched": { - "type": "integer" - }, - "pattern": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "pattern", - "panesSearched", - "panes", - "truncated" + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" ], "type": "object" }, @@ -48224,91 +50338,147 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Search panes" + "title": "Rename a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Replaces a window's name. Change tmux state; no client-supplied executable input.", + "inputLiteralization": { + "new_name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "new_name": { + "description": "The literal new window name.", + "type": "string" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "new_name" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "search_panes", + "name": "rename_window", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Rename a window", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "select_layout", - "wireName": "select_layout", + "name": "resize_pane", + "wireName": "resize_pane", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 592 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 106 }, - "description": "Change tmux state; no client-supplied executable input. Arrange a window's panes with a named layout — even-horizontal, even-vertical, main-horizontal, main-vertical, tiled — or a layout string read from list_windows.", + "description": "Sets a pane's width, height or both. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "layout": { - "default": null, - "description": "A supported layout name or layout string. Omit to reapply the window's last preset layout, if it has had one.", - "type": [ - "string", - "null" - ] + "height": { + "default": 0, + "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" }, - "windowId": { - "default": null, - "description": "A window id. Omit for this server's own window, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "width": { + "default": 0, + "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" } }, + "required": [ + "pane_id" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "kind": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "what": { + "type": "string" } }, "required": [ - "changed" + "kind", + "id", + "what" ], "type": "object" }, @@ -48317,82 +50487,150 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select layout" + "title": "Resize a pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Sets a pane's width, height or both. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "default": 0, + "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "width": { + "default": 0, + "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "select_layout", + "name": "resize_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "note": { + "type": "string" + }, + "what": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "what" + ], + "type": "object" + }, "processReach": "none", + "title": "Resize a pane", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "select_pane", - "wireName": "select_pane", + "name": "resize_window", + "wireName": "resize_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 591 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 91 }, - "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. This changes what a watching human sees; targeting a pane by id does not require selecting it first.", + "description": "Sets a window's width, height or both. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "A pane id.", + "height": { + "default": 0, + "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + }, + "width": { + "default": 0, + "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + }, + "window_id": { + "description": "The window ID, such as @1.", "type": "string" } }, "required": [ - "paneId" + "window_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "active": { + "type": "boolean" + }, + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "index": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "name": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" } }, "required": [ - "changed" + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" ], "type": "object" }, @@ -48401,82 +50639,137 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select pane" + "title": "Resize a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Sets a window's width, height or both. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "select_pane", + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "default": 0, + "description": "Height in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + }, + "width": { + "default": 0, + "description": "Width in terminal cells; omit to retain it. Defaults to 0.", + "type": "integer" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "resize_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Resize a window", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "select_window", - "wireName": "select_window", + "name": "respawn_pane", + "wireName": "respawn_pane", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 590 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 118 }, - "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", + "description": "Kills the pane's current process and starts its configured process again. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "windowId": { - "description": "A window id.", + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "start_directory": { + "description": "An absolute literal start directory.", "type": "string" } }, "required": [ - "windowId" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "pane_id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "restarted": { + "type": "boolean" } }, "required": [ - "changed" + "pane_id", + "restarted" ], "type": "object" }, @@ -48485,95 +50778,163 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select window" + "title": "Respawn a pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Kills the pane's current process and starts its configured process again. Start a pane's configured process; accepts no command payload.", + "inputLiteralization": { + "start_directory": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "select_window", + "name": "respawn_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "change", - "observe" - ], - "toolset": "manage" - } - } - }, - { - "name": "send_keys", - "wireName": "send_keys", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 608 + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane_id": { + "type": "string" + }, + "restarted": { + "type": "boolean" + } + }, + "required": [ + "pane_id", + "restarted" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Respawn a pane", + "tmuxEffects": [ + "observe", + "change", + "delete" + ], + "toolset": "execute" + } + } + }, + { + "name": "run_shell_command", + "wireName": "run_shell_command", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 142 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send raw keystrokes to a pane and return immediately. Use for driving an interactive program — a key in vim, a menu choice, Ctrl-C. Set literal=false to send named keys such as C-c, Escape or F5. It refuses the named pane in a human-owned mode and, when source input expands, every synchronized input cohort peer. To run a shell command and learn whether it worked, use run_shell_command instead; this reports nothing about what happens next. Tracks what it sends — including edits such as backspace, Ctrl-U or Ctrl-C — so wait_for_text can tell this pane's echo apart from real output for a short time afterward.", + "description": "Runs one authored command in a trusted pane shell and waits for singular framed output and completion. Its two preflights refuse caller or attended panes and an effective cohort larger than one. Pre-existing exact-client-path, trap, eval, or exit functions are outside the supported boundary; marker display-message commands honor the trusted server's command aliases and hooks. Run a shell command in a pane with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enter": { - "default": false, - "description": "Press Enter after the keys.", - "type": "boolean" + "command": { + "description": "The shell command, run in the pane's interactive shell.", + "type": "string" }, - "keys": { - "description": "Text or a tmux key name.", + "max_lines": { + "default": 200, + "description": "Maximum output lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" }, - "literal": { + "suppress_history": { "default": true, - "description": "Treat keys as literal text.", + "description": "Best-effort persistent history suppression. Defaults to true.", "type": "boolean" }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "suppressHistory": { - "default": false, - "description": "Keep text out of shell history on a best-effort basis.", - "type": "boolean" + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" } }, "required": [ - "keys" + "pane_id", + "command" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "effective_timeout": { + "type": "number" + }, + "exit_status": { + "type": "integer" + }, + "framed": { + "type": "boolean" + }, + "lines_dropped": { + "type": "integer" + }, + "note": { "type": "string" }, - "paneId": { + "outcome": { "type": "string" }, - "targetPaneIds": { + "output": { "items": { "type": "string" }, "type": "array" + }, + "pane_id": { + "type": "string" + }, + "seconds": { + "type": "number" + }, + "truncated": { + "type": "boolean" } }, "required": [ - "changed", - "paneId", - "targetPaneIds" + "pane_id", + "outcome", + "output", + "truncated", + "lines_dropped", + "framed", + "seconds", + "effective_timeout" ], "type": "object" }, @@ -48582,167 +50943,220 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send keys" + "title": "Run a shell command" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Runs one authored command in a trusted pane shell and waits for singular framed output and completion. Its two preflights refuse caller or attended panes and an effective cohort larger than one. Pre-existing exact-client-path, trap, eval, or exit functions are outside the supported boundary; marker display-message commands honor the trusted server's command aliases and hooks. Run a shell command in a pane with your user's permissions.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "send_keys", + "inputSchema": { + "additionalProperties": false, + "properties": { + "command": { + "description": "The shell command, run in the pane's interactive shell.", + "type": "string" + }, + "max_lines": { + "default": 200, + "description": "Maximum output lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "suppress_history": { + "default": true, + "description": "Best-effort persistent history suppression. Defaults to true.", + "type": "boolean" + }, + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" + } + }, + "required": [ + "pane_id", + "command" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "run_shell_command", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "processReach": "pane-input", + "outputSchema": { + "additionalProperties": false, + "properties": { + "effective_timeout": { + "type": "number" + }, + "exit_status": { + "type": "integer" + }, + "framed": { + "type": "boolean" + }, + "lines_dropped": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "outcome": { + "type": "string" + }, + "output": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane_id": { + "type": "string" + }, + "seconds": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane_id", + "outcome", + "output", + "truncated", + "lines_dropped", + "framed", + "seconds", + "effective_timeout" + ], + "type": "object" + }, + "processReach": "pane-command", + "title": "Run a shell command", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "execute" } } }, { - "name": "send_keys_batch", - "wireName": "send_keys_batch", + "name": "search_panes", + "wireName": "search_panes", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 609 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 201 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send several keystrokes to one pane in order, in a single call. Use for a short interactive sequence — open a file, move, type, save — instead of one call per key. Each operation refuses the named pane in a human-owned mode and, when source input expands, every synchronized input cohort peer. A batch has at most 64 steps and 64 KiB of UTF-8 text. Each delay is 0-2000 ms and all delays together must fit the server wait ceiling.", + "description": "Searches the visible output of every pane. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "default": "stop", - "description": "Stop after the first failed operation, or continue serially.", - "enum": [ - "continue", - "stop" - ], + "max_lines": { + "default": 200, + "description": "Maximum matches across all panes. Defaults to 200.", + "type": "integer" + }, + "max_matches_per_pane": { + "default": 5, + "description": "Maximum matching lines per pane. Defaults to 5.", + "type": "integer" + }, + "pattern": { + "description": "The bounded text or regular expression to search for.", + "maxLength": 4096, "type": "string" }, - "operations": { - "description": "Between 1 and 64 bounded pane-input operations, executed serially.", - "items": { - "additionalProperties": false, - "properties": { - "delayMilliseconds": { - "default": null, - "maximum": 2000, - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "enter": { - "default": false, - "type": "boolean" - }, - "keys": { - "type": "string" - }, - "literal": { - "default": true, - "type": "boolean" - }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] - }, - "suppressHistory": { - "default": false, - "type": "boolean" - } - }, - "required": [ - "keys" - ], - "type": "object" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" + "regex": { + "default": false, + "description": "Treat pattern as a regular expression. Defaults to false.", + "type": "boolean" } }, "required": [ - "operations" + "pattern" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "failed": { + "bytes_searched": { "type": "integer" }, - "onError": { - "type": "string" + "count": { + "type": "integer" }, - "results": { + "lines_searched": { + "type": "integer" + }, + "matches": { "items": { + "additionalProperties": false, "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "index": { - "type": "integer" + "line": { + "type": "string" }, - "paneId": { - "type": [ - "string", - "null" - ] + "pane_id": { + "type": "string" }, - "success": { - "type": "boolean" + "session": { + "type": "string" }, - "targetPaneIds": { - "items": { - "type": "string" - }, - "type": "array" + "window": { + "type": "string" } }, "required": [ - "index", - "paneId", - "success", - "error", - "targetPaneIds" + "pane_id", + "session", + "window", + "line" ], "type": "object" }, "type": "array" }, - "stoppedAt": { - "type": [ - "integer", - "null" - ] + "note": { + "type": "string" }, - "succeeded": { + "panes_searched": { "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "work_seconds": { + "type": "number" } }, "required": [ - "results", - "succeeded", - "failed", - "stoppedAt", - "onError" + "count", + "panes_searched", + "lines_searched", + "bytes_searched", + "work_seconds", + "truncated", + "matches" ], "type": "object" }, @@ -48751,89 +51165,178 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send keys batch" + "title": "Search panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Searches the visible output of every pane. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "send_keys_batch", + "inputSchema": { + "additionalProperties": false, + "properties": { + "max_lines": { + "default": 200, + "description": "Maximum matches across all panes. Defaults to 200.", + "type": "integer" + }, + "max_matches_per_pane": { + "default": 5, + "description": "Maximum matching lines per pane. Defaults to 5.", + "type": "integer" + }, + "pattern": { + "description": "The bounded text or regular expression to search for.", + "maxLength": 4096, + "type": "string" + }, + "regex": { + "default": false, + "description": "Treat pattern as a regular expression. Defaults to false.", + "type": "boolean" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "search_panes", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "processReach": "pane-input", + "outputSchema": { + "additionalProperties": false, + "properties": { + "bytes_searched": { + "type": "integer" + }, + "count": { + "type": "integer" + }, + "lines_searched": { + "type": "integer" + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "string" + }, + "pane_id": { + "type": "string" + }, + "session": { + "type": "string" + }, + "window": { + "type": "string" + } + }, + "required": [ + "pane_id", + "session", + "window", + "line" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + }, + "panes_searched": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "work_seconds": { + "type": "number" + } + }, + "required": [ + "count", + "panes_searched", + "lines_searched", + "bytes_searched", + "work_seconds", + "truncated", + "matches" + ], + "type": "object" + }, + "processReach": "none", + "title": "Search panes", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "set_history_limit", - "wireName": "set_history_limit", + "name": "select_layout", + "wireName": "select_layout", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 601 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 75 }, - "description": "Change tmux state; no client-supplied executable input. Set how many scrollback lines tmux keeps. This is a SESSION option, so it covers every window in the session rather than one pane, and the session must be named because the call can destroy data. Raise it before starting something that prints a lot: no capture can return lines tmux has already discarded. LOWERING it discards the excess from every pane immediately, and the result says how many lines went; raising the limit again does not bring them back.", + "description": "Applies a named tmux layout, a unique abbreviation or a checksummed saved layout. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Malformed syntax is refused before window lookup; tmux validates geometry. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "lines": { - "description": "The scrollback line limit.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": "integer" + "layout": { + "description": "A built-in name, unique abbreviation or saved tmux layout. Existing enum-style names are also accepted.", + "type": "string" }, - "session": { - "description": "A session id such as $0, or its name.", + "window_id": { + "description": "The window ID, such as @1.", "type": "string" } }, "required": [ - "lines", - "session" + "window_id", + "layout" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "kind": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "what": { + "type": "string" } }, "required": [ - "changed" + "kind", + "id", + "what" ], "type": "object" }, @@ -48842,21 +51345,71 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set history limit" + "title": "Select a layout" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Applies a named tmux layout, a unique abbreviation or a checksummed saved layout. Names follow the running daemon's version; mirrored main layouts require tmux 3.5. Malformed syntax is refused before window lookup; tmux validates geometry. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "description": "A built-in name, unique abbreviation or saved tmux layout. Existing enum-style names are also accepted.", + "type": "string" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id", + "layout" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, - "name": "set_history_limit", + "name": "select_layout", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "note": { + "type": "string" + }, + "what": { + "type": "string" + } + }, + "required": [ + "kind", + "id", + "what" + ], + "type": "object" + }, "processReach": "none", + "title": "Select a layout", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -48864,59 +51417,71 @@ } }, { - "name": "set_mouse_enabled", - "wireName": "set_mouse_enabled", + "name": "select_pane", + "wireName": "select_pane", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 600 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 66 }, - "description": "Change tmux state; no client-supplied executable input. Turn tmux mouse support on or off. This sets the global option, so it applies to every session on this server and changes what a human watching can do with their mouse.", + "description": "Makes one pane active. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "description": "Whether mouse support is enabled globally.", - "type": "boolean" + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" } }, "required": [ - "enabled" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "active": { + "type": "boolean" + }, + "command": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "id": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "index": { + "type": "integer" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" } }, "required": [ - "changed" + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" ], "type": "object" }, @@ -48925,21 +51490,87 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set mouse enabled" + "title": "Select a pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Makes one pane active. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "set_mouse_enabled", + "inputSchema": { + "additionalProperties": false, + "properties": { + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "select_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Select a pane", "tmuxEffects": [ + "observe", "change" ], "toolset": "manage" @@ -48947,67 +51578,63 @@ } }, { - "name": "set_pane_title", - "wireName": "set_pane_title", + "name": "select_window", + "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 597 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 57 }, - "description": "Change tmux state; no client-supplied executable input. Set a pane's title. Useful for labelling panes you created so a human watching can tell which is which.", + "description": "Makes one window active. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "title": { - "description": "The literal pane title.", + "window_id": { + "description": "The window ID, such as @1.", "type": "string" } }, "required": [ - "title" + "window_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "active": { + "type": "boolean" + }, + "id": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "index": { + "type": "integer" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "name": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" } }, "required": [ - "changed" + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" ], "type": "object" }, @@ -49016,92 +51643,157 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set pane title" + "title": "Select a window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "title": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "set_pane_title", + "description": "Makes one window active. Change tmux state; no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "select_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "panes": { + "type": "integer" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "name", + "session_id", + "active", + "panes", + "size" + ], + "type": "object" + }, "processReach": "none", + "title": "Select a window", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "set_synchronize_panes", - "wireName": "set_synchronize_panes", + "name": "send_keys", + "wireName": "send_keys", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 611 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 176 }, - "description": "Change tmux state; no client-supplied executable input. Turn synchronize-panes on or off for a window. Input typed into one of its panes then reaches the synchronized input cohort: every pane whose effective synchronize-panes setting is on. A pane without a setting of its own follows the window; one with its own setting stays included or excluded either way.", + "description": "Sends input to the target's configured effective synchronized cohort without waiting for output. Every configured member must be live, nonmodal, and neither caller nor attended. Reports configured pane ids observed before dispatch, not delivery receipts. wait_for_text discounts recognized input; wait for the prompt before typing into a cold shell. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "description": "Whether to set this window's inherited synchronize-panes default. Pane overrides can still include or exclude individual panes.", + "enter": { + "default": false, + "description": "Press Enter afterward, as a real keypress. Unlike a key named \"Enter\" sent under literal:true, which types the four letters, this always submits. Defaults to false.", "type": "boolean" }, - "windowId": { - "default": null, - "description": "A window id. Omit for this server's own window, or else the one the first session shows.", + "keys": { + "description": "The key names or literal strings to send. One value may be sent on its own, without a list.", + "items": { + "type": "string" + }, "type": [ - "string", - "null" + "array", + "string" ] + }, + "literal": { + "default": false, + "description": "Send strings literally instead of as key names. Defaults to false.", + "type": "boolean" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" } }, "required": [ - "enabled" + "pane_id" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" + "keys": { + "type": "integer" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "literal": { + "type": "boolean" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "note": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "pane_id": { + "type": "string" + }, + "resolved_pane_ids": { + "items": { + "type": "string" + }, + "type": "array" } }, "required": [ - "changed" + "pane_id", + "keys", + "literal", + "resolved_pane_ids" ], "type": "object" }, @@ -49110,91 +51802,172 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set synchronize panes" + "title": "Send keys" }, "meta": { "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": true, + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Sends input to the target's configured effective synchronized cohort without waiting for output. Every configured member must be live, nonmodal, and neither caller nor attended. Reports configured pane ids observed before dispatch, not delivery receipts. wait_for_text discounts recognized input; wait for the prompt before typing into a cold shell. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "set_synchronize_panes", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "default": false, + "description": "Press Enter afterward, as a real keypress. Unlike a key named \"Enter\" sent under literal:true, which types the four letters, this always submits. Defaults to false.", + "type": "boolean" + }, + "keys": { + "description": "The key names or literal strings to send. One value may be sent on its own, without a list.", + "items": { + "type": "string" + }, + "type": [ + "array", + "string" + ] + }, + "literal": { + "default": false, + "description": "Send strings literally instead of as key names. Defaults to false.", + "type": "boolean" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "send_keys", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "keys": { + "type": "integer" + }, + "literal": { + "type": "boolean" + }, + "note": { + "type": "string" + }, + "pane_id": { + "type": "string" + }, + "resolved_pane_ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "pane_id", + "keys", + "literal", + "resolved_pane_ids" + ], + "type": "object" + }, + "processReach": "pane-input", + "title": "Send keys", + "tmuxEffects": [ + "observe", + "change" + ], "toolset": "execute" } } }, { - "name": "show_environment", - "wireName": "show_environment", + "name": "send_keys_batch", + "wireName": "send_keys_batch", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 584 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 197 }, - "description": "Read the tmux environment; accepts no client-supplied executable input. A listing answers names without values, and a named variable is still withheld when the name reads as a credential. Read what a NEW pane will inherit, at the server or session level — not what an already-running shell has.", + "description": "Sends up to sixty-four ordered pane-input operations, resolving and guarding the configured effective cohort separately for each ordered operation. A later policy or dispatch failure retains observed membership. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "default": null, - "description": "One variable name, which answers its value. Omit for every name with hasValue instead of values.", - "type": [ - "string", - "null" - ] + "onError": { + "description": "stop or continue; defaults to stop.", + "type": "string" }, - "session": { - "default": null, - "description": "A session id or name. Omit for the server environment.", - "type": [ - "string", - "null" - ] + "operations": { + "description": "Objects with pane_id, keys and optional literal and enter fields.", + "items": { + "type": "object" + }, + "maxItems": 64, + "type": "array" } }, + "required": [ + "operations" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "result": { + "completed": { + "type": "integer" + }, + "results": { "items": { + "additionalProperties": false, "properties": { - "hasValue": { - "type": "boolean" + "error": { + "type": "string" }, - "isRemoved": { - "type": "boolean" + "error_code": { + "type": "string" }, - "name": { + "index": { + "type": "integer" + }, + "pane_id": { "type": "string" }, - "value": { - "type": [ - "string", - "null" - ] + "resolved_pane_ids": { + "items": { + "type": "string" + }, + "type": "array" }, - "withheld": { + "retryable": { + "type": "boolean" + }, + "success": { "type": "boolean" } }, "required": [ - "name", - "value", - "isRemoved", - "hasValue", - "withheld" + "index", + "pane_id", + "resolved_pane_ids", + "success" ], "type": "object" }, @@ -49202,7 +51975,8 @@ } }, "required": [ - "result" + "results", + "completed" ], "type": "object" }, @@ -49211,101 +51985,152 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show environment" + "title": "Send keys in a batch" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Sends up to sixty-four ordered pane-input operations, resolving and guarding the configured effective cohort separately for each ordered operation. A later policy or dispatch failure retains observed membership. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "onError": { + "description": "stop or continue; defaults to stop.", + "type": "string" + }, + "operations": { + "description": "Objects with pane_id, keys and optional literal and enter fields.", + "items": { + "type": "object" + }, + "maxItems": 64, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "name": "show_environment", + "mayReturnUntrustedContent": true, + "name": "send_keys_batch", "nestedAuthority": [], "outputClasses": [ - "process-environment" + "tmux-metadata" ], - "processReach": "none", + "outputSchema": { + "additionalProperties": false, + "properties": { + "completed": { + "type": "integer" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + }, + "error_code": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "pane_id": { + "type": "string" + }, + "resolved_pane_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "retryable": { + "type": "boolean" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "index", + "pane_id", + "resolved_pane_ids", + "success" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "results", + "completed" + ], + "type": "object" + }, + "processReach": "pane-input", + "title": "Send keys in a batch", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "show_hooks", - "wireName": "show_hooks", + "name": "set_history_limit", + "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 585 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 198 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks tmux will run on its own events. Read-only on purpose: a hook written here would outlive this conversation and keep firing with nobody left who knows why. Put hooks you want to keep in your tmux config file.", + "description": "Sets a bounded integer scrollback limit for future panes in a session. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "default": null, - "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] + "lines": { + "description": "The nonnegative retained line count.", + "type": "integer" }, - "scope": { - "default": "Session", - "description": "Server, Session, Window, or Pane.", - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], + "session_id": { + "description": "The session ID, such as $1.", "type": "string" } }, + "required": [ + "session_id", + "lines" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "result": { - "items": { - "properties": { - "command": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "scope": { - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], - "type": "string" - } - }, - "required": [ - "name", - "index", - "command", - "scope" - ], - "type": "object" - }, - "type": "array" + "lines": { + "type": "integer" + }, + "session_id": { + "type": "string" } }, "required": [ - "result" + "session_id", + "lines" ], "type": "object" }, @@ -49314,111 +52139,102 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show hooks" + "title": "Set history limit" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Sets a bounded integer scrollback limit for future panes in a session. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "lines": { + "description": "The nonnegative retained line count.", + "type": "integer" + }, + "session_id": { + "description": "The session ID, such as $1.", + "type": "string" + } + }, + "required": [ + "session_id", + "lines" + ], + "type": "object" + }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "show_hooks", + "mayReturnUntrustedContent": false, + "name": "set_history_limit", "nestedAuthority": [], "outputClasses": [ - "configured-command" + "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "lines": { + "type": "integer" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "session_id", + "lines" + ], + "type": "object" + }, "processReach": "none", + "title": "Set history limit", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "show_option", - "wireName": "show_option", + "name": "set_mouse_enabled", + "wireName": "set_mouse_enabled", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 583 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 189 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read tmux options at the server, session, window or pane level. Values set at a wider scope are included and marked inherited, because that is where nearly all tmux configuration lives. Omit the name to list them all. Reading history-limit before a long tail tells you how much output the pane can hold before it starts dropping lines.", + "description": "Enables or disables tmux mouse handling. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "The option name.", - "type": "string" - }, - "paneId": { - "default": null, - "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "scope": { - "default": "Pane", - "description": "Server, Session, Window, or Pane.", - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], - "type": "string" + "enabled": { + "default": false, + "description": "Whether mouse handling is enabled. Defaults to false.", + "type": "boolean" } }, - "required": [ - "name" - ], + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "result": { - "items": { - "properties": { - "inherited": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "scope": { - "enum": [ - "Server", - "Session", - "Window", - "Pane" - ], - "type": "string" - }, - "value": { - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name", - "value", - "scope", - "inherited" - ], - "type": "object" - }, - "type": "array" + "enabled": { + "type": "boolean" } }, "required": [ - "result" + "enabled" ], "type": "object" }, @@ -49427,82 +52243,130 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show option" + "title": "Set mouse handling" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Enables or disables tmux mouse handling. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "default": false, + "description": "Whether mouse handling is enabled. Defaults to false.", + "type": "boolean" + } + }, + "required": [], + "type": "object" + }, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "name": "show_option", + "mayReturnUntrustedContent": false, + "name": "set_mouse_enabled", "nestedAuthority": [], "outputClasses": [ - "configured-command", "tmux-metadata" ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" + "outputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "processReach": "none", + "title": "Set mouse handling", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" } } }, { - "name": "signal_channel", - "wireName": "signal_channel", + "name": "set_pane_title", + "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 599 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 148 }, - "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel, releasing whatever waits on it. The channel latches: signalling before anyone waits still satisfies the next wait, so a handoff cannot be lost to a race.", + "description": "Replaces a pane's literal title. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "channel": { - "description": "The tmux wait-for channel.", + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "title": { + "description": "The literal title.", "type": "string" } }, "required": [ - "channel" + "pane_id", + "title" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "active": { + "type": "boolean" + }, + "command": { "type": "string" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "id": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "index": { + "type": "integer" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" } }, "required": [ - "changed" + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" ], "type": "object" }, @@ -49511,206 +52375,143 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Signal channel" + "title": "Set pane title" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "signal_channel", - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "snapshot_pane", - "wireName": "snapshot_pane", - "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 578 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read a pane's visible content together with its cursor position, size and running command, in one call. Prefer this over capture_pane plus list_panes: it is one round trip and the cursor is guaranteed to describe the text returned with it.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "maxLines": { - "default": null, - "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" - }, - "outputSchema": { - "properties": { - "alternateScreen": { - "type": "boolean" + "description": "Replaces a pane's literal title. Change tmux state; no client-supplied executable input.", + "inputLiteralization": { + "title": "double-hash-once" }, - "content": { + "inputSchema": { + "additionalProperties": false, "properties": { - "droppedBytes": { - "type": "integer" - }, - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" }, - "truncated": { - "type": "boolean" + "title": { + "description": "The literal title.", + "type": "string" } }, "required": [ - "lines", - "truncated", - "droppedLines", - "droppedBytes" + "pane_id", + "title" ], "type": "object" }, - "cursorX": { - "type": [ - "integer", - "null" - ] - }, - "cursorY": { - "type": [ - "integer", - "null" - ] - }, - "pane": { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "set_pane_title", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { "active": { "type": "boolean" }, - "currentCommand": { - "type": [ - "string", - "null" - ] - }, - "currentPath": { - "type": [ - "string", - "null" - ] - }, - "dead": { - "type": "boolean" - }, - "height": { - "type": "integer" - }, - "historyLimit": { - "type": [ - "integer", - "null" - ] + "command": { + "type": "string" }, - "historySize": { - "type": [ - "integer", - "null" - ] + "id": { + "type": "string" }, "index": { "type": "integer" }, - "inMode": { - "type": "boolean" - }, - "isCaller": { - "type": "boolean" - }, - "paneId": { + "path": { "type": "string" }, - "pid": { - "type": [ - "integer", - "null" - ] + "session_id": { + "type": "string" }, - "sessionId": { + "size": { "type": "string" }, "title": { - "type": [ - "string", - "null" - ] - }, - "width": { - "type": "integer" - }, - "windowId": { "type": "string" }, - "zoomed": { - "type": "boolean" + "window_id": { + "type": "string" } }, "required": [ - "paneId", - "windowId", - "sessionId", + "id", "index", - "width", - "height", - "title", + "window_id", + "session_id", "active", - "dead", - "zoomed", - "inMode", - "currentCommand", - "currentPath", - "pid", - "historySize", - "historyLimit", - "isCaller" + "command", + "path", + "title", + "size" ], "type": "object" + }, + "processReach": "none", + "title": "Set pane title", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_synchronize_panes", + "wireName": "set_synchronize_panes", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 239 + }, + "description": "When enabled, sets the inherited window default; pane-level overrides determine each pane's effective synchronized value. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "default": false, + "description": "Whether pane input is synchronized. Defaults to false.", + "type": "boolean" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" } }, "required": [ - "pane", - "content", - "cursorX", - "cursorY", - "alternateScreen" + "window_id" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "window_id", + "enabled" ], "type": "object" }, @@ -49719,113 +52520,123 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Snapshot pane" + "title": "Set synchronized panes" }, "meta": { - "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, + "amplifiesFutureInput": true, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "When enabled, sets the inherited window default; pane-level overrides determine each pane's effective synchronized value. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "snapshot_pane", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "default": false, + "description": "Whether pane input is synchronized. Defaults to false.", + "type": "boolean" + }, + "window_id": { + "description": "The window ID, such as @1.", + "type": "string" + } + }, + "required": [ + "window_id" + ], + "type": "object" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "set_synchronize_panes", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "window_id", + "enabled" + ], + "type": "object" + }, "processReach": "none", + "title": "Set synchronized panes", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "split_window", - "wireName": "split_window", + "name": "show_environment", + "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 605 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 328 }, - "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the NEW pane's id. Use that id for what you put in it — pane ids stay valid across layout changes, where window names and indexes do not.", + "description": "Reads the environment tmux passes to processes. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "direction": { - "default": "Below", - "description": "Below, Above, Left, or Right.", - "enum": [ - "Above", - "Below", - "Left", - "Right" - ], + "session_id": { + "description": "A session, such as $1; omit both for the global environment.", "type": "string" }, - "paneId": { - "default": null, - "description": "The pane to split. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "percentage": { - "default": null, - "description": "Percentage of the space for the new pane. Omit for half.", - "maximum": 2147483647, - "minimum": -2147483648, - "type": [ - "integer", - "null" - ] - }, - "startDirectory": { - "default": null, - "description": "The literal starting directory. Omit for the MCP server's own working directory.", - "type": [ - "string", - "null" - ] + "session_name": { + "description": "A session's exact name, in place of session_id.", + "type": "string" } }, + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" + "count": { + "type": "integer" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "session": { + "type": "string" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "unset": { + "items": { + "type": "string" + }, + "type": "array" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "variables": { + "additionalProperties": { + "type": "string" + }, + "type": "object" } }, "required": [ - "changed" + "session", + "count", + "variables", + "unset" ], "type": "object" }, @@ -49834,99 +52645,132 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Split window" + "title": "Show tmux environment" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "split_window", + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Reads the environment tmux passes to processes. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session_id": { + "description": "A session, such as $1; omit both for the global environment.", + "type": "string" + }, + "session_name": { + "description": "A session's exact name, in place of session_id.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_environment", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "process-environment" ], - "processReach": "configured-process", + "outputSchema": { + "additionalProperties": false, + "properties": { + "count": { + "type": "integer" + }, + "session": { + "type": "string" + }, + "unset": { + "items": { + "type": "string" + }, + "type": "array" + }, + "variables": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "session", + "count", + "variables", + "unset" + ], + "type": "object" + }, + "processReach": "none", + "title": "Show tmux environment", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "swap_pane", - "wireName": "swap_pane", + "name": "show_hooks", + "wireName": "show_hooks", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 596 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 352 }, - "description": "Change tmux state; no client-supplied executable input. Swap two panes' positions; each keeps its program, its content and its ID.", + "description": "Reads configured tmux hooks. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "detach": { - "default": false, - "description": "Leave the swapped pane unselected.", - "type": "boolean" - }, - "keepZoom": { - "default": false, - "description": "Keep zoom state.", - "type": "boolean" + "name": { + "description": "One hook name; omit to read all hooks in the scope.", + "type": "string" }, - "paneId": { - "description": "The pane id to swap.", + "scope": { + "description": "global, server, session, window or pane.", "type": "string" }, - "targetPaneId": { - "description": "The other pane id.", + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", "type": "string" } }, - "required": [ - "paneId", - "targetPaneId" - ], + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { - "type": "string" + "count": { + "type": "integer" }, - "paneId": { - "default": null, - "type": [ - "string", - "null" - ] + "hooks": { + "type": "object" }, - "sessionId": { - "default": null, - "type": [ - "string", - "null" - ] + "scope": { + "type": "string" }, - "windowId": { - "default": null, - "type": [ - "string", - "null" - ] + "target": { + "type": "string" } }, "required": [ - "changed" + "scope", + "target", + "count", + "hooks" ], "type": "object" }, @@ -49935,85 +52779,137 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Swap pane" + "title": "Show hooks" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Reads configured tmux hooks. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "swap_pane", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "One hook name; omit to read all hooks in the scope.", + "type": "string" + }, + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_hooks", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "configured-command" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "count": { + "type": "integer" + }, + "hooks": { + "type": "object" + }, + "scope": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "required": [ + "scope", + "target", + "count", + "hooks" + ], + "type": "object" + }, "processReach": "none", + "title": "Show hooks", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "wait_for_channel", - "wireName": "wait_for_channel", + "name": "show_option", + "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 598 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 306 }, - "description": "Change tmux state; no client-supplied executable input. Block until something signals a tmux wait-for channel with 'tmux wait-for -S '. Use when you composed a shell command that signals it. For an ordinary command whose completion you want, run_shell_command already does this and also reports the exit status.", + "description": "Reads one named tmux option. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "channel": { - "description": "The tmux wait-for channel.", + "effective": { + "default": true, + "description": "Include an inherited value. Defaults to true.", + "type": "boolean" + }, + "name": { + "description": "The exact option name.", "type": "string" }, - "timeoutSeconds": { - "default": null, - "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", - "type": [ - "number", - "null" - ] + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" } }, "required": [ - "channel" + "name" ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "changed": { + "name": { "type": "string" }, - "channel": { + "scope": { "type": "string" }, - "effectiveTimeoutSeconds": { - "type": "number" - }, - "elapsedSeconds": { - "type": "number" + "target": { + "type": "string" }, - "signalled": { - "type": "boolean" + "value": { + "type": "string" } }, "required": [ - "changed", - "channel", - "signalled", - "elapsedSeconds", - "effectiveTimeoutSeconds" + "scope", + "target", + "name", + "value" ], "type": "object" }, @@ -50022,168 +52918,124 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Wait for channel" + "title": "Show one option" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Reads one named tmux option. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "name": "wait_for_channel", + "inputSchema": { + "additionalProperties": false, + "properties": { + "effective": { + "default": true, + "description": "Include an inherited value. Defaults to true.", + "type": "boolean" + }, + "name": { + "description": "The exact option name.", + "type": "string" + }, + "scope": { + "description": "global, server, session, window or pane.", + "type": "string" + }, + "target": { + "description": "Required for session scope (an ID such as $1, or a name), window scope (@1) and pane scope (%1).", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_option", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "target": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "scope", + "target", + "name", + "value" + ], + "type": "object" + }, "processReach": "none", + "title": "Show one option", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "wait_for_text", - "wireName": "wait_for_text", + "name": "signal_channel", + "wireName": "signal_channel", "source": { - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", - "line": 581 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 180 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something matching one of these patterns, then return. Use for output you did NOT start — a server's ready line, another process's progress, a person typing. A matching pattern already on screen returns PresentAtEntry. For a command you are running yourself, run_shell_command is better: it reports the real exit status instead of guessing from text. Never poll capture_pane in a loop; this call does the waiting. Control observation is required by default; pollingFallback reports activation when the operator permits fallback. Text this server itself typed is discounted while deciding what is new, for a few seconds after it is sent or submitted, so its own echo cannot be the match — except on a pane whose program has not yet configured its terminal; wait for a first prompt before typing into a freshly created pane.", + "description": "Signals one server-wide tmux channel. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "ignoreCase": { - "default": true, - "description": "Ignore case.", - "type": "boolean" - }, - "paneId": { - "default": null, - "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", - "type": [ - "string", - "null" - ] - }, - "patterns": { - "default": null, - "description": "Linear-time regular expressions that end the wait successfully: .NET syntax without lookarounds, backreferences or atomic groups. Output arriving after this call counts unless the pattern is already present, which returns PresentAtEntry. Omit to return on any new output. Across both pattern lists: at most 32 entries and 16384 UTF-8 bytes; each entry is at most 999 UTF-8 bytes.", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "stopPatterns": { - "default": null, - "description": "Linear-time regular expressions that stop the wait, in the same subset as patterns. Omit for none. Across both pattern lists: at most 32 entries and 16384 UTF-8 bytes; each entry is at most 999 UTF-8 bytes.", - "items": { - "type": [ - "string", - "null" - ] - }, - "type": [ - "array", - "null" - ] - }, - "timeoutSeconds": { - "default": null, - "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", - "type": [ - "number", - "null" - ] + "channel": { + "description": "The channel name.", + "type": "string" } }, + "required": [ + "channel" + ], "type": "object" }, "outputSchema": { + "additionalProperties": false, "properties": { - "anchorLost": { - "type": "boolean" - }, - "effectiveTimeoutSeconds": { - "type": "number" - }, - "elapsedSeconds": { - "type": "number" - }, - "eventsDropped": { - "type": "integer" - }, - "linesMissed": { - "type": "boolean" - }, - "matchedPattern": { - "type": [ - "string", - "null" - ] - }, - "outcome": { - "enum": [ - "Matched", - "AnyOutput", - "Stopped", - "Timeout", - "PaneDied", - "PresentAtEntry" - ], + "channel": { "type": "string" }, - "paneId": { + "note": { "type": "string" - }, - "pollingFallback": { - "type": "boolean" - }, - "tail": { - "properties": { - "droppedBytes": { - "type": "integer" - }, - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "lines", - "truncated", - "droppedLines", - "droppedBytes" - ], - "type": "object" } }, "required": [ - "paneId", - "outcome", - "matchedPattern", - "tail", - "elapsedSeconds", - "effectiveTimeoutSeconds" + "channel", + "note" ], "type": "object" }, @@ -50192,699 +53044,451 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Wait for text" + "title": "Signal a channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Signals one server-wide tmux channel. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "The channel name.", + "type": "string" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "wait_for_text", + "name": "signal_channel", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "processReach": "none", + "outputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "channel", + "note" + ], + "type": "object" + }, + "processReach": "none", + "title": "Signal a channel", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "snapshot_pane", + "wireName": "snapshot_pane", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 171 + }, + "description": "Returns what a pane shows and its metadata, as list_panes describes a pane, in one call. Use it when both are needed; capture_pane alone reads less. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "content": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cursor": { + "type": "string" + }, + "lines_dropped": { + "type": "integer" + }, + "pane": { + "type": "object" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane", + "content", + "cursor", + "truncated", + "lines_dropped" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Snapshot a pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Returns what a pane shows and its metadata, as list_panes describes a pane, in one call. Use it when both are needed; capture_pane alone reads less. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "history": { + "default": false, + "description": "Include scrollback rather than only the visible screen. Defaults to false.", + "type": "boolean" + }, + "max_lines": { + "default": 200, + "description": "Maximum lines, keeping the newest. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "snapshot_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "terminal-content" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "content": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cursor": { + "type": "string" + }, + "lines_dropped": { + "type": "integer" + }, + "pane": { + "type": "object" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane", + "content", + "cursor", + "truncated", + "lines_dropped" + ], + "type": "object" + }, + "processReach": "none", + "title": "Snapshot a pane", "tmuxEffects": [ "observe" ], "toolset": "inspect" } } - } - ], - "wirePrefix": "", - "selectable": true, - "source": "src/LibTmux.Mcp/Policy", - "repo": "libtmux/libtmux-dotnet", - "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", - "selection": { - "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" - }, - "protocol": { - "capabilities": { - "extensions": { - "io.modelcontextprotocol/tasks": {} + }, + { + "name": "split_window", + "wireName": "split_window", + "source": { + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ExecuteTools.java", + "line": 94 }, - "logging": {}, - "resources": { - "listChanged": true + "description": "Creates a pane whose configured process starts after the split. Start a pane's configured process; accepts no command payload.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "direction": { + "description": "below, above, left or right.", + "type": "string" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "percent": { + "default": 50, + "description": "Share of the split occupied by the new pane. Defaults to 50.", + "type": "integer" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" }, - "tools": { - "listChanged": true + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Split a window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Creates a pane whose configured process starts after the split. Start a pane's configured process; accepts no command payload.", + "inputLiteralization": { + "start_directory": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "direction": { + "description": "below, above, left or right.", + "type": "string" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "percent": { + "default": 50, + "description": "Share of the split occupied by the new pane. Defaults to 50.", + "type": "integer" + }, + "start_directory": { + "description": "An absolute literal start directory.", + "type": "string" + } + }, + "required": [ + "pane_id" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "split_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "size": { + "type": "string" + }, + "title": { + "type": "string" + }, + "window_id": { + "type": "string" + } + }, + "required": [ + "id", + "index", + "window_id", + "session_id", + "active", + "command", + "path", + "title", + "size" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Split a window", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "execute" + } } }, - "prompts": [], - "protocolVersion": "2025-11-25", - "resources": [ - { - "description": "The startup-frozen tmux connection and effective MCP tool capabilities.", - "mimeType": "application/json", - "name": "tmux_capabilities", - "title": "Effective tmux capabilities", - "uri": "tmux://capabilities" - } - ], - "resourceTemplates": [], - "serverInfo": { - "name": "tmux", - "version": "0.0.0-alpha.20" - } - } - }, - "cxx": { - "tools": [ - "call_read_tools_batch", - "capture_pane", - "capture_since", - "clear_pane_scrollback", - "create_session", - "create_window", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "kill_pane", - "kill_session", - "kill_window", - "list_panes", - "list_sessions", - "list_windows", - "move_window", - "paste_text", - "rename_session", - "rename_window", - "resize_pane", - "resize_window", - "respawn_pane", - "run_shell_command", - "search_panes", - "select_layout", - "select_pane", - "select_window", - "send_keys", - "send_keys_batch", - "set_history_limit", - "set_mouse_enabled", - "set_pane_title", - "set_synchronize_panes", - "show_environment", - "show_hooks", - "show_option", - "signal_channel", - "snapshot_pane", - "split_window", - "swap_pane", - "wait_for_channel", - "wait_for_text" - ], - "registrations": [ { - "name": "call_read_tools_batch", - "wireName": "call_read_tools_batch", + "name": "swap_pane", + "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2162 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 139 }, - "description": "Run up to sixteen declared inspect operations serially under this one call; inner operations receive no separate approval. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Swaps the positions of two panes. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "Stop after the first failed operation or continue.", - "enum": [ - "continue", - "stop" - ], + "other_pane_id": { + "description": "The other pane ID, such as %2.", "type": "string" }, - "operations": { - "description": "One to sixteen typed inspect-tool operations.", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "history": { - "description": "Capture retained history as well as the visible pane.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Previously returned byte cursor.", - "minimum": 0, - "type": "integer" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "column": { - "description": "Zero-based terminal column.", - "minimum": 0, - "type": "integer" - }, - "row": { - "description": "Zero-based terminal row.", - "minimum": 0, - "type": "integer" - }, - "windowId": { - "description": "Optional stable window ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "row", - "column" - ], - "type": "object" - }, - "tool": { - "const": "find_pane_by_position", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "get_pane_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "get_server_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "names": { - "description": "One to thirty-two validated tmux variable names.", - "items": { - "maxLength": 128, - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array" - }, - "paneId": { - "description": "Optional pane context.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "list_windows", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "pattern": { - "description": "Bounded regular expression.", - "maxLength": 256, - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "tool": { - "const": "search_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Optional exact environment name.", - "maxLength": 256, - "type": "string" - }, - "session": { - "description": "Optional session target.", - "maxLength": 512, - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_environment", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Optional exact hook name.", - "maxLength": 256, - "type": "string" - }, - "target": { - "description": "Optional tmux target.", - "maxLength": 512, - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_hooks", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Exact option name.", - "maxLength": 256, - "type": "string" - }, - "target": { - "description": "Optional session, window, or pane target.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "tool": { - "const": "show_option", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "snapshot_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Call read tools as a batch" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [ - "capture_pane", - "capture_since", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "list_panes", - "list_sessions", - "list_windows", - "search_panes", - "show_environment", - "show_hooks", - "show_option", - "snapshot_pane" - ], - "outputClasses": [ - "tmux-metadata", - "terminal-content", - "process-environment", - "configured-command" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_pane", - "wireName": "capture_pane", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1836 - }, - "description": "Return visible text, or retained history when requested. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "history": { - "description": "Capture retained history as well as the visible pane.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" } }, "required": [ - "paneId" + "pane_id", + "other_pane_id" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "pane_id": { - "pattern": "^%[0-9]+$", + "other_pane_id": { "type": "string" }, - "text": { + "pane_id": { "type": "string" } }, "required": [ "pane_id", - "text" + "other_pane_id" ], "type": "object" }, @@ -50893,203 +53497,129 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Capture a tmux pane" + "title": "Swap panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "capture_since", - "wireName": "capture_since", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1858 - }, - "description": "Return bytes after a bounded client cursor and a replacement cursor. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Previously returned byte cursor.", - "minimum": 0, - "type": "integer" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Capture new pane output" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3145 - }, - "description": "Irreversibly discard retained scrollback for one pane. Delete tmux state; accepts no command payload.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Clear tmux pane scrollback" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, + "description": "Swaps the positions of two panes. Change tmux state; no client-supplied executable input.", "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "other_pane_id": { + "description": "The other pane ID, such as %2.", + "type": "string" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + } + }, + "required": [ + "pane_id", + "other_pane_id" + ], + "type": "object" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "swap_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "other_pane_id": { + "type": "string" + }, + "pane_id": { + "type": "string" + } + }, + "required": [ + "pane_id", + "other_pane_id" + ], + "type": "object" + }, "processReach": "none", + "title": "Swap panes", "tmuxEffects": [ - "delete" + "observe", + "change" ], - "toolset": "teardown" + "toolset": "manage" } } }, { - "name": "create_session", - "wireName": "create_session", + "name": "wait_for_channel", + "wireName": "wait_for_channel", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2543 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/ManageTools.java", + "line": 163 }, - "description": "Create a detached session; names and path data are literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", + "description": "Waits on tmux's channel state with a bounded timeout. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "description": "Optional detached height.", - "maximum": 100000, - "minimum": 1, - "type": "integer" - }, - "name": { - "description": "Optional literal unique session name.", - "maxLength": 512, - "type": "string" - }, - "startDirectory": { - "description": "Literal pane start directory.", - "maxLength": 4096, + "channel": { + "description": "A server-wide tmux channel name.", "type": "string" }, - "width": { - "description": "Optional detached width.", - "maximum": 100000, - "minimum": 1, - "type": "integer" + "drain_first": { + "default": false, + "description": "Consume a pending signal before waiting. Defaults to false.", + "type": "boolean" }, - "windowName": { - "description": "Optional literal first window name.", - "maxLength": 512, - "type": "string" + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" } }, - "required": [], + "required": [ + "channel" + ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "name": { + "channel": { "type": "string" }, - "session_id": { - "pattern": "^\\$[0-9]+$", + "effective_timeout": { + "type": "number" + }, + "note": { "type": "string" + }, + "outcome": { + "type": "string" + }, + "seconds": { + "type": "number" } }, "required": [ - "name", - "session_id" + "channel", + "outcome", + "seconds", + "effective_timeout" ], "type": "object" }, @@ -51098,808 +53628,1070 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Create a tmux session" + "title": "Wait for a channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once", - "windowName": "double-hash-once" + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "description": "Waits on tmux's channel state with a bounded timeout. Change tmux state; no client-supplied executable input.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "A server-wide tmux channel name.", + "type": "string" + }, + "drain_first": { + "default": false, + "description": "Consume a pending signal before waiting. Defaults to false.", + "type": "boolean" + }, + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "wait_for_channel", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "configured-process", + "outputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "type": "string" + }, + "effective_timeout": { + "type": "number" + }, + "note": { + "type": "string" + }, + "outcome": { + "type": "string" + }, + "seconds": { + "type": "number" + } + }, + "required": [ + "channel", + "outcome", + "seconds", + "effective_timeout" + ], + "type": "object" + }, + "processReach": "none", + "title": "Wait for a channel", "tmuxEffects": [ - "observe", "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "create_window", - "wireName": "create_window", + "name": "wait_for_text", + "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2587 + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "file": "libtmux-mcp/src/main/java/io/github/libtmux/mcp/InspectTools.java", + "line": 246 }, - "description": "Create a detached window; name and path data are literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", + "description": "Waits for new pane output without accepting executable input. Discounts recognized input from this server while pending and for ten seconds after submission. Output identical to that input and partially redrawn echoes are ambiguous; use run_shell_command for commands you start. Wait for the prompt before typing into a cold shell. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "Optional literal window name.", - "maxLength": 512, + "cursor": { + "description": "A cursor returned by an earlier capture.", "type": "string" }, - "session": { - "description": "Stable owning session ID or name.", - "maxLength": 512, - "type": "string" + "max_lines": { + "default": 200, + "description": "Maximum observed lines to return. Defaults to 200.", + "type": "integer" }, - "startDirectory": { - "description": "Literal pane start directory.", - "maxLength": 4096, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", "type": "string" + }, + "patterns": { + "description": "Text to wait for; any one ends the wait. One value may be sent on its own, without a list.", + "items": { + "maxLength": 4096, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "regex": { + "default": false, + "description": "Treat patterns and stops as regular expressions. Defaults to false.", + "type": "boolean" + }, + "stop": { + "description": "Failure text; any one ends the wait. One value may be sent on its own, without a list.", + "items": { + "maxLength": 4096, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" } }, "required": [ - "session" + "pane_id" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "session_id": { - "pattern": "^\\$[0-9]+$", + "cursor": { "type": "string" }, - "window_id": { - "pattern": "^@[0-9]+$", - "type": "string" - } - }, - "required": [ - "session_id", - "window_id" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Create a tmux window" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once" + "effective_timeout": { + "type": "number" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "configured-process", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "execute" - } - } - }, - { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1951 - }, - "description": "Resolve coordinates using fixed tmux layout fields. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "column": { - "description": "Zero-based terminal column.", - "minimum": 0, + "lines_dropped": { "type": "integer" }, - "row": { - "description": "Zero-based terminal row.", - "minimum": 0, - "type": "integer" + "matched": { + "type": "string" }, - "windowId": { - "description": "Optional stable window ID.", - "maxLength": 512, + "matched_line": { + "type": "string" + }, + "note": { + "type": "string" + }, + "outcome": { + "type": "string" + }, + "output": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane_id": { "type": "string" + }, + "seconds": { + "type": "number" + }, + "truncated": { + "type": "boolean" } }, "required": [ - "row", - "column" + "pane_id", + "outcome", + "output", + "truncated", + "lines_dropped", + "cursor", + "seconds", + "effective_timeout" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Find a pane by position" + "title": "Wait for pane text" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Waits for new pane output without accepting executable input. Discounts recognized input from this server while pending and for ten seconds after submission. Output identical to that input and partially redrawn echoes are ambiguous; use run_shell_command for commands you start. Wait for the prompt before typing into a cold shell. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_pane_info", - "wireName": "get_pane_info", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1823 - }, - "description": "Return one pane by stable ID. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Get tmux pane information" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_server_info", - "wireName": "get_server_info", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1761 - }, - "description": "Report liveness, tmux version, and the resolved socket when running. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Get tmux server information" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_session_info", - "wireName": "get_session_info", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1794 - }, - "description": "Return one session by stable ID or name. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Get tmux session information" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2023 - }, - "description": "Expand only validated variable identifiers, never a caller format. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "names": { - "description": "One to thirty-two validated tmux variable names.", - "items": { - "maxLength": 128, - "type": "string" + "inputSchema": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "A cursor returned by an earlier capture.", + "type": "string" + }, + "max_lines": { + "default": 200, + "description": "Maximum observed lines to return. Defaults to 200.", + "type": "integer" + }, + "pane_id": { + "description": "The pane to act on, such as %1. Every listing tool returns these.", + "type": "string" + }, + "patterns": { + "description": "Text to wait for; any one ends the wait. One value may be sent on its own, without a list.", + "items": { + "maxLength": 4096, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "regex": { + "default": false, + "description": "Treat patterns and stops as regular expressions. Defaults to false.", + "type": "boolean" + }, + "stop": { + "description": "Failure text; any one ends the wait. One value may be sent on its own, without a list.", + "items": { + "maxLength": 4096, + "type": "string" + }, + "maxItems": 32, + "type": [ + "array", + "string" + ] + }, + "timeout": { + "default": 30, + "description": "Seconds to wait before giving up. Defaults to 30.0.", + "type": "number" + } }, - "maxItems": 32, - "minItems": 1, - "type": "array" - }, - "paneId": { - "description": "Optional pane context.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Get tmux variables" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "names": "validated-variable-name" + "required": [ + "pane_id" + ], + "type": "object" }, - "mayExposeSecrets": false, + "mayExposeSecrets": true, "mayReturnUntrustedContent": true, + "name": "wait_for_text", "nestedAuthority": [], "outputClasses": [ "tmux-metadata", - "configured-command" + "terminal-content" ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "cursor": { + "type": "string" + }, + "effective_timeout": { + "type": "number" + }, + "lines_dropped": { + "type": "integer" + }, + "matched": { + "type": "string" + }, + "matched_line": { + "type": "string" + }, + "note": { + "type": "string" + }, + "outcome": { + "type": "string" + }, + "output": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane_id": { + "type": "string" + }, + "seconds": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pane_id", + "outcome", + "output", + "truncated", + "lines_dropped", + "cursor", + "seconds", + "effective_timeout" + ], + "type": "object" + }, "processReach": "none", + "title": "Wait for pane text", "tmuxEffects": [ "observe" ], "toolset": "inspect" } } - }, - { - "name": "get_window_info", - "wireName": "get_window_info", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1809 - }, - "description": "Return one window by stable ID. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Get tmux window information" + } + ], + "wirePrefix": "", + "selectable": true, + "source": "libtmux-mcp/src/main/java/io/github/libtmux/mcp", + "repo": "libtmux/libtmux-java", + "revision": "a0ecbc16da00140e2520462d478a2af470878272", + "extractedRevision": "a0ecbc16da00140e2520462d478a2af470878272", + "selection": { + "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" + }, + "protocol": { + "capabilities": { + "logging": {}, + "resources": { + "listChanged": false, + "subscribe": false }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } + "tools": { + "listChanged": false } }, + "prompts": [], + "protocolVersion": "2025-11-25", + "resources": [ + { + "description": "The startup-frozen effective tool surface and selected tmux socket.", + "mimeType": "application/json", + "name": "tmux capabilities", + "uri": "tmux://capabilities" + } + ], + "resourceTemplates": [], + "serverInfo": { + "name": "libtmux", + "version": "0.0.1-alpha.17-SNAPSHOT" + } + } + }, + "csharp": { + "tools": [ + "call_read_tools_batch", + "capture_pane", + "capture_since", + "clear_pane_scrollback", + "create_session", + "create_window", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "kill_pane", + "kill_session", + "kill_window", + "list_panes", + "list_sessions", + "list_windows", + "move_window", + "paste_text", + "rename_session", + "rename_window", + "resize_pane", + "resize_window", + "respawn_pane", + "run_shell_command", + "search_panes", + "select_layout", + "select_pane", + "select_window", + "send_keys", + "send_keys_batch", + "set_history_limit", + "set_mouse_enabled", + "set_pane_title", + "set_synchronize_panes", + "show_environment", + "show_hooks", + "show_option", + "signal_channel", + "snapshot_pane", + "split_window", + "swap_pane", + "wait_for_channel", + "wait_for_text" + ], + "registrations": [ { - "name": "kill_pane", - "wireName": "kill_pane", + "name": "call_read_tools_batch", + "wireName": "call_read_tools_batch", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3161 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 586 }, - "description": "Delete one pane and its running process. Delete tmux state; accepts no command payload.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Execute up to 16 declared inspect operations serially; inner operations receive no separate approval.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "onError": { + "default": "stop", + "description": "Stop after the first failed operation, or continue serially.", + "enum": [ + "continue", + "stop" + ], "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Kill a tmux pane" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "kill_session", - "wireName": "kill_session", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3196 - }, - "description": "Delete one session and every window it owns. Delete tmux state; accepts no command payload.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Kill a tmux session" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "kill_window", - "wireName": "kill_window", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3178 - }, - "description": "Delete one window and every pane it owns. Delete tmux state; accepts no command payload.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Kill a tmux window" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe", - "delete" - ], - "toolset": "teardown" - } - } - }, - { - "name": "list_panes", - "wireName": "list_panes", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1733 - }, - "description": "List every pane with stable pane, window, and session IDs. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "panes": { + }, + "operations": { + "description": "Between 1 and 16 declared inspect calls, executed serially without separate approval for each inner operation.", "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "includeHistory": { + "default": false, + "description": "Include scrollback.", + "type": "boolean" + }, + "joinWrappedLines": { + "default": false, + "description": "Rejoin tmux-wrapped lines.", + "type": "boolean" + }, + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "capture_pane" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "command": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "cursor": { + "default": null, + "description": "The opaque cursor returned by the previous call. Omit to start from what is on screen now.", + "type": [ + "string", + "null" + ] + }, + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "capture_since" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "dead": { - "type": "boolean" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "position": { + "description": "The zero-based pane index.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "windowId": { + "description": "The window id.", + "type": "string" + } + }, + "required": [ + "windowId", + "position" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "height": { - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "A pane id.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "get_pane_info" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "id": { - "pattern": "^%[0-9]+$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "tool": { + "const": "get_server_info" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "index": { - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "A session id or name.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "path": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "names": { + "description": "Variable names such as session_name, without #{...}. Between 1 and 64 names, each at most 64 letters, digits and underscores.", + "items": { + "type": "string" + }, + "type": "array" + }, + "paneId": { + "default": null, + "description": "A pane id used as the lookup context. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "pid": { - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "A window id.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "session_id": { - "pattern": "^\\$[0-9]+$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "description": "A window id. Omit for every window.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "list_panes" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "title": { - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "tool": { + "const": "list_sessions" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "width": { - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "list_windows" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "window_id": { - "pattern": "^@[0-9]+$", - "type": "string" - } - }, - "required": [ - "active", - "command", - "dead", - "height", - "id", - "index", - "path", - "pid", - "session_id", - "title", - "width", - "window_id" - ], - "type": "object" - }, - "type": "array" - } - }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "default": true, + "description": "Ignore case.", + "type": "boolean" + }, + "includeHistory": { + "default": false, + "description": "Search scrollback too.", + "type": "boolean" + }, + "maxMatchesPerPane": { + "default": 20, + "description": "Maximum matches per pane.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "pattern": { + "description": "A linear-time regular expression, at most 999 UTF-8 bytes. .NET syntax without lookarounds, backreferences or atomic groups.", + "type": "string" + }, + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "default": null, + "description": "One variable name, which answers its value. Omit for every name with hasValue instead of values.", + "type": [ + "string", + "null" + ] + }, + "session": { + "default": null, + "description": "A session id or name. Omit for the server environment.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "show_environment" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "default": null, + "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "scope": { + "default": "Session", + "description": "Server, Session, Window, or Pane.", + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], + "type": "string" + } + }, + "type": "object" + }, + "tool": { + "const": "show_hooks" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "The option name.", + "type": "string" + }, + "paneId": { + "default": null, + "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "scope": { + "default": "Pane", + "description": "Server, Session, Window, or Pane.", + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "tool": { + "const": "snapshot_pane" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, "required": [ - "panes" + "operations" ], "type": "object" }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "List tmux panes" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "list_sessions", - "wireName": "list_sessions", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1699 - }, - "description": "List stable session IDs, names, paths, and client counts. Inspect tmux metadata; accepts no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, "outputSchema": { - "additionalProperties": false, "properties": { - "sessions": { + "failed": { + "type": "integer" + }, + "onError": { + "type": "string" + }, + "results": { "items": { - "additionalProperties": false, "properties": { - "attached": { - "type": "boolean" + "error": { + "type": [ + "string", + "null" + ] }, - "client_count": { - "minimum": 0, + "index": { "type": "integer" }, - "id": { - "pattern": "^\\$[0-9]+$", - "type": "string" + "result": true, + "resultTruncated": { + "type": "boolean" }, - "name": { - "type": "string" + "success": { + "type": "boolean" }, - "path": { + "tool": { "type": "string" - }, - "window_count": { - "minimum": 0, - "type": "integer" } }, "required": [ - "attached", - "client_count", - "id", - "name", - "path", - "window_count" + "index", + "tool", + "success", + "error", + "result", + "resultTruncated" ], "type": "object" }, "type": "array" + }, + "stoppedAt": { + "type": [ + "integer", + "null" + ] + }, + "succeeded": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" } }, "required": [ - "sessions" + "results", + "succeeded", + "failed", + "stoppedAt", + "truncated", + "truncatedBytes", + "onError" ], "type": "object" }, @@ -51908,16 +54700,37 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List tmux sessions" + "title": "Call read tools batch" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "call_read_tools_batch", + "nestedAuthority": [ + "capture_pane", + "capture_since", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "list_panes", + "list_sessions", + "list_windows", + "search_panes", + "show_environment", + "show_hooks", + "show_option", + "snapshot_pane" + ], "outputClasses": [ + "configured-command", + "process-environment", + "terminal-content", "tmux-metadata" ], "processReach": "none", @@ -51929,89 +54742,86 @@ } }, { - "name": "list_windows", - "wireName": "list_windows", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1708 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 576 }, - "description": "List windows through an exact owning session. Inspect tmux metadata; accepts no client-supplied executable input.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read the text a pane is showing, and optionally its scrollback. The newest lines are always kept; anything dropped to fit the budget is reported. To watch a pane across several turns, use capture_since instead — it returns only what is new.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" + "includeHistory": { + "default": false, + "description": "Include scrollback.", + "type": "boolean" + }, + "joinWrappedLines": { + "default": false, + "description": "Rejoin tmux-wrapped lines.", + "type": "boolean" + }, + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "session" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "height": { - "minimum": 0, - "type": "integer" - }, - "id": { - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "type": "integer" - }, - "layout": { - "type": "string" - }, - "name": { - "type": "string" - }, - "pane_count": { - "minimum": 0, - "type": "integer" - }, - "session_id": { - "pattern": "^\\$[0-9]+$", + "content": { + "properties": { + "droppedBytes": { + "type": "integer" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { "type": "string" }, - "width": { - "minimum": 0, - "type": "integer" - } + "type": "array" }, - "required": [ - "active", - "height", - "id", - "index", - "layout", - "name", - "pane_count", - "session_id", - "width" - ], - "type": "object" + "truncated": { + "type": "boolean" + } }, - "type": "array" + "required": [ + "lines", + "truncated", + "droppedLines", + "droppedBytes" + ], + "type": "object" + }, + "paneId": { + "type": "string" } }, "required": [ - "windows" + "paneId", + "content" ], "type": "object" }, @@ -52020,16 +54830,18 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List tmux windows" + "title": "Capture pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_pane", "nestedAuthority": [], "outputClasses": [ + "terminal-content", "tmux-metadata" ], "processReach": "none", @@ -52041,40 +54853,97 @@ } }, { - "name": "move_window", - "wireName": "move_window", + "name": "capture_since", + "wireName": "capture_since", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2417 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 577 }, - "description": "Move a window to an exact index in its owning session. Change tmux state; no client-supplied executable input.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read only what a pane has printed since the last call. Pass back the cursor each time. Use this to watch a long-running process across turns: the tenth read costs what the first did, where re-capturing the pane would return everything again. Call with no cursor to start watching from now.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "index": { - "description": "Non-negative destination index.", - "maximum": 100000, - "minimum": 0, - "type": "integer" - }, - "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" + "cursor": { + "default": null, + "description": "The opaque cursor returned by the previous call. Omit to start from what is on screen now.", + "type": [ + "string", + "null" + ] + }, + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "windowId", - "index" - ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "anchorLost": { + "type": "boolean" + }, + "content": { + "properties": { + "droppedBytes": { + "type": "integer" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "lines", + "truncated", + "droppedLines", + "droppedBytes" + ], + "type": "object" + }, + "cursor": { + "type": "string" + }, + "linesMissed": { + "type": "boolean" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId", + "content", + "cursor", + "linesMissed", + "anchorLost" + ], "type": "object" }, "annotations": { @@ -52082,76 +54951,83 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Move a tmux window" + "title": "Capture since" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_since", "nestedAuthority": [], "outputClasses": [ + "terminal-content", "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3008 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 613 }, - "description": "Require the target pane to be live and outside human-owned mode, then stage a private target-only buffer, optionally append Enter, paste it once, and verify cleanup. Empty text without Enter is a guarded buffer-free no-op. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Delete tmux state; accepts no command payload. Delete a pane's scrollback history, keeping what the screen shows. Deleted history cannot be read back.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enter": { - "description": "Append Enter to the same private paste buffer.", - "type": "boolean" - }, "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - }, - "text": { - "description": "Literal text to paste.", - "maxLength": 1048576, - "type": "string" + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "paneId", - "text" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { "changed": { - "type": "boolean" - }, - "pane_id": { - "pattern": "^%[0-9]+$", "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id" + "changed" ], "type": "object" }, @@ -52160,61 +55036,111 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Paste text into a tmux pane" + "title": "Clear pane scrollback" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, + "name": "clear_pane_scrollback", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "pane-input", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "delete" ], - "toolset": "execute" + "toolset": "teardown" } } }, { - "name": "rename_session", - "wireName": "rename_session", + "name": "create_session", + "wireName": "create_session", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2269 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 603 }, - "description": "Replace one session name. Change tmux state; no client-supplied executable input.", + "description": "Start a pane's configured process; accepts no command payload. Create a detached tmux session and return its ids. Give a width and height when nothing will attach to it: a session with no client keeps tmux's default 80x24, which truncates wide output.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "height": { + "default": null, + "description": "Rows. Omit for tmux's default of 24.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, "name": { - "description": "Literal replacement session name.", - "maxLength": 512, - "type": "string" + "default": null, + "description": "The session name. Omit and tmux names it with a number.", + "type": [ + "string", + "null" + ] }, - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" + "startDirectory": { + "default": null, + "description": "The literal starting directory. Omit for the MCP server's own working directory.", + "type": [ + "string", + "null" + ] + }, + "width": { + "default": null, + "description": "Columns. Omit for tmux's default of 80.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] } }, - "required": [ - "session", - "name" - ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], "type": "object" }, "annotations": { @@ -52222,141 +55148,266 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename a tmux session" + "title": "Create session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": { - "name": "double-hash-once" + "name": "double-hash-once", + "startDirectory": "double-hash-once" }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "create_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", + "processReach": "configured-process", "tmuxEffects": [ - "observe", - "change" + "change", + "observe" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "rename_window", - "wireName": "rename_window", + "name": "create_window", + "wireName": "create_window", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2288 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 604 }, - "description": "Replace one window name. Change tmux state; no client-supplied executable input.", + "description": "Start a pane's configured process; accepts no command payload. Create a window in a tmux session and return its ids.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "name": { - "description": "Literal replacement window name.", - "maxLength": 512, + "default": null, + "description": "The window name. Omit and tmux names it after the program it runs.", + "type": [ + "string", + "null" + ] + }, + "session": { + "default": null, + "description": "A session id or name. Omit for the first session.", + "type": [ + "string", + "null" + ] + }, + "startDirectory": { + "default": null, + "description": "The literal starting directory. Omit for the MCP server's own working directory.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { "type": "string" }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "windowId", - "name" + "changed" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename a tmux window" + "title": "Create window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": { - "name": "double-hash-once" + "name": "double-hash-once", + "startDirectory": "double-hash-once" }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "create_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "none", + "processReach": "configured-process", "tmuxEffects": [ - "observe", - "change" + "change", + "observe" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2383 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 580 }, - "description": "Replace one or both pane dimensions. Change tmux state; no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find the pane sitting at an index within a window. Answers nothing rather than failing when no pane is at that position.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "position": { + "description": "The zero-based pane index.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "windowId": { + "description": "The window id.", + "type": "string" + } + }, + "required": [ + "windowId", + "position" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": [ + "string", + "null" + ] + }, + "currentPath": { + "type": [ + "string", + "null" + ] + }, + "dead": { + "type": "boolean" + }, "height": { - "description": "Optional positive pane height.", - "maximum": 100000, - "minimum": 1, "type": "integer" }, + "historyLimit": { + "type": [ + "integer", + "null" + ] + }, + "historySize": { + "type": [ + "integer", + "null" + ] + }, + "index": { + "type": "integer" + }, + "inMode": { + "type": "boolean" + }, + "isCaller": { + "type": "boolean" + }, "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, "type": "string" }, + "pid": { + "type": [ + "integer", + "null" + ] + }, + "sessionId": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, "width": { - "description": "Optional positive pane width.", - "maximum": 100000, - "minimum": 1, "type": "integer" + }, + "windowId": { + "type": "string" + }, + "zoomed": { + "type": "boolean" } }, "required": [ - "paneId" + "paneId", + "windowId", + "sessionId", + "index", + "width", + "height", + "title", + "active", + "dead", + "zoomed", + "inMode", + "currentCommand", + "currentPath", + "pid", + "historySize", + "historyLimit", + "isCaller" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize a tmux pane" + "title": "Find pane by position" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -52364,69 +55415,143 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "find_pane_by_position", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "resize_window", - "wireName": "resize_window", + "name": "get_pane_info", + "wireName": "get_pane_info", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2362 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 575 }, - "description": "Replace one window's dimensions. Change tmux state; no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one pane's size, title, running command, working directory, process ID, history size and limit, and whether it is active, dead, zoomed, in a mode or the pane this server runs in. This is metadata only; to read what the pane shows, use capture_pane or snapshot_pane.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "description": "Positive window height.", - "maximum": 100000, - "minimum": 1, + "paneId": { + "description": "A pane id.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "active": { + "type": "boolean" + }, + "currentCommand": { + "type": [ + "string", + "null" + ] + }, + "currentPath": { + "type": [ + "string", + "null" + ] + }, + "dead": { + "type": "boolean" + }, + "height": { + "type": "integer" + }, + "historyLimit": { + "type": [ + "integer", + "null" + ] + }, + "historySize": { + "type": [ + "integer", + "null" + ] + }, + "index": { "type": "integer" }, + "inMode": { + "type": "boolean" + }, + "isCaller": { + "type": "boolean" + }, + "paneId": { + "type": "string" + }, + "pid": { + "type": [ + "integer", + "null" + ] + }, + "sessionId": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, "width": { - "description": "Positive window width.", - "maximum": 100000, - "minimum": 1, "type": "integer" }, "windowId": { - "description": "Stable window ID.", - "maxLength": 512, "type": "string" + }, + "zoomed": { + "type": "boolean" } }, "required": [ + "paneId", "windowId", + "sessionId", + "index", "width", - "height" + "height", + "title", + "active", + "dead", + "zoomed", + "inMode", + "currentCommand", + "currentPath", + "pid", + "historySize", + "historyLimit", + "isCaller" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize a tmux window" + "title": "Get pane info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -52434,71 +55559,87 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "get_pane_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "respawn_pane", - "wireName": "respawn_pane", + "name": "get_server_info", + "wireName": "get_server_info", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2658 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 572 }, - "description": "Restart only the pane's configured process; no caller command is accepted. Start a pane's configured process; accepts no command payload.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read the tmux server's version and how many sessions, windows and panes it holds. Use to confirm a socket is alive and which tmux is running it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "force": { - "description": "Permit replacing a running pane process.", - "type": "boolean" - }, - "killFirst": { - "description": "Kill a running pane process before respawn.", - "type": "boolean" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, - "type": "string" - }, - "startDirectory": { - "description": "Literal replacement start directory.", - "maxLength": 4096, - "type": "string" - } - }, - "required": [ - "paneId" - ], + "properties": {}, "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "changed": { - "type": "boolean" + "callerPaneId": { + "type": [ + "string", + "null" + ] }, - "pane_id": { - "pattern": "^%[0-9]+$", - "type": "string" + "callerPaneSocket": { + "type": [ + "string", + "null" + ] + }, + "paneCount": { + "type": "integer" + }, + "sessionCount": { + "type": "integer" + }, + "socketName": { + "type": [ + "string", + "null" + ] + }, + "socketPath": { + "type": [ + "string", + "null" + ] + }, + "version": { + "type": [ + "string", + "null" + ] + }, + "windowCount": { + "type": "integer" } }, "required": [ - "pane_id" + "socketName", + "socketPath", + "version", + "sessionCount", + "windowCount", + "paneCount", + "callerPaneId", + "callerPaneSocket" ], "type": "object" }, @@ -52507,70 +55648,76 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Respawn a tmux pane" + "title": "Get server info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, + "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "get_server_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "configured-process", + "processReach": "none", "tmuxEffects": [ - "observe", - "change", - "delete" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "run_shell_command", - "wireName": "run_shell_command", + "name": "get_session_info", + "wireName": "get_session_info", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2689 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 573 }, - "description": "Require one live configured pane, outside human-owned mode and running a supported POSIX foreground shell, then send one command and return output after its private completion boundary. Run a shell command in a pane with your user's permissions.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one session's name, ID, window count and whether a client is attached, without listing every session. Give the session, or a window ID to read the session that holds it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "command": { - "description": "Shell command sent to the pane.", - "maxLength": 1048576, - "type": "string" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "session": { + "description": "A session id or name.", "type": "string" - }, - "timeoutMs": { - "description": "Completion timeout in milliseconds.", - "maximum": 60000, - "minimum": 1, - "type": "integer" } }, "required": [ - "paneId", - "command" + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "attached": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "windowCount": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "sessionId", + "name", + "attached", + "windowCount" + ], "type": "object" }, "annotations": { @@ -52578,81 +55725,67 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Run a shell command in a tmux pane" + "title": "Get session info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "get_session_info", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content" + "tmux-metadata" ], - "processReach": "pane-command", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "search_panes", - "wireName": "search_panes", + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1906 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 582 }, - "description": "Search captured lines using a length-limited expression. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Expand named tmux format variables for a pane, such as session_name or window_width. Use it for fields nothing else answers; get_pane_info already returns the common ones, and show_option reads configuration rather than live state.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "pattern": { - "description": "Bounded regular expression.", - "maxLength": 256, - "type": "string" + "names": { + "description": "Variable names such as session_name, without #{...}. Between 1 and 64 names, each at most 64 letters, digits and underscores.", + "items": { + "type": "string" + }, + "type": "array" + }, + "paneId": { + "default": null, + "description": "A pane id used as the lookup context. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, "required": [ - "pattern" + "names" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "matches": { - "items": { - "additionalProperties": false, - "properties": { - "line": { - "type": "string" - }, - "pane_id": { - "pattern": "^%[0-9]+$", - "type": "string" - } - }, - "required": [ - "line", - "pane_id" - ], - "type": "object" - }, - "type": "array" - } + "additionalProperties": { + "type": "string" }, - "required": [ - "matches" - ], "type": "object" }, "annotations": { @@ -52660,18 +55793,21 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Search tmux panes" + "title": "Get tmux variables" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, + "inputLiteralization": { + "names": "validated-variable-name" + }, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, + "name": "get_tmux_variables", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content" + "configured-command", + "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ @@ -52682,47 +55818,85 @@ } }, { - "name": "select_layout", - "wireName": "select_layout", + "name": "get_window_info", + "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2339 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 574 }, - "description": "Replace the pane layout of one window. Names and mirrored layouts follow the selected daemon version. Saved layouts accept v1 checksums and v2 JSON; v2 requires tmux 3.8 (including 3.8-rc) or newer. Change tmux state; no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Read one window's name, index, size, layout, pane count and whether it is its session's current window, without listing every window. Give the window ID, or a pane ID to read the window that holds it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "windowId": { + "description": "A window id.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "active": { + "type": "boolean" + }, + "height": { + "type": "integer" + }, + "index": { + "type": "integer" + }, "layout": { - "description": "Built-in name, unambiguous abbreviation or saved tmux layout.", - "maxLength": 4096, + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "paneCount": { + "type": [ + "integer", + "null" + ] + }, + "sessionId": { "type": "string" }, + "width": { + "type": "integer" + }, "windowId": { - "description": "Stable window ID.", - "maxLength": 512, "type": "string" } }, "required": [ "windowId", + "sessionId", + "index", + "name", + "width", + "height", + "active", + "paneCount", "layout" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select a tmux layout" + "title": "Get window info" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -52730,37 +55904,36 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "get_window_info", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "select_pane", - "wireName": "select_pane", + "name": "kill_pane", + "wireName": "kill_pane", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2323 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 614 }, - "description": "Make one pane active. Change tmux state; no client-supplied executable input.", + "description": "Delete tmux state; accepts no command payload. Close a pane and end its program. Refuses the pane this server runs in; to remove a whole window, use kill_window.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "description": "The pane id to kill.", "type": "string" } }, @@ -52770,7 +55943,35 @@ "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], "type": "object" }, "annotations": { @@ -52778,7 +55979,7 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select a tmux pane" + "title": "Kill pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -52786,47 +55987,75 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "kill_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "delete", + "observe" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "select_window", - "wireName": "select_window", + "name": "kill_session", + "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2307 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 616 }, - "description": "Make one window active. Change tmux state; no client-supplied executable input.", + "description": "Delete tmux state; accepts no command payload. Close a session with all its windows and panes. Refuses the session this server runs in.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "windowId": { - "description": "Stable window ID.", - "maxLength": 512, + "session": { + "description": "The session id or name to kill.", "type": "string" } }, "required": [ - "windowId" + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], "type": "object" }, "annotations": { @@ -52834,7 +56063,7 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select a tmux window" + "title": "Kill session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -52842,69 +56071,74 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "kill_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "delete", + "observe" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "send_keys", - "wireName": "send_keys", + "name": "kill_window", + "wireName": "kill_window", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2803 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 615 }, - "description": "Require every configured synchronized pane to be live and outside human-owned mode, then send one validated tmux key name. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Delete tmux state; accepts no command payload. Close a window and every pane in it. Refuses the window this server runs in.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "keys": { - "description": "One tmux key name.", - "maxLength": 256, - "type": "string" - }, - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "windowId": { + "description": "The window id to kill.", "type": "string" } }, "required": [ - "paneId", - "keys" + "windowId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "pane_id": { - "pattern": "^%[0-9]+$", + "changed": { "type": "string" }, - "target_pane_ids": { - "items": { - "pattern": "^%[0-9]+$", - "type": "string" - }, - "type": "array" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id", - "target_pane_ids" + "changed" ], "type": "object" }, @@ -52913,159 +56147,253 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send keys to a tmux pane" + "title": "Kill window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, + "name": "kill_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "pane-input", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "delete", + "observe" ], - "toolset": "execute" + "toolset": "teardown" } } }, { - "name": "send_keys_batch", - "wireName": "send_keys_batch", + "name": "list_panes", + "wireName": "list_panes", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2876 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 571 }, - "description": "Preflight each row's configured synchronized pane cohort independently, requiring every pane to be live and outside human-owned mode before its text or key and optional Enter. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List tmux panes, optionally within one session or window. Filter for isCaller=true to answer 'which pane am I in?', which finds one only when this server drives the caller's own socket — get_server_info says whose socket that is. This reads sizes and running commands, not terminal text — for that use search_panes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "Stop after the first failed operation or continue.", - "enum": [ - "continue", - "stop" - ], - "type": "string" + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] }, - "operations": { - "description": "One to sixty-four ordered pane-input operations.", + "windowId": { + "default": null, + "description": "A window id. Omit for every window.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "properties": { + "result": { "items": { - "additionalProperties": false, "properties": { - "enter": { + "active": { "type": "boolean" }, - "keys": { - "maxLength": 4096, - "type": "string" + "currentCommand": { + "type": [ + "string", + "null" + ] }, - "literal": { + "currentPath": { + "type": [ + "string", + "null" + ] + }, + "dead": { + "type": "boolean" + }, + "height": { + "type": "integer" + }, + "historyLimit": { + "type": [ + "integer", + "null" + ] + }, + "historySize": { + "type": [ + "integer", + "null" + ] + }, + "index": { + "type": "integer" + }, + "inMode": { + "type": "boolean" + }, + "isCaller": { "type": "boolean" }, "paneId": { - "maxLength": 512, "type": "string" + }, + "pid": { + "type": [ + "integer", + "null" + ] + }, + "sessionId": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "width": { + "type": "integer" + }, + "windowId": { + "type": "string" + }, + "zoomed": { + "type": "boolean" } }, "required": [ "paneId", - "keys" + "windowId", + "sessionId", + "index", + "width", + "height", + "title", + "active", + "dead", + "zoomed", + "inMode", + "currentCommand", + "currentPath", + "pid", + "historySize", + "historyLimit", + "isCaller" ], "type": "object" }, - "maxItems": 64, - "minItems": 1, "type": "array" } }, "required": [ - "operations" + "result" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send a key sequence to a tmux pane" + "title": "List panes" }, "meta": { + "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, + "name": "list_panes", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "pane-input", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "set_history_limit", - "wireName": "set_history_limit", + "name": "list_sessions", + "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2523 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 569 }, - "description": "Replace retained-history bounds with a non-negative integer. Change tmux state; no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List the tmux sessions. This reads names and sizes, not terminal text — to find what a pane is showing, use search_panes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, + "properties": {}, + "type": "object" + }, + "outputSchema": { "properties": { - "limit": { - "description": "Retained history line limit.", - "maximum": 10000000, - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Stable session ID or name.", - "maxLength": 512, - "type": "string" + "result": { + "items": { + "properties": { + "attached": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "windowCount": { + "type": [ + "integer", + "null" + ] + } + }, + "required": [ + "sessionId", + "name", + "attached", + "windowCount" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "session", - "limit" + "result" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set tmux history limit" + "title": "List sessions" }, "meta": { "com.git-pull.libtmux-mcp/capability": { @@ -53073,45 +56401,103 @@ "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "list_sessions", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "set_mouse_enabled", - "wireName": "set_mouse_enabled", + "name": "list_windows", + "wireName": "list_windows", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2510 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 570 }, - "description": "Replace the global mouse option with a typed boolean. Change tmux state; no client-supplied executable input.", + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List tmux windows, optionally within one session. This reads names and layouts, not terminal text — to find what a pane is showing, use search_panes.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "description": "Whether mouse handling is enabled.", - "type": "boolean" + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "enabled" - ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "result": { + "items": { + "properties": { + "active": { + "type": "boolean" + }, + "height": { + "type": "integer" + }, + "index": { + "type": "integer" + }, + "layout": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "paneCount": { + "type": [ + "integer", + "null" + ] + }, + "sessionId": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "windowId", + "sessionId", + "index", + "name", + "width", + "height", + "active", + "paneCount", + "layout" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "result" + ], "type": "object" }, "annotations": { @@ -53119,239 +56505,203 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set tmux mouse handling" + "title": "List windows" }, "meta": { + "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "list_windows", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "set_pane_title", - "wireName": "set_pane_title", + "name": "move_window", + "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2457 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 595 }, - "description": "Replace one pane title. Change tmux state; no client-supplied executable input.", + "description": "Change tmux state; no client-supplied executable input. Move a window to another index, or into another session. With replaceExisting it takes an index that is already occupied by killing the window there, which needs the teardown toolset.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "destination": { + "default": "", + "description": "The destination window index. Omit for the next free index, as an empty one does.", "type": "string" }, - "title": { - "description": "Literal replacement pane title.", - "maxLength": 4096, + "replaceExisting": { + "default": false, + "description": "Kill the window already at that index and take its place. Needs the same authority as kill_window, because that is what it does to it.", + "type": "boolean" + }, + "session": { + "default": null, + "description": "The destination session id or name. Omit to stay in the window's session.", + "type": [ + "string", + "null" + ] + }, + "windowId": { + "description": "The window id to move.", "type": "string" } }, "required": [ - "paneId", - "title" + "windowId" ], "type": "object" }, "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Set a tmux pane title" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": { - "title": "double-hash-once" + "properties": { + "changed": { + "type": "string" }, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "set_synchronize_panes", - "wireName": "set_synchronize_panes", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 3106 - }, - "description": "Set the inherited window synchronize-panes default; pane-level overrides determine effective synchronized input membership. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "Whether later pane input is duplicated.", - "type": "boolean" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] }, "windowId": { - "description": "Stable window ID.", - "maxLength": 512, - "type": "string" + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "windowId", - "enabled" + "changed" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set synchronized pane input" + "title": "Move window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": true, + "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "move_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "change" + "change", + "observe" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "show_environment", - "wireName": "show_environment", + "name": "paste_text", + "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2097 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 610 }, - "description": "Read global or session environment values. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste a block of text into exactly one pane through a tmux buffer. Use for multi-line text, or anything an editor would mangle if typed — bracketed paste stops auto-indent. Set enter to append a newline to that same private buffer. It refuses a target in a human-owned mode and never fans out to synchronized siblings. The temporary buffer is deleted afterwards; if cleanup fails, the result identifies what remains.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "Optional exact environment name.", - "maxLength": 256, - "type": "string" + "bracketed": { + "default": true, + "description": "Use bracketed paste.", + "type": "boolean" }, - "session": { - "description": "Optional session target.", - "maxLength": 512, + "enter": { + "default": false, + "description": "Append Enter to the same paste buffer.", + "type": "boolean" + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "text": { + "description": "The text to paste.", "type": "string" } }, - "required": [], + "required": [ + "text" + ], "type": "object" }, "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Show the tmux environment" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "process-environment" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "show_hooks", - "wireName": "show_hooks", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2136 - }, - "description": "Read configured hooks, optionally filtered by exact name. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, "properties": { - "name": { - "description": "Optional exact hook name.", - "maxLength": 256, + "changed": { "type": "string" }, - "target": { - "description": "Optional tmux target.", - "maxLength": 512, - "type": "string" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, - "required": [], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, + "required": [ + "changed" + ], "type": "object" }, "annotations": { @@ -53359,50 +56709,54 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show tmux hooks" + "title": "Paste text" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, "inputLiteralization": {}, "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, + "mayReturnUntrustedContent": false, + "name": "paste_text", "nestedAuthority": [], "outputClasses": [ - "configured-command" + "tmux-metadata" ], - "processReach": "none", + "processReach": "pane-input", "tmuxEffects": [ + "change", "observe" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "show_option", - "wireName": "show_option", + "name": "rename_session", + "wireName": "rename_session", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2072 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 588 }, - "description": "Read one exact option without accepting an option value. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "description": "Change tmux state; no client-supplied executable input. Rename a tmux session. Its id does not change, so anything holding one still works.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "name": { - "description": "Exact option name.", - "maxLength": 256, + "description": "The new session name.", "type": "string" }, - "target": { - "description": "Optional session, window, or pane target.", - "maxLength": 512, - "type": "string" + "session": { + "default": null, + "description": "A session id or name. Omit for the first session.", + "type": [ + "string", + "null" + ] } }, "required": [ @@ -53411,118 +56765,129 @@ "type": "object" }, "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Show a tmux option" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "configured-command" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "signal_channel", - "wireName": "signal_channel", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2496 - }, - "description": "Release or latch one named server-side channel. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, "properties": { - "channel": { - "description": "Bounded channel name.", - "maxLength": 256, + "changed": { "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "channel" + "changed" ], "type": "object" }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Signal a tmux channel" + "title": "Rename session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, + "inputLiteralization": { + "name": "double-hash-once" + }, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "rename_session", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ - "change" + "change", + "observe" ], "toolset": "manage" } } }, { - "name": "snapshot_pane", - "wireName": "snapshot_pane", + "name": "rename_window", + "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 1887 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 589 }, - "description": "Return pane metadata and visible terminal content from one call. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "description": "Change tmux state; no client-supplied executable input. Rename a tmux window. Its id does not change.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "Stable pane ID.", - "maxLength": 512, + "name": { + "description": "The new window name.", "type": "string" + }, + "windowId": { + "default": null, + "description": "A window id. Omit for this server's own window, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, "required": [ - "paneId" + "name" ], "type": "object" }, "outputSchema": { - "additionalProperties": true, + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], "type": "object" }, "annotations": { @@ -53530,76 +56895,110 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Snapshot a tmux pane" + "title": "Rename window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, + "inputLiteralization": { + "name": "double-hash-once" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "rename_window", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata", - "terminal-content" + "tmux-metadata" ], "processReach": "none", "tmuxEffects": [ + "change", "observe" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "split_window", - "wireName": "split_window", + "name": "resize_pane", + "wireName": "resize_pane", "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2622 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 594 }, - "description": "Create a configured-process pane; path data is literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", + "description": "Change tmux state; no client-supplied executable input. Resize a pane, or zoom it to fill its window. Widening a pane before reading it is the fix for output that comes back wrapped across rows.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "direction": { - "description": "vertical or horizontal.", - "maxLength": 16, - "type": "string" + "height": { + "default": null, + "description": "Rows. Omit to keep the current height.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] }, "paneId": { - "description": "Stable pane to split.", - "maxLength": 512, - "type": "string" + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] }, - "startDirectory": { - "description": "Literal pane start directory.", - "maxLength": 4096, - "type": "string" + "width": { + "default": null, + "description": "Columns. Omit to keep the current width.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "zoom": { + "default": false, + "description": "Zoom the pane.", + "type": "boolean" } }, - "required": [ - "paneId" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { "changed": { - "type": "boolean" - }, - "pane_id": { - "pattern": "^%[0-9]+$", "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "pane_id" + "changed" ], "type": "object" }, @@ -53608,1742 +57007,1117 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Split a tmux window" + "title": "Resize pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, + "inputLiteralization": {}, "mayExposeSecrets": false, "mayReturnUntrustedContent": false, + "name": "resize_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "processReach": "configured-process", + "processReach": "none", "tmuxEffects": [ - "observe", - "change" + "change", + "observe" ], - "toolset": "execute" + "toolset": "manage" } } - }, - { - "name": "swap_pane", - "wireName": "swap_pane", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2435 - }, - "description": "Exchange two pane positions without changing their IDs. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "sourcePaneId": { - "description": "Stable source pane ID.", - "maxLength": 512, - "type": "string" - }, - "targetPaneId": { - "description": "Stable target pane ID.", - "maxLength": 512, - "type": "string" - } - }, - "required": [ - "sourcePaneId", - "targetPaneId" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Swap two tmux panes" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "observe", - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "wait_for_channel", - "wireName": "wait_for_channel", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2476 - }, - "description": "Wait for a named server-side channel with an optional deadline. Change tmux state; no client-supplied executable input.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "description": "Bounded channel name.", - "maxLength": 256, - "type": "string" - }, - "timeoutMs": { - "description": "Optional bounded wait in milliseconds.", - "maximum": 60000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": true, - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Wait for a tmux channel" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": false, - "mayReturnUntrustedContent": false, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata" - ], - "processReach": "none", - "tmuxEffects": [ - "change" - ], - "toolset": "manage" - } - } - }, - { - "name": "wait_for_text", - "wireName": "wait_for_text", - "source": { - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "file": "apps/mcp/src/tool_catalog.cpp", - "line": 2006 - }, - "description": "Discount this server's pending input and recent submitted echoes; unmodelled keys stop tracking the current line. Wait for a new shell's prompt before typing. `matched_at_entry` reports visible text at entry; a mode ending in -unconfirmed identifies input that was still unconfirmed at the deadline. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "target": { - "description": "Pane ID or pane target.", - "maxLength": 512, - "type": "string" - }, - "text": { - "description": "Literal text to wait for.", - "maxLength": 4096, - "type": "string" - }, - "timeout_ms": { - "description": "Bounded wait in milliseconds.", - "maximum": 60000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "target", - "text" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "elapsed_ms": { - "minimum": 0, - "type": "integer" - }, - "matched": { - "type": "boolean" - }, - "matched_at_entry": { - "type": "boolean" - }, - "mode": { - "type": "string" - }, - "pane_id": { - "pattern": "^%[0-9]+$", - "type": "string" - }, - "text": { - "type": "string" - }, - "timed_out": { - "type": "boolean" - } - }, - "required": [ - "elapsed_ms", - "matched", - "matched_at_entry", - "mode", - "text", - "timed_out" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Wait for pane text" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "inputLiteralization": {}, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "nestedAuthority": [], - "outputClasses": [ - "tmux-metadata", - "terminal-content" - ], - "processReach": "none", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - } - ], - "wirePrefix": "", - "selectable": true, - "source": "apps/mcp/src", - "repo": "libtmux/libtmux-cxx", - "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", - "selection": { - "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" - }, - "protocol": { - "capabilities": { - "resources": { - "listChanged": false, - "subscribe": false - }, - "tools": {} - }, - "prompts": [], - "protocolVersion": "2025-11-25", - "resources": [ - { - "description": "The startup-frozen effective tool capability manifest.", - "mimeType": "application/json", - "name": "tmux-capabilities", - "title": "Effective tmux capabilities", - "uri": "tmux://capabilities" - } - ], - "resourceTemplates": [], - "serverInfo": { - "name": "libtmux-cxx", - "title": "libtmux C++ tmux server", - "version": "0.1.0-alpha.11" - } - } - }, - "swift": { - "tools": [ - "call_read_tools_batch", - "capture_pane", - "capture_since", - "clear_pane_scrollback", - "create_session", - "create_window", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "kill_pane", - "kill_session", - "kill_window", - "list_panes", - "list_sessions", - "list_windows", - "move_window", - "paste_text", - "rename_session", - "rename_window", - "resize_pane", - "resize_window", - "respawn_pane", - "run_shell_command", - "search_panes", - "select_layout", - "select_pane", - "select_window", - "send_keys", - "send_keys_batch", - "set_history_limit", - "set_mouse_enabled", - "set_pane_title", - "set_synchronize_panes", - "show_environment", - "show_hooks", - "show_option", - "signal_channel", - "snapshot_pane", - "split_window", - "swap_pane", - "wait_for_channel", - "wait_for_text" - ], - "registrations": [ - { - "name": "call_read_tools_batch", - "wireName": "call_read_tools_batch", - "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 3 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. Retained rows contain full nested envelopes; oversized results are marked resultTruncated, and the response stays below the 1,000,000-byte wire cap.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "onError": { - "description": "Caller-controlled onError.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "Caller-controlled operations.", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Caller-controlled end.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - }, - "joinWrapped": { - "description": "Caller-controlled joinWrapped.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "start": { - "description": "Caller-controlled start.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, - "type": "string" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "waitMs": { - "description": "Caller-controlled waitMs.", - "maximum": 10000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "corner": { - "description": "Caller-controlled corner.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "corner", - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "find_pane_by_position", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "get_pane_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "get_server_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "names": { - "description": "Caller-controlled names.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "type": "array" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "window": { - "description": "Caller-controlled window.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_windows", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "maxMatchesPerPane": { - "description": "Caller-controlled maxMatchesPerPane.", - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - "pattern": { - "description": "Caller-controlled pattern.", - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "Caller-controlled scrollbackLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "tool": { - "const": "search_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_environment", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_hooks", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "scope": { - "description": "Caller-controlled scope.", - "enum": [ - "server", - "global_session", - "global_window", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "Caller-controlled target.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "tool": { - "const": "show_option", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "snapshot_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - } - ] - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "failed": { - "type": "integer" - }, - "onError": { - "type": "string" - }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "index": { - "type": "integer" - }, - "result": { - "additionalProperties": false, - "properties": { - "content": { - "items": { - "additionalProperties": false, - "properties": { - "text": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "text", - "type" - ], - "type": "object" - }, - "type": "array" - }, - "isError": { - "type": "boolean" - }, - "structuredContent": {} - }, - "required": [ - "content", - "structuredContent", - "isError" - ], - "type": [ - "object", - "null" - ] - }, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "error", - "index", - "result", - "resultTruncated", - "success", - "tool" - ], - "type": "object" - }, - "type": "array" - }, - "stoppedAt": { - "type": [ - "integer", - "null" - ] - }, - "succeeded": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBytes": { - "type": "integer" - } - }, - "required": [ - "failed", - "onError", - "results", - "stoppedAt", - "succeeded", - "truncated", - "truncatedBytes" - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false, - "title": "Call read tools batch" - }, - "meta": { - "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. Retained rows contain full nested envelopes; oversized results are marked resultTruncated, and the response stays below the 1,000,000-byte wire cap.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "onError": { - "description": "Caller-controlled onError.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "Caller-controlled operations.", - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Caller-controlled end.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - }, - "joinWrapped": { - "description": "Caller-controlled joinWrapped.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "start": { - "description": "Caller-controlled start.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, - "type": "string" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "waitMs": { - "description": "Caller-controlled waitMs.", - "maximum": 10000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "capture_since", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "corner": { - "description": "Caller-controlled corner.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "corner", - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "find_pane_by_position", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "get_pane_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "get_server_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "tool": { - "const": "get_session_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "names": { - "description": "Caller-controlled names.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "type": "array" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "tool": { - "const": "get_tmux_variables", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "tool": { - "const": "get_window_info", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "window": { - "description": "Caller-controlled window.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_sessions", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_windows", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "maxMatchesPerPane": { - "description": "Caller-controlled maxMatchesPerPane.", - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - "pattern": { - "description": "Caller-controlled pattern.", - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "Caller-controlled scrollbackLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "tool": { - "const": "search_panes", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_environment", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "show_hooks", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "scope": { - "description": "Caller-controlled scope.", - "enum": [ - "server", - "global_session", - "global_window", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "Caller-controlled target.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "tool": { - "const": "show_option", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "tool": { - "const": "snapshot_pane", - "type": "string" - } - }, - "required": [ - "tool" - ], - "type": "object" - } - ] + }, + { + "name": "resize_window", + "wireName": "resize_window", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 593 + }, + "description": "Change tmux state; no client-supplied executable input. Resize a window to a width and height in cells; its panes resize with it. To resize one pane, use resize_pane.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "default": null, + "description": "Rows. Omit to keep the current height.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "width": { + "default": null, + "description": "Columns. Omit to keep the current width.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "windowId": { + "default": null, + "description": "A window id. Omit for this server's own window, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Resize window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "resize_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "respawn_pane", + "wireName": "respawn_pane", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 606 + }, + "description": "Start a pane's configured process; accepts no command payload. Only restarts a pane whose command has ALREADY EXITED. killExistingProcess overrides that and kills what is running first — an editor holding unsaved changes, a build part way through. It reruns the command the pane was created with rather than running something new.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "killExistingProcess": { + "default": false, + "description": "Kill the existing pane process first.", + "type": "boolean" + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "startDirectory": { + "default": null, + "description": "The literal starting directory. Omit for the directory the pane started in before.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Respawn pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "startDirectory": "double-hash-once" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "respawn_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "configured-process", + "tmuxEffects": [ + "change", + "delete", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "run_shell_command", + "wireName": "run_shell_command", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 607 + }, + "description": "Run a shell command in a pane with your user's permissions. Run a shell command in one pane, wait for it to finish, and report its singular real exit status and output. This is the tool for 'run X and tell me if it worked'. It reaches only the pane you name: the command travels through a tmux buffer, which synchronize-panes does not fan out, so the exit status is one pane's. Use send_keys when you want a synchronized cohort to receive input. Do NOT send keys and then poll a capture in a loop — this waits deterministically and costs one call. The command runs in a subshell, so cd and export do not persist. It refuses the named pane in a human-owned mode. Check linesMissed and anchorLost. A timed-out command MAY STILL BE RUNNING; inspect it and do not retry it — unless started is false, which means it never ran because something other than an idle shell was reading that pane's input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "command": { + "description": "The shell command.", + "type": "string" + }, + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "suppressHistory": { + "default": false, + "description": "Keep the command out of shell history on a best-effort basis.", + "type": "boolean" + }, + "timeoutSeconds": { + "default": null, + "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "command" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "anchorLost": { + "default": false, + "type": "boolean" + }, + "effectiveTimeoutSeconds": { + "type": "number" + }, + "elapsedSeconds": { + "type": "number" + }, + "exitStatus": { + "type": [ + "integer", + "null" + ] + }, + "linesMissed": { + "default": false, + "type": "boolean" + }, + "output": { + "properties": { + "droppedBytes": { + "type": "integer" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" }, - "maxItems": 16, - "minItems": 1, "type": "array" + }, + "truncated": { + "type": "boolean" } }, "required": [ - "operations" + "lines", + "truncated", + "droppedLines", + "droppedBytes" ], "type": "object" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "call_read_tools_batch", - "nestedAuthority": [ - "capture_pane", - "capture_since", - "find_pane_by_position", - "get_pane_info", - "get_server_info", - "get_session_info", - "get_tmux_variables", - "get_window_info", - "list_panes", - "list_sessions", - "list_windows", - "search_panes", - "show_environment", - "show_hooks", - "show_option", - "snapshot_pane" + "paneExited": { + "default": false, + "type": "boolean" + }, + "paneId": { + "type": "string" + }, + "started": { + "default": true, + "type": "boolean" + }, + "timedOut": { + "type": "boolean" + } + }, + "required": [ + "paneId", + "exitStatus", + "timedOut", + "output", + "elapsedSeconds", + "effectiveTimeoutSeconds" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Run shell command" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "run_shell_command", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "processReach": "pane-command", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "search_panes", + "wireName": "search_panes", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 579 + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Find which panes are showing text matching a regular expression. This is the tool for 'which pane has the error', 'where is the build running', or any question about what a pane CONTAINS — the list tools only see names and sizes.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "ignoreCase": { + "default": true, + "description": "Ignore case.", + "type": "boolean" + }, + "includeHistory": { + "default": false, + "description": "Search scrollback too.", + "type": "boolean" + }, + "maxMatchesPerPane": { + "default": 20, + "description": "Maximum matches per pane.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": "integer" + }, + "pattern": { + "description": "A linear-time regular expression, at most 999 UTF-8 bytes. .NET syntax without lookarounds, backreferences or atomic groups.", + "type": "string" + }, + "session": { + "default": null, + "description": "A session id or name. Omit for every session.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "panes": { + "items": { + "properties": { + "matches": { + "items": { + "properties": { + "row": { + "type": "integer" + }, + "text": { + "type": "string" + } + }, + "required": [ + "row", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "paneId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "paneId", + "windowId", + "sessionId", + "matches" + ], + "type": "object" + }, + "type": "array" + }, + "panesSearched": { + "type": "integer" + }, + "pattern": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "pattern", + "panesSearched", + "panes", + "truncated" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Search panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "search_panes", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "select_layout", + "wireName": "select_layout", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 592 + }, + "description": "Change tmux state; no client-supplied executable input. Arrange a window's panes with a named layout — even-horizontal, even-vertical, main-horizontal, main-vertical, tiled — or a layout string read from list_windows.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "default": null, + "description": "A supported layout name or layout string. Omit to reapply the window's last preset layout, if it has had one.", + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "description": "A window id. Omit for this server's own window, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select layout" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "select_layout", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" ], + "processReach": "none", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "select_pane", + "wireName": "select_pane", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 591 + }, + "description": "Change tmux state; no client-supplied executable input. Make a pane the active one in its window. This changes what a watching human sees; targeting a pane by id does not require selecting it first.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "A pane id.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "select_pane", + "nestedAuthority": [], "outputClasses": [ - "configured-command", - "process-environment", - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "failed": { - "type": "integer" - }, - "onError": { - "type": "string" + "processReach": "none", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "select_window", + "wireName": "select_window", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 590 + }, + "description": "Change tmux state; no client-supplied executable input. Make a window the current one in its session.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "A window id.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "select_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "send_keys", + "wireName": "send_keys", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 608 + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send raw keystrokes to a pane and return immediately. Use for driving an interactive program — a key in vim, a menu choice, Ctrl-C. Set literal=false to send named keys such as C-c, Escape or F5. It refuses the named pane in a human-owned mode and, when source input expands, every synchronized input cohort peer. To run a shell command and learn whether it worked, use run_shell_command instead; this reports nothing about what happens next. Tracks what it sends — including edits such as backspace, Ctrl-U or Ctrl-C — so wait_for_text can tell this pane's echo apart from real output for a short time afterward.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "default": false, + "description": "Press Enter after the keys.", + "type": "boolean" + }, + "keys": { + "description": "Text or a tmux key name.", + "type": "string" + }, + "literal": { + "default": true, + "description": "Treat keys as literal text.", + "type": "boolean" + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "suppressHistory": { + "default": false, + "description": "Keep text out of shell history on a best-effort basis.", + "type": "boolean" + } + }, + "required": [ + "keys" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { + "type": "string" + }, + "paneId": { + "type": "string" + }, + "targetPaneIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "changed", + "paneId", + "targetPaneIds" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Send keys" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "send_keys", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "pane-input", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "send_keys_batch", + "wireName": "send_keys_batch", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 609 + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send several keystrokes to one pane in order, in a single call. Use for a short interactive sequence — open a file, move, type, save — instead of one call per key. Each operation refuses the named pane in a human-owned mode and, when source input expands, every synchronized input cohort peer. A batch has at most 64 steps and 64 KiB of UTF-8 text. Each delay is 0-2000 ms and all delays together must fit the server wait ceiling.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "onError": { + "default": "stop", + "description": "Stop after the first failed operation, or continue serially.", + "enum": [ + "continue", + "stop" + ], + "type": "string" + }, + "operations": { + "description": "Between 1 and 64 bounded pane-input operations, executed serially.", + "items": { + "additionalProperties": false, + "properties": { + "delayMilliseconds": { + "default": null, + "maximum": 2000, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "enter": { + "default": false, + "type": "boolean" + }, + "keys": { + "type": "string" + }, + "literal": { + "default": true, + "type": "boolean" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "suppressHistory": { + "default": false, + "type": "boolean" + } }, - "results": { - "items": { - "additionalProperties": false, - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "index": { - "type": "integer" - }, - "result": { - "additionalProperties": false, - "properties": { - "content": { - "items": { - "additionalProperties": false, - "properties": { - "text": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "text", - "type" - ], - "type": "object" - }, - "type": "array" - }, - "isError": { - "type": "boolean" - }, - "structuredContent": {} - }, - "required": [ - "content", - "structuredContent", - "isError" - ], - "type": [ - "object", - "null" - ] - }, - "resultTruncated": { - "type": "boolean" - }, - "success": { - "type": "boolean" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "error", - "index", - "result", - "resultTruncated", - "success", - "tool" - ], - "type": "object" + "required": [ + "keys" + ], + "type": "object" + }, + "maxItems": 64, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "failed": { + "type": "integer" + }, + "onError": { + "type": "string" + }, + "results": { + "items": { + "properties": { + "error": { + "type": [ + "string", + "null" + ] }, - "type": "array" - }, - "stoppedAt": { - "type": [ - "integer", - "null" - ] - }, - "succeeded": { - "type": "integer" - }, - "truncated": { - "type": "boolean" + "index": { + "type": "integer" + }, + "paneId": { + "type": [ + "string", + "null" + ] + }, + "success": { + "type": "boolean" + }, + "targetPaneIds": { + "items": { + "type": "string" + }, + "type": "array" + } }, - "truncatedBytes": { - "type": "integer" - } + "required": [ + "index", + "paneId", + "success", + "error", + "targetPaneIds" + ], + "type": "object" }, - "required": [ - "failed", - "onError", - "results", - "stoppedAt", - "succeeded", - "truncated", - "truncatedBytes" - ], - "type": "object" + "type": "array" }, - "processReach": "none", - "title": "Call read tools batch", + "stoppedAt": { + "type": [ + "integer", + "null" + ] + }, + "succeeded": { + "type": "integer" + } + }, + "required": [ + "results", + "succeeded", + "failed", + "stoppedAt", + "onError" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Send keys batch" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "send_keys_batch", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "pane-input", "tmuxEffects": [ + "change", "observe" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "capture_pane", - "wireName": "capture_pane", + "name": "set_history_limit", + "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 4 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 601 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return a bounded slice of rendered pane text.", + "description": "Change tmux state; no client-supplied executable input. Set how many scrollback lines tmux keeps. This is a SESSION option, so it covers every window in the session rather than one pane, and the session must be named because the call can destroy data. Raise it before starting something that prints a lot: no capture can return lines tmux has already discarded. LOWERING it discards the excess from every pane immediately, and the result says how many lines went; raising the limit again does not bring them back.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "end": { - "description": "Caller-controlled end.", - "maximum": 32767, + "lines": { + "description": "The scrollback line limit.", + "maximum": 2147483647, "minimum": -2147483648, "type": "integer" }, - "joinWrapped": { - "description": "Caller-controlled joinWrapped.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", + "session": { + "description": "A session id such as $0, or its name.", "type": "string" - }, - "start": { - "description": "Caller-controlled start.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" } }, "required": [ - "paneId" + "lines", + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" + "changed": { + "type": "string" }, "paneId": { - "type": "string" + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "droppedLines", - "lines", - "paneId" + "changed" ], "type": "object" }, @@ -55352,172 +58126,266 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Capture pane" + "title": "Set history limit" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return a bounded slice of rendered pane text.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Caller-controlled end.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - }, - "joinWrapped": { - "description": "Caller-controlled joinWrapped.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "start": { - "description": "Caller-controlled start.", - "maximum": 32767, - "minimum": -2147483648, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_pane", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "set_history_limit", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "droppedLines", - "lines", - "paneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Capture pane", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "capture_since", - "wireName": "capture_since", + "name": "set_mouse_enabled", + "wireName": "set_mouse_enabled", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 5 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 600 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return output after an opaque pane cursor.", + "description": "Change tmux state; no client-supplied executable input. Turn tmux mouse support on or off. This sets the global option, so it applies to every session on this server and changes what a human watching can do with their mouse.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, + "enabled": { + "description": "Whether mouse support is enabled globally.", + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { "type": "string" }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set mouse enabled" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "set_mouse_enabled", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_pane_title", + "wireName": "set_pane_title", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 597 + }, + "description": "Change tmux state; no client-supplied executable input. Set a pane's title. Useful for labelling panes you created so a human watching can tell which is which.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] }, - "waitMs": { - "description": "Caller-controlled waitMs.", - "maximum": 10000, - "minimum": 0, - "type": "integer" + "title": { + "description": "The literal pane title.", + "type": "string" } }, "required": [ - "paneId" + "title" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "cursor": { + "changed": { "type": "string" }, - "droppedLines": { - "type": "integer" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] }, - "linesMissed": { + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "changed" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set pane title" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "title": "double-hash-once" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "set_pane_title", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_synchronize_panes", + "wireName": "set_synchronize_panes", + "source": { + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 611 + }, + "description": "Change tmux state; no client-supplied executable input. Turn synchronize-panes on or off for a window. Input typed into one of its panes then reaches the synchronized input cohort: every pane whose effective synchronize-panes setting is on. A pane without a setting of its own follows the window; one with its own setting stays included or excluded either way.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "description": "Whether to set this window's inherited synchronize-panes default. Pane overrides can still include or exclude individual panes.", "type": "boolean" }, - "pane": { + "windowId": { + "default": null, + "description": "A window id. Omit for this server's own window, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "changed": { "type": "string" }, - "paneRef": { - "type": "string" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] }, - "restarted": { - "type": "boolean" + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "cursor", - "droppedLines", - "lines", - "linesMissed", - "pane", - "paneRef", - "restarted" + "changed" ], "type": "object" }, @@ -55526,143 +58394,99 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Capture since" + "title": "Set synchronize panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return output after an opaque pane cursor.", + "amplifiesFutureInput": true, "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, - "type": "string" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "waitMs": { - "description": "Caller-controlled waitMs.", - "maximum": 10000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "capture_since", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "set_synchronize_panes", "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "type": "string" - }, - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "linesMissed": { - "type": "boolean" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "restarted": { - "type": "boolean" - } - }, - "required": [ - "cursor", - "droppedLines", - "lines", - "linesMissed", - "pane", - "paneRef", - "restarted" - ], - "type": "object" - }, "processReach": "none", - "title": "Capture since", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "clear_pane_scrollback", - "wireName": "clear_pane_scrollback", + "name": "show_environment", + "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 47 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 584 }, - "description": "Delete tmux state; accepts no command payload. Irreversibly discard retained scrollback for one pane.", + "description": "Read the tmux environment; accepts no client-supplied executable input. A listing answers names without values, and a named variable is still withheld when the name reads as a credential. Read what a NEW pane will inherit, at the server or session level — not what an already-running shell has.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" + "name": { + "default": null, + "description": "One variable name, which answers its value. Omit for every name with hasValue instead of values.", + "type": [ + "string", + "null" + ] + }, + "session": { + "default": null, + "description": "A session id or name. Omit for the server environment.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "paneId" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "deleted": { - "type": "boolean" - }, - "paneId": { - "type": "string" + "result": { + "items": { + "properties": { + "hasValue": { + "type": "boolean" + }, + "isRemoved": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ] + }, + "withheld": { + "type": "boolean" + } + }, + "required": [ + "name", + "value", + "isRemoved", + "hasValue", + "withheld" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "deleted", - "paneId" + "result" ], "type": "object" }, @@ -55671,136 +58495,101 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Clear pane scrollback" + "title": "Show environment" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Irreversibly discard retained scrollback for one pane.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "clear_pane_scrollback", + "mayReturnUntrustedContent": false, + "name": "show_environment", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "process-environment" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "deleted", - "paneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Clear pane scrollback", "tmuxEffects": [ - "delete" + "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "create_session", - "wireName": "create_session", + "name": "show_hooks", + "wireName": "show_hooks", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 37 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 585 }, - "description": "Start a pane's configured process; accepts no command payload. Create a detached session with a configured pane process.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read the hooks tmux will run on its own events. Read-only on purpose: a hook written here would outlive this conversation and keep firing with nobody left who knows why. Put hooks you want to keep in your tmux config file.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" + "paneId": { + "default": null, + "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] }, - "windowName": { - "description": "Caller-controlled windowName.", + "scope": { + "default": "Session", + "description": "Server, Session, Window, or Pane.", + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], "type": "string" } }, - "required": [ - "name" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" + "result": { + "items": { + "properties": { + "command": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "scope": { + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], + "type": "string" + } + }, + "required": [ + "name", + "index", + "command", + "scope" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" + "result" ], "type": "object" }, @@ -55809,185 +58598,111 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Create session" + "title": "Show hooks" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Create a detached session with a configured pane process.", - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once", - "windowName": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" - }, - "windowName": { - "description": "Caller-controlled windowName.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "mayExposeSecrets": true, + "inputLiteralization": {}, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "create_session", + "name": "show_hooks", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" - } - }, - "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Create session", + "processReach": "none", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "create_window", - "wireName": "create_window", + "name": "show_option", + "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 38 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 583 }, - "description": "Start a pane's configured process; accepts no command payload. Create a window with a configured pane process.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read tmux options at the server, session, window or pane level. Values set at a wider scope are included and marked inherited, because that is where nearly all tmux configuration lives. Omit the name to list them all. Reading history-limit before a long tail tells you how much output the pane can hold before it starts dropping lines.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { "name": { - "description": "Caller-controlled name.", + "description": "The option name.", "type": "string" }, - "session": { - "description": "Caller-controlled session.", - "type": "string" + "paneId": { + "default": null, + "description": "The pane whose scope is read. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", + "scope": { + "default": "Pane", + "description": "Server, Session, Window, or Pane.", + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], "type": "string" } }, "required": [ - "session" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "linkRef": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { - "type": "integer" - }, - "sessionID": { - "type": "string" - }, - "target": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowRef": { - "type": "string" + "name" + ], + "type": "object" + }, + "outputSchema": { + "properties": { + "result": { + "items": { + "properties": { + "inherited": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "scope": { + "enum": [ + "Server", + "Session", + "Window", + "Pane" + ], + "type": "string" + }, + "value": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "value", + "scope", + "inherited" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "height", - "id", - "index", - "isActive", - "linkRef", - "name", - "paneCount", - "sessionID", - "target", - "width", - "windowRef" + "result" ], "type": "object" }, @@ -55996,226 +58711,82 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Create window" + "title": "Show option" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Create a window with a configured pane process.", - "inputLiteralization": { - "name": "double-hash-once", - "startDirectory": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "mayExposeSecrets": true, + "inputLiteralization": {}, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "create_window", + "name": "show_option", "nestedAuthority": [], "outputClasses": [ + "configured-command", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "linkRef": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { - "type": "integer" - }, - "sessionID": { - "type": "string" - }, - "target": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowRef": { - "type": "string" - } - }, - "required": [ - "height", - "id", - "index", - "isActive", - "linkRef", - "name", - "paneCount", - "sessionID", - "target", - "width", - "windowRef" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Create window", + "processReach": "none", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "find_pane_by_position", - "wireName": "find_pane_by_position", + "name": "signal_channel", + "wireName": "signal_channel", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 6 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 599 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find a pane occupying a named window corner.", + "description": "Change tmux state; no client-supplied executable input. Signal a tmux wait-for channel, releasing whatever waits on it. The channel latches: signalling before anyone waits still satisfies the next wait, so a handoff cannot be lost to a race.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "corner": { - "description": "Caller-controlled corner.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", + "channel": { + "description": "The tmux wait-for channel.", "type": "string" } }, "required": [ - "corner", - "windowId" + "channel" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "pane" + "changed" ], "type": "object" }, @@ -56224,243 +58795,206 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Find pane by position" + "title": "Signal channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find a pane occupying a named window corner.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "corner": { - "description": "Caller-controlled corner.", - "enum": [ - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "corner", - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "find_pane_by_position", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "signal_channel", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, "processReach": "none", - "title": "Find pane by position", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "get_pane_info", - "wireName": "get_pane_info", + "name": "snapshot_pane", + "wireName": "snapshot_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 7 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 578 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one pane.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Read a pane's visible content together with its cursor position, size and running command, in one call. Prefer this over capture_pane plus list_panes: it is one round trip and the cursor is guaranteed to describe the text returned with it.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "maxLines": { + "default": null, + "description": "Maximum returned lines, newest kept. Omit for the server default, 500 unless LIBTMUX_MCP_MAX_LINES sets another.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] } }, - "required": [ - "paneId" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { + "alternateScreen": { + "type": "boolean" + }, + "content": { + "properties": { + "droppedBytes": { + "type": "integer" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "lines", + "truncated", + "droppedLines", + "droppedBytes" + ], + "type": "object" + }, + "cursorX": { + "type": [ + "integer", + "null" + ] + }, + "cursorY": { + "type": [ + "integer", + "null" + ] + }, "pane": { - "additionalProperties": false, "properties": { + "active": { + "type": "boolean" + }, "currentCommand": { - "type": "string" + "type": [ + "string", + "null" + ] }, "currentPath": { - "type": "string" + "type": [ + "string", + "null" + ] + }, + "dead": { + "type": "boolean" }, "height": { "type": "integer" }, - "id": { - "type": "string" + "historyLimit": { + "type": [ + "integer", + "null" + ] + }, + "historySize": { + "type": [ + "integer", + "null" + ] }, "index": { "type": "integer" }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { + "inMode": { "type": "boolean" }, - "isDead": { + "isCaller": { "type": "boolean" }, - "isSynchronized": { - "type": "boolean" + "paneId": { + "type": "string" }, - "modeCount": { - "type": "integer" + "pid": { + "type": [ + "integer", + "null" + ] }, - "ref": { + "sessionId": { "type": "string" }, + "title": { + "type": [ + "string", + "null" + ] + }, "width": { "type": "integer" }, - "windowID": { + "windowId": { "type": "string" + }, + "zoomed": { + "type": "boolean" } }, "required": [ - "currentCommand", - "currentPath", - "height", - "id", + "paneId", + "windowId", + "sessionId", "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", "width", - "windowID" + "height", + "title", + "active", + "dead", + "zoomed", + "inMode", + "currentCommand", + "currentPath", + "pid", + "historySize", + "historyLimit", + "isCaller" ], "type": "object" } }, "required": [ - "pane" + "pane", + "content", + "cursorX", + "cursorY", + "alternateScreen" ], "type": "object" }, @@ -56469,122 +59003,22 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get pane info" + "title": "Snapshot pane" }, "meta": { + "anthropic/alwaysLoad": true, "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one pane.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "get_pane_info", + "name": "snapshot_pane", "nestedAuthority": [], "outputClasses": [ + "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "pane": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - } - }, - "required": [ - "pane" - ], - "type": "object" - }, "processReach": "none", - "title": "Get pane info", "tmuxEffects": [ "observe" ], @@ -56593,38 +59027,89 @@ } }, { - "name": "get_server_info", - "wireName": "get_server_info", + "name": "split_window", + "wireName": "split_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 8 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 605 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return liveness and identity metadata for the selected tmux server.", + "description": "Start a pane's configured process; accepts no command payload. Split a pane and return the NEW pane's id. Use that id for what you put in it — pane ids stay valid across layout changes, where window names and indexes do not.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": {}, - "required": [], + "properties": { + "direction": { + "default": "Below", + "description": "Below, Above, Left, or Right.", + "enum": [ + "Above", + "Below", + "Left", + "Right" + ], + "type": "string" + }, + "paneId": { + "default": null, + "description": "The pane to split. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "percentage": { + "default": null, + "description": "Percentage of the space for the new pane. Omit for half.", + "maximum": 2147483647, + "minimum": -2147483648, + "type": [ + "integer", + "null" + ] + }, + "startDirectory": { + "default": null, + "description": "The literal starting directory. Omit for the MCP server's own working directory.", + "type": [ + "string", + "null" + ] + } + }, "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "running": { - "type": "boolean" - }, - "socketPath": { + "changed": { "type": "string" }, - "version": { - "type": "string" + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "running" + "changed" ], "type": "object" }, @@ -56633,122 +59118,99 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get server info" + "title": "Split window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return liveness and identity metadata for the selected tmux server.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" + "inputLiteralization": { + "startDirectory": "double-hash-once" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_server_info", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "split_window", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "running": { - "type": "boolean" - }, - "socketPath": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "required": [ - "running" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get server info", + "processReach": "configured-process", "tmuxEffects": [ + "change", "observe" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "get_session_info", - "wireName": "get_session_info", + "name": "swap_pane", + "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 9 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 596 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session.", + "description": "Change tmux state; no client-supplied executable input. Swap two panes' positions; each keeps its program, its content and its ID.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "Caller-controlled session.", + "detach": { + "default": false, + "description": "Leave the swapped pane unselected.", + "type": "boolean" + }, + "keepZoom": { + "default": false, + "description": "Keep zoom state.", + "type": "boolean" + }, + "paneId": { + "description": "The pane id to swap.", + "type": "string" + }, + "targetPaneId": { + "description": "The other pane id.", "type": "string" } }, "required": [ - "session" + "paneId", + "targetPaneId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "session": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" - } - }, - "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" - ], - "type": "object" + "changed": { + "type": "string" + }, + "paneId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "sessionId": { + "default": null, + "type": [ + "string", + "null" + ] + }, + "windowId": { + "default": null, + "type": [ + "string", + "null" + ] } }, "required": [ - "session" + "changed" ], "type": "object" }, @@ -56757,138 +59219,85 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get session info" + "title": "Swap pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_session_info", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "swap_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" - } - }, - "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" - ], - "type": "object" - } - }, - "required": [ - "session" - ], - "type": "object" - }, "processReach": "none", - "title": "Get session info", "tmuxEffects": [ + "change", "observe" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "get_tmux_variables", - "wireName": "get_tmux_variables", + "name": "wait_for_channel", + "wireName": "wait_for_channel", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 10 - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated variable names without accepting raw format syntax.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "names": { - "description": "Caller-controlled names.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "type": "array" - }, - "paneId": { - "description": "Caller-controlled paneId.", + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 598 + }, + "description": "Change tmux state; no client-supplied executable input. Block until something signals a tmux wait-for channel with 'tmux wait-for -S '. Use when you composed a shell command that signals it. For an ordinary command whose completion you want, run_shell_command already does this and also reports the exit status.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "The tmux wait-for channel.", "type": "string" + }, + "timeoutSeconds": { + "default": null, + "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", + "type": [ + "number", + "null" + ] } }, "required": [ - "names" + "channel" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "values": { - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "type": "object" + "changed": { + "type": "string" + }, + "channel": { + "type": "string" + }, + "effectiveTimeoutSeconds": { + "type": "number" + }, + "elapsedSeconds": { + "type": "number" + }, + "signalled": { + "type": "boolean" } }, "required": [ - "values" + "changed", + "channel", + "signalled", + "elapsedSeconds", + "effectiveTimeoutSeconds" ], "type": "object" }, @@ -56897,177 +59306,168 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get tmux variables" + "title": "Wait for channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated variable names without accepting raw format syntax.", - "inputLiteralization": { - "names": "validated-variable-name" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "names": { - "description": "Caller-controlled names.", - "items": { - "pattern": "^[A-Za-z][A-Za-z0-9_]*$", - "type": "string" - }, - "maxItems": 32, - "type": "array" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "names" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "get_tmux_variables", + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "name": "wait_for_channel", "nestedAuthority": [], "outputClasses": [ - "configured-command", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "values": { - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "type": "object" - } - }, - "required": [ - "values" - ], - "type": "object" - }, "processReach": "none", - "title": "Get tmux variables", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "get_window_info", - "wireName": "get_window_info", + "name": "wait_for_text", + "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 11 + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "file": "src/LibTmux.Mcp/Policy/CapabilityModel.cs", + "line": 581 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait until a pane prints something matching one of these patterns, then return. Use for output you did NOT start — a server's ready line, another process's progress, a person typing. A matching pattern already on screen returns PresentAtEntry. For a command you are running yourself, run_shell_command is better: it reports the real exit status instead of guessing from text. Never poll capture_pane in a loop; this call does the waiting. Control observation is required by default; pollingFallback reports activation when the operator permits fallback. Text this server itself typed is discounted while deciding what is new, for a few seconds after it is sent or submitted, so its own echo cannot be the match — except on a pane whose program has not yet configured its terminal; wait for a first prompt before typing into a freshly created pane.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" + "ignoreCase": { + "default": true, + "description": "Ignore case.", + "type": "boolean" + }, + "paneId": { + "default": null, + "description": "A pane id. Omit for this server's own pane, or else the one the first session shows.", + "type": [ + "string", + "null" + ] + }, + "patterns": { + "default": null, + "description": "Linear-time regular expressions that end the wait successfully: .NET syntax without lookarounds, backreferences or atomic groups. Output arriving after this call counts unless the pattern is already present, which returns PresentAtEntry. Omit to return on any new output. Across both pattern lists: at most 32 entries and 16384 UTF-8 bytes; each entry is at most 999 UTF-8 bytes.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": [ + "array", + "null" + ] + }, + "stopPatterns": { + "default": null, + "description": "Linear-time regular expressions that stop the wait, in the same subset as patterns. Omit for none. Across both pattern lists: at most 32 entries and 16384 UTF-8 bytes; each entry is at most 999 UTF-8 bytes.", + "items": { + "type": [ + "string", + "null" + ] + }, + "type": [ + "array", + "null" + ] + }, + "timeoutSeconds": { + "default": null, + "description": "Seconds to wait, lowered to the server's ceiling. Omit to wait the whole ceiling, 30 unless LIBTMUX_MCP_WAIT_MAX_SECONDS sets another.", + "type": [ + "number", + "null" + ] } }, - "required": [ - "windowId" - ], "type": "object" }, "outputSchema": { - "additionalProperties": false, "properties": { - "placements": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "ref": { - "type": "string" - }, - "sessionID": { - "type": "string" - }, - "target": { - "type": "string" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "index", - "isActive", - "ref", - "sessionID", - "target", - "windowID" - ], - "type": "object" - }, - "type": "array" + "anchorLost": { + "type": "boolean" }, - "window": { - "additionalProperties": false, + "effectiveTimeoutSeconds": { + "type": "number" + }, + "elapsedSeconds": { + "type": "number" + }, + "eventsDropped": { + "type": "integer" + }, + "linesMissed": { + "type": "boolean" + }, + "matchedPattern": { + "type": [ + "string", + "null" + ] + }, + "outcome": { + "enum": [ + "Matched", + "AnyOutput", + "Stopped", + "Timeout", + "PaneDied", + "PresentAtEntry" + ], + "type": "string" + }, + "paneId": { + "type": "string" + }, + "pollingFallback": { + "type": "boolean" + }, + "tail": { "properties": { - "height": { + "droppedBytes": { "type": "integer" }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { + "droppedLines": { "type": "integer" }, - "ref": { - "type": "string" + "lines": { + "items": { + "type": "string" + }, + "type": "array" }, - "width": { - "type": "integer" + "truncated": { + "type": "boolean" } }, "required": [ - "height", - "id", - "name", - "paneCount", - "ref", - "width" + "lines", + "truncated", + "droppedLines", + "droppedBytes" ], "type": "object" } }, "required": [ - "placements", - "window" + "paneId", + "outcome", + "matchedPattern", + "tail", + "elapsedSeconds", + "effectiveTimeoutSeconds" ], "type": "object" }, @@ -57076,168 +59476,608 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Get window info" + "title": "Wait for text" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "get_window_info", + "name": "wait_for_text", "nestedAuthority": [], "outputClasses": [ + "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "placements": { - "items": { + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + } + ], + "wirePrefix": "", + "selectable": true, + "source": "src/LibTmux.Mcp/Policy", + "repo": "libtmux/libtmux-dotnet", + "revision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "extractedRevision": "ec8b6ab2a4f65e23664f43fba538ba200d4ae8bc", + "selection": { + "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" + }, + "protocol": { + "capabilities": { + "extensions": { + "io.modelcontextprotocol/tasks": {} + }, + "logging": {}, + "resources": { + "listChanged": true + }, + "tools": { + "listChanged": true + } + }, + "prompts": [], + "protocolVersion": "2025-11-25", + "resources": [ + { + "description": "The startup-frozen tmux connection and effective MCP tool capabilities.", + "mimeType": "application/json", + "name": "tmux_capabilities", + "title": "Effective tmux capabilities", + "uri": "tmux://capabilities" + } + ], + "resourceTemplates": [], + "serverInfo": { + "name": "tmux", + "version": "0.0.0-alpha.20" + } + } + }, + "cxx": { + "tools": [ + "call_read_tools_batch", + "capture_pane", + "capture_since", + "clear_pane_scrollback", + "create_session", + "create_window", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "kill_pane", + "kill_session", + "kill_window", + "list_panes", + "list_sessions", + "list_windows", + "move_window", + "paste_text", + "rename_session", + "rename_window", + "resize_pane", + "resize_window", + "respawn_pane", + "run_shell_command", + "search_panes", + "select_layout", + "select_pane", + "select_window", + "send_keys", + "send_keys_batch", + "set_history_limit", + "set_mouse_enabled", + "set_pane_title", + "set_synchronize_panes", + "show_environment", + "show_hooks", + "show_option", + "signal_channel", + "snapshot_pane", + "split_window", + "swap_pane", + "wait_for_channel", + "wait_for_text" + ], + "registrations": [ + { + "name": "call_read_tools_batch", + "wireName": "call_read_tools_batch", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2162 + }, + "description": "Run up to sixteen declared inspect operations serially under this one call; inner operations receive no separate approval. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "onError": { + "description": "Stop after the first failed operation or continue.", + "enum": [ + "continue", + "stop" + ], + "type": "string" + }, + "operations": { + "description": "One to sixteen typed inspect-tool operations.", + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "history": { + "description": "Capture retained history as well as the visible pane.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "Previously returned byte cursor.", + "minimum": 0, + "type": "integer" + }, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_since", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { "additionalProperties": false, "properties": { - "index": { - "type": "integer" + "arguments": { + "additionalProperties": false, + "properties": { + "column": { + "description": "Zero-based terminal column.", + "minimum": 0, + "type": "integer" + }, + "row": { + "description": "Zero-based terminal row.", + "minimum": 0, + "type": "integer" + }, + "windowId": { + "description": "Optional stable window ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "row", + "column" + ], + "type": "object" }, - "isActive": { - "type": "boolean" + "tool": { + "const": "find_pane_by_position", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, - "ref": { + "tool": { + "const": "get_pane_info", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" }, - "sessionID": { + "tool": { + "const": "get_server_info", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" }, - "target": { + "tool": { + "const": "get_session_info", "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "names": { + "description": "One to thirty-two validated tmux variable names.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" + }, + "paneId": { + "description": "Optional pane context.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" }, - "windowID": { + "tool": { + "const": "get_tmux_variables", "type": "string" } }, "required": [ - "index", - "isActive", - "ref", - "sessionID", - "target", - "windowID" + "tool" ], "type": "object" }, - "type": "array" - }, - "window": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "Stable window ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "type": "string" + } }, - "id": { - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_panes", + "type": "string" + } }, - "name": { - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_sessions", + "type": "string" + } }, - "paneCount": { - "type": "integer" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "list_windows", + "type": "string" + } }, - "ref": { - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Bounded regular expression.", + "maxLength": 256, + "type": "string" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "type": "string" + } }, - "width": { - "type": "integer" - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "height", - "id", - "name", - "paneCount", - "ref", - "width" - ], - "type": "object" - } + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Optional exact environment name.", + "maxLength": 256, + "type": "string" + }, + "session": { + "description": "Optional session target.", + "maxLength": 512, + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_environment", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Optional exact hook name.", + "maxLength": 256, + "type": "string" + }, + "target": { + "description": "Optional tmux target.", + "maxLength": 512, + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_hooks", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Exact option name.", + "maxLength": 256, + "type": "string" + }, + "target": { + "description": "Optional session, window, or pane target.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] }, - "required": [ - "placements", - "window" - ], - "type": "object" - }, - "processReach": "none", - "title": "Get window info", - "tmuxEffects": [ - "observe" - ], - "toolset": "inspect" - } - } - }, - { - "name": "kill_pane", - "wireName": "kill_pane", - "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 48 - }, - "description": "Delete tmux state; accepts no command payload. Delete one pane and its running process.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" + "maxItems": 16, + "minItems": 1, + "type": "array" } }, "required": [ - "paneId" + "operations" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "deleted", - "paneId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -57245,111 +60085,90 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill pane" + "title": "Call read tools as a batch" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Delete one pane and its running process.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "kill_pane", - "nestedAuthority": [], + "nestedAuthority": [ + "capture_pane", + "capture_since", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "list_panes", + "list_sessions", + "list_windows", + "search_panes", + "show_environment", + "show_hooks", + "show_option", + "snapshot_pane" + ], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content", + "process-environment", + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "deleted", - "paneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Kill pane", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "kill_session", - "wireName": "kill_session", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 49 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1836 }, - "description": "Delete tmux state; accepts no command payload. Delete one session and every window it owns.", + "description": "Return visible text, or retained history when requested. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "force": { - "description": "Caller-controlled force.", + "history": { + "description": "Capture retained history as well as the visible pane.", "type": "boolean" }, - "session": { - "description": "Caller-controlled session.", + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "session" + "paneId" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "deleted": { - "type": "boolean" + "pane_id": { + "pattern": "^%[0-9]+$", + "type": "string" }, - "sessionId": { + "text": { "type": "string" } }, "required": [ - "deleted", - "sessionId" + "pane_id", + "text" ], "type": "object" }, @@ -57358,112 +60177,60 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill session" + "title": "Capture a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Delete one session and every window it owns.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "session" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "kill_session", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "deleted", - "sessionId" - ], - "type": "object" - }, "processReach": "none", - "title": "Kill session", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "kill_window", - "wireName": "kill_window", + "name": "capture_since", + "wireName": "capture_since", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 50 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1858 }, - "description": "Delete tmux state; accepts no command payload. Delete one window and every pane it owns.", + "description": "Return bytes after a bounded client cursor and a replacement cursor. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" + "cursor": { + "description": "Previously returned byte cursor.", + "minimum": 0, + "type": "integer" }, - "windowId": { - "description": "Caller-controlled windowId.", + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "windowId" + "paneId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "deleted", - "windowId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -57471,178 +60238,55 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Kill window" + "title": "Capture new pane output" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Delete tmux state; accepts no command payload. Delete one window and every pane it owns.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "kill_window", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "deleted", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Kill window", "tmuxEffects": [ - "delete", "observe" ], - "toolset": "teardown" + "toolset": "inspect" } } }, { - "name": "list_panes", - "wireName": "list_panes", + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 12 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3145 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List panes, optionally within a session or window.", + "description": "Irreversibly discard retained scrollback for one pane. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "window": { - "description": "Caller-controlled window.", + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, - "required": [], + "required": [ + "paneId" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "panes" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -57650,193 +60294,86 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List panes" + "title": "Clear tmux pane scrollback" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List panes, optionally within a session or window.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "window": { - "description": "Caller-controlled window.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_panes", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "panes" - ], - "type": "object" - }, "processReach": "none", - "title": "List panes", "tmuxEffects": [ - "observe" + "delete" ], - "toolset": "inspect" + "toolset": "teardown" } } }, { - "name": "list_sessions", - "wireName": "list_sessions", + "name": "create_session", + "wireName": "create_session", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 13 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2543 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List sessions on the selected server.", + "description": "Create a detached session; names and path data are literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "outputSchema": { "additionalProperties": false, "properties": { - "sessions": { - "items": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" - } - }, - "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" - ], - "type": "object" - }, - "type": "array" + "height": { + "description": "Optional detached height.", + "maximum": 100000, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "Optional literal unique session name.", + "maxLength": 512, + "type": "string" + }, + "startDirectory": { + "description": "Literal pane start directory.", + "maxLength": 4096, + "type": "string" + }, + "width": { + "description": "Optional detached width.", + "maximum": 100000, + "minimum": 1, + "type": "integer" + }, + "windowName": { + "description": "Optional literal first window name.", + "maxLength": 512, + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "session_id": { + "pattern": "^\\$[0-9]+$", + "type": "string" } }, "required": [ - "sessions" + "name", + "session_id" ], "type": "object" }, @@ -57845,169 +60382,82 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List sessions" + "title": "Create a tmux session" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List sessions on the selected server.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once", + "windowName": "double-hash-once" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_sessions", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "sessions": { - "items": { - "additionalProperties": false, - "properties": { - "createdAt": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "isAttached": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "ref": { - "type": "string" - }, - "windowCount": { - "type": "integer" - } - }, - "required": [ - "createdAt", - "id", - "isAttached", - "name", - "ref", - "windowCount" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "sessions" - ], - "type": "object" - }, - "processReach": "none", - "title": "List sessions", + "processReach": "configured-process", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "list_windows", - "wireName": "list_windows", + "name": "create_window", + "wireName": "create_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 14 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2587 }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List windows, optionally within one session.", + "description": "Create a detached window; name and path data are literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "name": { + "description": "Optional literal window name.", + "maxLength": 512, + "type": "string" + }, "session": { - "description": "Caller-controlled session.", + "description": "Stable owning session ID or name.", + "maxLength": 512, + "type": "string" + }, + "startDirectory": { + "description": "Literal pane start directory.", + "maxLength": 4096, "type": "string" } }, - "required": [], + "required": [ + "session" + ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "linkRef": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { - "type": "integer" - }, - "sessionID": { - "type": "string" - }, - "target": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowRef": { - "type": "string" - } - }, - "required": [ - "height", - "id", - "index", - "isActive", - "linkRef", - "name", - "paneCount", - "sessionID", - "target", - "width", - "windowRef" - ], - "type": "object" - }, - "type": "array" + "session_id": { + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "window_id": { + "pattern": "^@[0-9]+$", + "type": "string" } }, "required": [ - "windows" + "session_id", + "window_id" ], "type": "object" }, @@ -58016,307 +60466,226 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "List windows" + "title": "Create a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Inspect tmux metadata; accepts no client-supplied executable input. List windows, optionally within one session.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "list_windows", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "windows": { - "items": { - "additionalProperties": false, - "properties": { - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "linkRef": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { - "type": "integer" - }, - "sessionID": { - "type": "string" - }, - "target": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowRef": { - "type": "string" - } - }, - "required": [ - "height", - "id", - "index", - "isActive", - "linkRef", - "name", - "paneCount", - "sessionID", - "target", - "width", - "windowRef" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "windows" - ], - "type": "object" - }, - "processReach": "none", - "title": "List windows", + "processReach": "configured-process", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "move_window", - "wireName": "move_window", + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 22 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1951 }, - "description": "Change tmux state; no client-supplied executable input. Move one window appearance to another session.", + "description": "Resolve coordinates using fixed tmux layout fields. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "index": { - "description": "Caller-controlled index.", + "column": { + "description": "Zero-based terminal column.", "minimum": 0, "type": "integer" }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "sourceIndex": { - "description": "Caller-controlled sourceIndex.", + "row": { + "description": "Zero-based terminal row.", "minimum": 0, "type": "integer" }, - "sourceSession": { - "description": "Caller-controlled sourceSession.", - "type": "string" - }, "windowId": { - "description": "Caller-controlled windowId.", + "description": "Optional stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "windowId" + "row", + "column" ], "type": "object" }, "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Find a pane by position" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_pane_info", + "wireName": "get_pane_info", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1823 + }, + "description": "Return one pane by stable ID. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "target": { - "type": "string" - }, - "windowId": { + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "target", - "windowId" + "paneId" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Move window" + "title": "Get tmux pane information" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Move one window appearance to another session.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "index": { - "description": "Caller-controlled index.", - "minimum": 0, - "type": "integer" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - }, - "sourceIndex": { - "description": "Caller-controlled sourceIndex.", - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Caller-controlled sourceSession.", - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "move_window", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "target": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "target", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Move window", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "get_server_info", + "wireName": "get_server_info", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 39 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1761 + }, + "description": "Report liveness, tmux version, and the resolved socket when running. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get tmux server information" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_session_info", + "wireName": "get_session_info", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1794 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste literal text and an optional newline target-only after two state checks.", + "description": "Return one session by stable ID or name. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enter": { - "description": "Caller-controlled enter.", - "type": "boolean" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "text": { - "description": "Caller-controlled text.", + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, "type": "string" } }, "required": [ - "paneId", - "text" + "session" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "characters": { - "type": "integer" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - } - }, - "required": [ - "characters", - "pane", - "paneRef" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -58324,126 +60693,64 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Paste text" + "title": "Get tmux session information" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste literal text and an optional newline target-only after two state checks.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enter": { - "description": "Caller-controlled enter.", - "type": "boolean" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "text": { - "description": "Caller-controlled text.", - "type": "string" - } - }, - "required": [ - "paneId", - "text" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "paste_text", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "characters": { - "type": "integer" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - } - }, - "required": [ - "characters", - "pane", - "paneRef" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Paste text", + "processReach": "none", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "rename_session", - "wireName": "rename_session", + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 23 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2023 }, - "description": "Change tmux state; no client-supplied executable input. Set a literal-safe session name.", + "description": "Expand only validated variable identifiers, never a caller format. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" + "names": { + "description": "One to thirty-two validated tmux variable names.", + "items": { + "maxLength": 128, + "type": "string" + }, + "maxItems": 32, + "minItems": 1, + "type": "array" }, - "session": { - "description": "Caller-controlled session.", + "paneId": { + "description": "Optional pane context.", + "maxLength": 512, "type": "string" } }, "required": [ - "name", - "session" + "names" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "name", - "sessionId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -58451,116 +60758,57 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename session" + "title": "Get tmux variables" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set a literal-safe session name.", "inputLiteralization": { - "name": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "name", - "session" - ], - "type": "object" + "names": "validated-variable-name" }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "rename_session", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "sessionId": { - "type": "string" - } - }, - "required": [ - "name", - "sessionId" - ], - "type": "object" - }, "processReach": "none", - "title": "Rename session", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "rename_window", - "wireName": "rename_window", + "name": "get_window_info", + "wireName": "get_window_info", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 24 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1809 }, - "description": "Change tmux state; no client-supplied executable input. Set a literal-safe window name.", + "description": "Return one window by stable ID. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, "windowId": { - "description": "Caller-controlled windowId.", + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "name", "windowId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "name", - "windowId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -58568,119 +60816,45 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Rename window" + "title": "Get tmux window information" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set a literal-safe window name.", - "inputLiteralization": { - "name": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "name", - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "rename_window", + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "name", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Rename window", "tmuxEffects": [ - "change", "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "kill_pane", + "wireName": "kill_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 25 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3161 }, - "description": "Change tmux state; no client-supplied executable input. Resize one pane by dimensions or a directional amount.", + "description": "Delete one pane and its running process. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "amount": { - "description": "Caller-controlled amount.", - "minimum": 1, - "type": "integer" - }, - "direction": { - "description": "Caller-controlled direction.", - "enum": [ - "up", - "down", - "left", - "right" - ], - "type": "string" - }, - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, "paneId": { - "description": "Caller-controlled paneId.", + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" - }, - "zoom": { - "description": "Caller-controlled zoom.", - "type": "boolean" } }, "required": [ @@ -58689,15 +60863,7 @@ "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -58705,129 +60871,101 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize pane" + "title": "Kill a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Resize one pane by dimensions or a directional amount.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "amount": { - "description": "Caller-controlled amount.", - "minimum": 1, - "type": "integer" - }, - "direction": { - "description": "Caller-controlled direction.", - "enum": [ - "up", - "down", - "left", - "right" - ], - "type": "string" - }, - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" - }, - "zoom": { - "description": "Caller-controlled zoom.", - "type": "boolean" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "resize_pane", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Resize pane", "tmuxEffects": [ - "change", - "observe" + "observe", + "delete" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "resize_window", - "wireName": "resize_window", + "name": "kill_session", + "wireName": "kill_session", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 26 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3196 }, - "description": "Change tmux state; no client-supplied executable input. Resize the terminal dimensions reported for one window.", + "description": "Delete one session and every window it owns. Delete tmux state; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" - }, - "windowId": { - "description": "Caller-controlled windowId.", + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, "type": "string" } }, "required": [ - "windowId" + "session" ], "type": "object" }, - "outputSchema": { + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Kill a tmux session" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe", + "delete" + ], + "toolset": "teardown" + } + } + }, + { + "name": "kill_window", + "wireName": "kill_window", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3178 + }, + "description": "Delete one window and every pane it owns. Delete tmux state; accepts no command payload.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { "windowId": { + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, @@ -58836,126 +60974,126 @@ ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Resize window" + "title": "Kill a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Resize the terminal dimensions reported for one window.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Caller-controlled height.", - "minimum": 1, - "type": "integer" - }, - "width": { - "description": "Caller-controlled width.", - "minimum": 1, - "type": "integer" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "resize_window", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "windowId": { - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Resize window", "tmuxEffects": [ - "change", - "observe" + "observe", + "delete" ], - "toolset": "manage" + "toolset": "teardown" } } }, { - "name": "respawn_pane", - "wireName": "respawn_pane", + "name": "list_panes", + "wireName": "list_panes", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 40 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1733 }, - "description": "Start a pane's configured process; accepts no command payload. Restart only the pane's configured process; no caller command is accepted.", + "description": "List every pane with stable pane, window, and session IDs. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "killFirst": { - "description": "Caller-controlled killFirst.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - } - }, - "required": [ - "paneId" - ], + "properties": {}, + "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "command": { + "type": "string" + }, + "dead": { + "type": "boolean" + }, + "height": { + "minimum": 0, + "type": "integer" + }, + "id": { + "pattern": "^%[0-9]+$", + "type": "string" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "path": { + "type": "string" + }, + "pid": { + "minimum": 0, + "type": "integer" + }, + "session_id": { + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "title": { + "type": "string" + }, + "width": { + "minimum": 0, + "type": "integer" + }, + "window_id": { + "pattern": "^@[0-9]+$", + "type": "string" + } + }, + "required": [ + "active", + "command", + "dead", + "height", + "id", + "index", + "path", + "pid", + "session_id", + "title", + "width", + "window_id" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "pane", - "paneRef" + "panes" ], "type": "object" }, @@ -58964,173 +61102,88 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Respawn pane" + "title": "List tmux panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Restart only the pane's configured process; no caller command is accepted.", - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "killFirst": { - "description": "Caller-controlled killFirst.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "respawn_pane", + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - } - }, - "required": [ - "pane", - "paneRef" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Respawn pane", + "processReach": "none", "tmuxEffects": [ - "change", - "delete", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "run_shell_command", - "wireName": "run_shell_command", + "name": "list_sessions", + "wireName": "list_sessions", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 41 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1699 }, - "description": "Run a shell command in a pane with your user's permissions. Run one command in a singular trusted POSIX shell and return bounded output.", + "description": "List stable session IDs, names, paths, and client counts. Inspect tmux metadata; accepts no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, - "properties": { - "command": { - "description": "Caller-controlled command.", - "type": "string" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "command", - "paneId" - ], + "properties": {}, + "required": [], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "droppedLines": { - "type": "integer" - }, - "effectiveTimeout": { - "type": "number" - }, - "exitStatus": { - "type": [ - "integer", - "null" - ] - }, - "linesMissed": { - "type": "boolean" - }, - "output": { + "sessions": { "items": { - "type": "string" + "additionalProperties": false, + "properties": { + "attached": { + "type": "boolean" + }, + "client_count": { + "minimum": 0, + "type": "integer" + }, + "id": { + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "window_count": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "attached", + "client_count", + "id", + "name", + "path", + "window_count" + ], + "type": "object" }, "type": "array" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "seconds": { - "type": "number" - }, - "timedOut": { - "type": "boolean" } }, "required": [ - "droppedLines", - "effectiveTimeout", - "exitStatus", - "linesMissed", - "output", - "pane", - "paneRef", - "seconds", - "timedOut" + "sessions" ], "type": "object" }, @@ -59139,219 +61192,110 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Run shell command" + "title": "List tmux sessions" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Run a shell command in a pane with your user's permissions. Run one command in a singular trusted POSIX shell and return bounded output.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "command": { - "description": "Caller-controlled command.", - "type": "string" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "command", - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "run_shell_command", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "droppedLines": { - "type": "integer" - }, - "effectiveTimeout": { - "type": "number" - }, - "exitStatus": { - "type": [ - "integer", - "null" - ] - }, - "linesMissed": { - "type": "boolean" - }, - "output": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "seconds": { - "type": "number" - }, - "timedOut": { - "type": "boolean" - } - }, - "required": [ - "droppedLines", - "effectiveTimeout", - "exitStatus", - "linesMissed", - "output", - "pane", - "paneRef", - "seconds", - "timedOut" - ], - "type": "object" - }, - "processReach": "pane-command", - "title": "Run shell command", + "processReach": "none", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "search_panes", - "wireName": "search_panes", + "name": "list_windows", + "wireName": "list_windows", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 15 - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Search bounded pane content for literal text or a regular expression.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "maxMatchesPerPane": { - "description": "Caller-controlled maxMatchesPerPane.", - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - "pattern": { - "description": "Caller-controlled pattern.", - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "Caller-controlled scrollbackLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1708 + }, + "description": "List windows through an exact owning session. Inspect tmux metadata; accepts no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { "session": { - "description": "Caller-controlled session.", + "description": "Stable session ID or name.", + "maxLength": 512, "type": "string" } }, "required": [ - "pattern" + "session" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "matches": { + "windows": { "items": { "additionalProperties": false, "properties": { - "line": { + "active": { + "type": "boolean" + }, + "height": { + "minimum": 0, "type": "integer" }, - "pane": { + "id": { + "pattern": "^@[0-9]+$", "type": "string" }, - "paneRef": { + "index": { + "type": "integer" + }, + "layout": { "type": "string" }, - "text": { + "name": { "type": "string" + }, + "pane_count": { + "minimum": 0, + "type": "integer" + }, + "session_id": { + "pattern": "^\\$[0-9]+$", + "type": "string" + }, + "width": { + "minimum": 0, + "type": "integer" } }, "required": [ - "line", - "pane", - "paneRef", - "text" + "active", + "height", + "id", + "index", + "layout", + "name", + "pane_count", + "session_id", + "width" ], "type": "object" }, "type": "array" - }, - "panesAvailable": { - "type": "integer" - }, - "panesSearched": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBy": { - "items": { - "type": "string" - }, - "type": "array" } }, "required": [ - "matches", - "panesAvailable", - "panesSearched", - "truncated", - "truncatedBy" + "windows" ], "type": "object" }, @@ -59360,118 +61304,19 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Search panes" + "title": "List tmux windows" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Search bounded pane content for literal text or a regular expression.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "maxMatchesPerPane": { - "description": "Caller-controlled maxMatchesPerPane.", - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - "pattern": { - "description": "Caller-controlled pattern.", - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "scrollbackLines": { - "description": "Caller-controlled scrollbackLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [ - "pattern" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "search_panes", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "matches": { - "items": { - "additionalProperties": false, - "properties": { - "line": { - "type": "integer" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "line", - "pane", - "paneRef", - "text" - ], - "type": "object" - }, - "type": "array" - }, - "panesAvailable": { - "type": "integer" - }, - "panesSearched": { - "type": "integer" - }, - "truncated": { - "type": "boolean" - }, - "truncatedBy": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "matches", - "panesAvailable", - "panesSearched", - "truncated", - "truncatedBy" - ], - "type": "object" - }, "processReach": "none", - "title": "Search panes", "tmuxEffects": [ "observe" ], @@ -59480,49 +61325,40 @@ } }, { - "name": "select_layout", - "wireName": "select_layout", + "name": "move_window", + "wireName": "move_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 27 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2417 }, - "description": "Change tmux state; no client-supplied executable input. Apply a named layout, a unique abbreviation for the running tmux version, or a checksummed saved layout. Invalid syntax is refused before window lookup; tmux validates geometry when applying the layout.", + "description": "Move a window to an exact index in its owning session. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "layout": { - "description": "Caller-controlled layout.", - "type": "string" + "index": { + "description": "Non-negative destination index.", + "maximum": 100000, + "minimum": 0, + "type": "integer" }, "windowId": { - "description": "Caller-controlled windowId.", + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "layout", - "windowId" + "windowId", + "index" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "layout", - "windowId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -59530,104 +61366,76 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select layout" + "title": "Move a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Apply a named layout, a unique abbreviation for the running tmux version, or a checksummed saved layout. Invalid syntax is refused before window lookup; tmux validates geometry when applying the layout.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "description": "Caller-controlled layout.", - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "layout", - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "select_layout", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "layout": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "layout", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Select layout", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "select_pane", - "wireName": "select_pane", + "name": "paste_text", + "wireName": "paste_text", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 28 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3008 }, - "description": "Change tmux state; no client-supplied executable input. Select one pane as active.", + "description": "Require the target pane to be live and outside human-owned mode, then stage a private target-only buffer, optionally append Enter, paste it once, and verify cleanup. Empty text without Enter is a guarded buffer-free no-op. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { + "enter": { + "description": "Append Enter to the same private paste buffer.", + "type": "boolean" + }, "paneId": { - "description": "Caller-controlled paneId.", + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + }, + "text": { + "description": "Literal text to paste.", + "maxLength": 1048576, "type": "string" } }, "required": [ - "paneId" + "paneId", + "text" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "paneId": { + "changed": { + "type": "boolean" + }, + "pane_id": { + "pattern": "^%[0-9]+$", "type": "string" } }, "required": [ - "paneId" + "pane_id" ], "type": "object" }, @@ -59636,257 +61444,265 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select pane" + "title": "Paste text into a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Select one pane as active.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "select_pane", "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" + "processReach": "pane-input", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "execute" + } + } + }, + { + "name": "rename_session", + "wireName": "rename_session", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2269 + }, + "description": "Replace one session name. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Literal replacement session name.", + "maxLength": 512, + "type": "string" }, + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "session", + "name" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rename a tmux session" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "name": "double-hash-once" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], "processReach": "none", - "title": "Select pane", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "select_window", - "wireName": "select_window", + "name": "rename_window", + "wireName": "rename_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 29 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2288 }, - "description": "Change tmux state; no client-supplied executable input. Select one exact window appearance.", + "description": "Replace one window name. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "sourceIndex": { - "description": "Caller-controlled sourceIndex.", - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Caller-controlled sourceSession.", + "name": { + "description": "Literal replacement window name.", + "maxLength": 512, "type": "string" }, "windowId": { - "description": "Caller-controlled windowId.", + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "windowId" + "windowId", + "name" ], "type": "object" }, "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rename a tmux window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "name": "double-hash-once" + }, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "resize_pane", + "wireName": "resize_pane", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2383 + }, + "description": "Replace one or both pane dimensions. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "target": { - "type": "string" + "height": { + "description": "Optional positive pane height.", + "maximum": 100000, + "minimum": 1, + "type": "integer" }, - "windowId": { + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" + }, + "width": { + "description": "Optional positive pane width.", + "maximum": 100000, + "minimum": 1, + "type": "integer" } }, "required": [ - "target", - "windowId" + "paneId" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Select window" + "title": "Resize a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Select one exact window appearance.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "sourceIndex": { - "description": "Caller-controlled sourceIndex.", - "minimum": 0, - "type": "integer" - }, - "sourceSession": { - "description": "Caller-controlled sourceSession.", - "type": "string" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "select_window", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "target": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "target", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Select window", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "send_keys", - "wireName": "send_keys", + "name": "resize_window", + "wireName": "resize_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 42 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2362 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keys after checking the effective synchronized-pane cohort.", + "description": "Replace one window's dimensions. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enter": { - "description": "Caller-controlled enter.", - "type": "boolean" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "keys": { - "description": "Caller-controlled keys.", - "items": { - "type": "string" - }, - "type": "array" + "height": { + "description": "Positive window height.", + "maximum": 100000, + "minimum": 1, + "type": "integer" }, - "literal": { - "description": "Caller-controlled literal.", - "type": "boolean" + "width": { + "description": "Positive window width.", + "maximum": 100000, + "minimum": 1, + "type": "integer" }, - "paneId": { - "description": "Caller-controlled paneId.", + "windowId": { + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "keys", - "paneId" + "windowId", + "width", + "height" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "resolvedPaneIds": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "keys", - "pane", - "paneRef", - "resolvedPaneIds" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -59894,213 +61710,79 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send keys" + "title": "Resize a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keys after checking the effective synchronized-pane cohort.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enter": { - "description": "Caller-controlled enter.", - "type": "boolean" - }, - "force": { - "description": "Caller-controlled force.", - "type": "boolean" - }, - "keys": { - "description": "Caller-controlled keys.", - "items": { - "type": "string" - }, - "type": "array" - }, - "literal": { - "description": "Caller-controlled literal.", - "type": "boolean" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "keys", - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "send_keys", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "pane": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "resolvedPaneIds": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "keys", - "pane", - "paneRef", - "resolvedPaneIds" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys", + "processReach": "none", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "send_keys_batch", - "wireName": "send_keys_batch", + "name": "respawn_pane", + "wireName": "respawn_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 43 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2658 }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered bounded batch with a fresh check for every row.", + "description": "Restart only the pane's configured process; no caller command is accepted. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "onError": { - "description": "Caller-controlled onError.", - "enum": [ - "stop", - "continue" - ], + "force": { + "description": "Permit replacing a running pane process.", + "type": "boolean" + }, + "killFirst": { + "description": "Kill a running pane process before respawn.", + "type": "boolean" + }, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" }, - "operations": { - "description": "Caller-controlled operations.", - "items": { - "additionalProperties": false, - "properties": { - "enter": { - "type": "boolean" - }, - "force": { - "type": "boolean" - }, - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "literal": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "keys" - ], - "type": "object" - }, - "maxItems": 64, - "type": "array" + "startDirectory": { + "description": "Literal replacement start directory.", + "maxLength": 4096, + "type": "string" } }, "required": [ - "operations" + "paneId" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "completed": { - "type": "integer" - }, - "failures": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "index", - "reason" - ], - "type": "object" - }, - "type": "array" + "changed": { + "type": "boolean" }, - "targets": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "resolvedPaneIds": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "index", - "resolvedPaneIds" - ], - "type": "object" - }, - "type": "array" + "pane_id": { + "pattern": "^%[0-9]+$", + "type": "string" } }, "required": [ - "completed", - "failures", - "targets" + "pane_id" ], "type": "object" }, @@ -60109,275 +61791,151 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Send keys batch" + "title": "Respawn a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered bounded batch with a fresh check for every row.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "onError": { - "description": "Caller-controlled onError.", - "enum": [ - "stop", - "continue" - ], - "type": "string" - }, - "operations": { - "description": "Caller-controlled operations.", - "items": { - "additionalProperties": false, - "properties": { - "enter": { - "type": "boolean" - }, - "force": { - "type": "boolean" - }, - "keys": { - "items": { - "type": "string" - }, - "type": "array" - }, - "literal": { - "type": "boolean" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "paneId", - "keys" - ], - "type": "object" - }, - "maxItems": 64, - "type": "array" - } - }, - "required": [ - "operations" - ], - "type": "object" + "inputLiteralization": { + "startDirectory": "double-hash-once" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "send_keys_batch", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "completed": { - "type": "integer" - }, - "failures": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "reason": { - "type": "string" - } - }, - "required": [ - "index", - "reason" - ], - "type": "object" - }, - "type": "array" - }, - "targets": { - "items": { - "additionalProperties": false, - "properties": { - "index": { - "type": "integer" - }, - "resolvedPaneIds": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "index", - "resolvedPaneIds" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "completed", - "failures", - "targets" - ], - "type": "object" - }, - "processReach": "pane-input", - "title": "Send keys batch", + "processReach": "configured-process", "tmuxEffects": [ + "observe", "change", - "observe" + "delete" ], "toolset": "execute" } } }, { - "name": "set_history_limit", - "wireName": "set_history_limit", + "name": "run_shell_command", + "wireName": "run_shell_command", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 30 - }, - "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit.", - "schemaStatus": "runtime", - "inputSchema": { - "additionalProperties": false, - "properties": { - "lines": { - "description": "Caller-controlled lines.", - "maximum": 2000000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2689 }, - "outputSchema": { + "description": "Require one live configured pane, outside human-owned mode and running a supported POSIX foreground shell, then send one command and return output after its private completion boundary. Run a shell command in a pane with your user's permissions.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "lines": { + "command": { + "description": "Shell command sent to the pane.", + "maxLength": 1048576, + "type": "string" + }, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + }, + "timeoutMs": { + "description": "Completion timeout in milliseconds.", + "maximum": 60000, + "minimum": 1, "type": "integer" } }, "required": [ - "lines" + "paneId", + "command" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set history limit" + "title": "Run a shell command in a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "lines": { - "description": "Caller-controlled lines.", - "maximum": 2000000, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "set_history_limit", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "lines": { - "type": "integer" - } - }, - "required": [ - "lines" - ], - "type": "object" - }, - "processReach": "none", - "title": "Set history limit", + "processReach": "pane-command", "tmuxEffects": [ + "observe", "change" ], - "toolset": "manage" + "toolset": "execute" } } }, { - "name": "set_mouse_enabled", - "wireName": "set_mouse_enabled", + "name": "search_panes", + "wireName": "search_panes", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 31 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1906 }, - "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a boolean.", + "description": "Search captured lines using a length-limited expression. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "description": "Caller-controlled enabled.", - "type": "boolean" + "pattern": { + "description": "Bounded regular expression.", + "maxLength": 256, + "type": "string" } }, "required": [ - "enabled" + "pattern" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "type": "boolean" + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "string" + }, + "pane_id": { + "pattern": "^%[0-9]+$", + "type": "string" + } + }, + "required": [ + "line", + "pane_id" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "enabled" + "matches" ], "type": "object" }, @@ -60386,104 +61944,61 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set mouse enabled" + "title": "Search tmux panes" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a boolean.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "Caller-controlled enabled.", - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "set_mouse_enabled", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - }, "processReach": "none", - "title": "Set mouse enabled", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "set_pane_title", - "wireName": "set_pane_title", + "name": "select_layout", + "wireName": "select_layout", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 32 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2339 }, - "description": "Change tmux state; no client-supplied executable input. Set one literal-safe pane title.", + "description": "Replace the pane layout of one window. Names and mirrored layouts follow the selected daemon version. Saved layouts accept v1 checksums and v2 JSON; v2 requires tmux 3.8 (including 3.8-rc) or newer. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "paneId": { - "description": "Caller-controlled paneId.", + "layout": { + "description": "Built-in name, unambiguous abbreviation or saved tmux layout.", + "maxLength": 4096, "type": "string" }, - "title": { - "description": "Caller-controlled title.", + "windowId": { + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "paneId", - "title" + "windowId", + "layout" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "paneId", - "title" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -60491,116 +62006,55 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set pane title" + "title": "Select a tmux layout" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set one literal-safe pane title.", - "inputLiteralization": { - "title": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "title": { - "description": "Caller-controlled title.", - "type": "string" - } - }, - "required": [ - "paneId", - "title" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_pane_title", + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "paneId": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "paneId", - "title" - ], - "type": "object" - }, "processReach": "none", - "title": "Set pane title", "tmuxEffects": [ - "change", - "observe" + "observe", + "change" ], "toolset": "manage" } } }, { - "name": "set_synchronize_panes", - "wireName": "set_synchronize_panes", + "name": "select_pane", + "wireName": "select_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 44 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2323 }, - "description": "Change tmux state; no client-supplied executable input. Set the window input default; pane overrides determine effective synchronization.", + "description": "Make one pane active. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "enabled": { - "description": "Caller-controlled enabled.", - "type": "boolean" - }, - "windowId": { - "description": "Caller-controlled windowId.", + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, "required": [ - "enabled", - "windowId" + "paneId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -60608,108 +62062,55 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Set synchronize panes" + "title": "Select a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": true, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Set the window input default; pane overrides determine effective synchronization.", + "amplifiesFutureInput": false, "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "description": "Caller-controlled enabled.", - "type": "boolean" - }, - "windowId": { - "description": "Caller-controlled windowId.", - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "set_synchronize_panes", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "enabled": { - "type": "boolean" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "enabled", - "windowId" - ], - "type": "object" - }, "processReach": "none", - "title": "Set synchronize panes", "tmuxEffects": [ + "observe", "change" ], - "toolset": "execute" + "toolset": "manage" } } }, { - "name": "show_environment", - "wireName": "show_environment", + "name": "select_window", + "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 16 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2307 }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Read global or session tmux environment values.", + "description": "Make one window active. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "Caller-controlled session.", + "windowId": { + "description": "Stable window ID.", + "maxLength": 512, "type": "string" } }, - "required": [], + "required": [ + "windowId" + ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "environment": { - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "type": "object" - } - }, - "required": [ - "environment" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -60717,116 +62118,77 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show environment" + "title": "Select a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Read global or session tmux environment values.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "show_environment", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ - "process-environment" + "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "environment": { - "additionalProperties": { - "type": [ - "string", - "null" - ] - }, - "type": "object" - } - }, - "required": [ - "environment" - ], - "type": "object" - }, "processReach": "none", - "title": "Show environment", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "manage" } } }, { - "name": "show_hooks", - "wireName": "show_hooks", + "name": "send_keys", + "wireName": "send_keys", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 17 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2803 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read configured hooks, optionally for one session.", + "description": "Require every configured synchronized pane to be live and outside human-owned mode, then send one validated tmux key name. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "session": { - "description": "Caller-controlled session.", + "keys": { + "description": "One tmux key name.", + "maxLength": 256, + "type": "string" + }, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" } }, - "required": [], + "required": [ + "paneId", + "keys" + ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "hooks": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - } - }, - "required": [ - "command", - "index", - "name" - ], - "type": "object" + "pane_id": { + "pattern": "^%[0-9]+$", + "type": "string" + }, + "target_pane_ids": { + "items": { + "pattern": "^%[0-9]+$", + "type": "string" }, "type": "array" } }, "required": [ - "hooks" + "pane_id", + "target_pane_ids" ], "type": "object" }, @@ -60835,336 +62197,225 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show hooks" + "title": "Send keys to a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read configured hooks, optionally for one session.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "session": { - "description": "Caller-controlled session.", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "show_hooks", "nestedAuthority": [], "outputClasses": [ - "configured-command" + "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "hooks": { - "items": { - "additionalProperties": false, - "properties": { - "command": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "name": { - "type": "string" - } - }, - "required": [ - "command", - "index", - "name" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "hooks" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show hooks", + "processReach": "pane-input", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "show_option", - "wireName": "show_option", + "name": "send_keys_batch", + "wireName": "send_keys_batch", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 18 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2876 }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one exact tmux option.", + "description": "Preflight each row's configured synchronized pane cohort independently, requiring every pane to be live and outside human-owned mode before its text or key and optional Enter. Send input to a pane's program; a shell that receives it runs it with your user's permissions.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "scope": { - "description": "Caller-controlled scope.", + "onError": { + "description": "Stop after the first failed operation or continue.", "enum": [ - "server", - "global_session", - "global_window", - "session", - "window", - "pane" + "continue", + "stop" ], "type": "string" }, - "target": { - "description": "Caller-controlled target.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "outputSchema": { - "additionalProperties": false, - "properties": { - "options": { + "operations": { + "description": "One to sixty-four ordered pane-input operations.", "items": { "additionalProperties": false, "properties": { - "name": { + "enter": { + "type": "boolean" + }, + "keys": { + "maxLength": 4096, "type": "string" }, - "value": { + "literal": { + "type": "boolean" + }, + "paneId": { + "maxLength": 512, "type": "string" } }, "required": [ - "name", - "value" + "paneId", + "keys" ], "type": "object" }, + "maxItems": 64, + "minItems": 1, "type": "array" } }, "required": [ - "options" + "operations" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Show option" + "title": "Send a key sequence to a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one exact tmux option.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Caller-controlled name.", - "type": "string" - }, - "scope": { - "description": "Caller-controlled scope.", - "enum": [ - "server", - "global_session", - "global_window", - "session", - "window", - "pane" - ], - "type": "string" - }, - "target": { - "description": "Caller-controlled target.", - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "mayExposeSecrets": true, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "show_option", "nestedAuthority": [], "outputClasses": [ - "configured-command", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "options": { - "items": { - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "required": [ - "name", - "value" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "options" - ], - "type": "object" - }, - "processReach": "none", - "title": "Show option", + "processReach": "pane-input", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "signal_channel", - "wireName": "signal_channel", + "name": "set_history_limit", + "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 33 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2523 }, - "description": "Change tmux state; no client-supplied executable input. Signal one tmux wait-for channel.", + "description": "Replace retained-history bounds with a non-negative integer. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "channel": { - "description": "Caller-controlled channel.", + "limit": { + "description": "Retained history line limit.", + "maximum": 10000000, + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Stable session ID or name.", + "maxLength": 512, "type": "string" } }, "required": [ - "channel" + "session", + "limit" ], "type": "object" }, "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set tmux history limit" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_mouse_enabled", + "wireName": "set_mouse_enabled", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2510 + }, + "description": "Replace the global mouse option with a typed boolean. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "channel": { - "type": "string" - }, - "signalled": { + "enabled": { + "description": "Whether mouse handling is enabled.", "type": "boolean" } }, "required": [ - "channel", - "signalled" + "enabled" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Signal channel" + "title": "Set tmux mouse handling" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Signal one tmux wait-for channel.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "description": "Caller-controlled channel.", - "type": "string" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "signal_channel", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - }, - "signalled": { - "type": "boolean" - } - }, - "required": [ - "channel", - "signalled" - ], - "type": "object" - }, "processReach": "none", - "title": "Signal channel", "tmuxEffects": [ "change" ], @@ -61173,409 +62424,218 @@ } }, { - "name": "snapshot_pane", - "wireName": "snapshot_pane", + "name": "set_pane_title", + "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 19 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2457 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return pane metadata and bounded terminal content together.", + "description": "Replace one pane title. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, "paneId": { - "description": "Caller-controlled paneId.", + "description": "Stable pane ID.", + "maxLength": 512, + "type": "string" + }, + "title": { + "description": "Literal replacement pane title.", + "maxLength": 4096, "type": "string" } }, "required": [ - "paneId" + "paneId", + "title" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "capture": { - "additionalProperties": false, - "properties": { - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "droppedLines", - "lines", - "paneId" - ], - "type": "object" + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set a tmux pane title" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": { + "title": "double-hash-once" }, - "pane": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_synchronize_panes", + "wireName": "set_synchronize_panes", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 3106 + }, + "description": "Set the inherited window synchronize-panes default; pane-level overrides determine effective synchronized input membership. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "description": "Whether later pane input is duplicated.", + "type": "boolean" + }, + "windowId": { + "description": "Stable window ID.", + "maxLength": 512, + "type": "string" } }, "required": [ - "capture", - "pane" + "windowId", + "enabled" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Snapshot pane" + "title": "Set synchronized pane input" }, "meta": { "com.git-pull.libtmux-mcp/capability": { - "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return pane metadata and bounded terminal content together.", + "amplifiesFutureInput": true, "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "snapshot_pane", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "capture": { - "additionalProperties": false, - "properties": { - "droppedLines": { - "type": "integer" - }, - "lines": { - "items": { - "type": "string" - }, - "type": "array" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "droppedLines", - "lines", - "paneId" - ], - "type": "object" - }, - "pane": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - } - }, - "required": [ - "capture", - "pane" - ], - "type": "object" - }, "processReach": "none", - "title": "Snapshot pane", "tmuxEffects": [ - "observe" + "change" ], - "toolset": "inspect" + "toolset": "execute" } } }, { - "name": "split_window", - "wireName": "split_window", + "name": "show_environment", + "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 45 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2097 }, - "description": "Start a pane's configured process; accepts no command payload. Create a configured-process pane without accepting command or environment data.", + "description": "Read global or session environment values. Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "direction": { - "description": "Caller-controlled direction.", - "enum": [ - "right", - "left", - "above", - "below" - ], - "type": "string" - }, - "paneId": { - "description": "Caller-controlled paneId.", + "name": { + "description": "Optional exact environment name.", + "maxLength": 256, "type": "string" }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", + "session": { + "description": "Optional session target.", + "maxLength": 512, "type": "string" } }, - "required": [ - "paneId" - ], + "required": [], "type": "object" }, "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Show the tmux environment" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "process-environment" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "show_hooks", + "wireName": "show_hooks", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2136 + }, + "description": "Read configured hooks, optionally filtered by exact name. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { + "name": { + "description": "Optional exact hook name.", + "maxLength": 256, "type": "string" }, - "width": { - "type": "integer" - }, - "windowID": { + "target": { + "description": "Optional tmux target.", + "maxLength": 512, "type": "string" } }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": true, "type": "object" }, "annotations": { @@ -61583,306 +62643,170 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Split window" + "title": "Show tmux hooks" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Start a pane's configured process; accepts no command payload. Create a configured-process pane without accepting command or environment data.", - "inputLiteralization": { - "startDirectory": "double-hash-once" - }, - "inputSchema": { - "additionalProperties": false, - "properties": { - "direction": { - "description": "Caller-controlled direction.", - "enum": [ - "right", - "left", - "above", - "below" - ], - "type": "string" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "startDirectory": { - "description": "Caller-controlled startDirectory.", - "type": "string" - } - }, - "required": [ - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, + "inputLiteralization": {}, + "mayExposeSecrets": false, "mayReturnUntrustedContent": true, - "name": "split_window", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "configured-command" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": "string" - }, - "height": { - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "type": "integer" - }, - "isActive": { - "type": "boolean" - }, - "isAtBottom": { - "type": "boolean" - }, - "isAtLeft": { - "type": "boolean" - }, - "isAtRight": { - "type": "boolean" - }, - "isAtTop": { - "type": "boolean" - }, - "isDead": { - "type": "boolean" - }, - "isSynchronized": { - "type": "boolean" - }, - "modeCount": { - "type": "integer" - }, - "ref": { - "type": "string" - }, - "width": { - "type": "integer" - }, - "windowID": { - "type": "string" - } - }, - "required": [ - "currentCommand", - "currentPath", - "height", - "id", - "index", - "isActive", - "isAtBottom", - "isAtLeft", - "isAtRight", - "isAtTop", - "isDead", - "isSynchronized", - "modeCount", - "ref", - "width", - "windowID" - ], - "type": "object" - }, - "processReach": "configured-process", - "title": "Split window", + "processReach": "none", "tmuxEffects": [ - "change", "observe" ], - "toolset": "execute" + "toolset": "inspect" } } }, { - "name": "swap_pane", - "wireName": "swap_pane", + "name": "show_option", + "wireName": "show_option", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 34 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2072 }, - "description": "Change tmux state; no client-supplied executable input. Swap two panes without changing their identities.", + "description": "Read one exact option without accepting an option value. Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "otherPaneId": { - "description": "Caller-controlled otherPaneId.", + "name": { + "description": "Exact option name.", + "maxLength": 256, "type": "string" }, - "paneId": { - "description": "Caller-controlled paneId.", + "target": { + "description": "Optional session, window, or pane target.", + "maxLength": 512, "type": "string" } }, "required": [ - "otherPaneId", - "paneId" + "name" ], "type": "object" }, - "outputSchema": { + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Show a tmux option" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "configured-command" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "signal_channel", + "wireName": "signal_channel", + "source": { + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2496 + }, + "description": "Release or latch one named server-side channel. Change tmux state; no client-supplied executable input.", + "schemaStatus": "runtime", + "inputSchema": { "additionalProperties": false, "properties": { - "otherPaneId": { - "type": "string" - }, - "paneId": { + "channel": { + "description": "Bounded channel name.", + "maxLength": 256, "type": "string" } }, "required": [ - "otherPaneId", - "paneId" + "channel" ], "type": "object" }, + "outputSchema": { + "additionalProperties": true, + "type": "object" + }, "annotations": { "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Swap panes" + "title": "Signal a tmux channel" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Swap two panes without changing their identities.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "otherPaneId": { - "description": "Caller-controlled otherPaneId.", - "type": "string" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - } - }, - "required": [ - "otherPaneId", - "paneId" - ], - "type": "object" - }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "swap_pane", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "otherPaneId": { - "type": "string" - }, - "paneId": { - "type": "string" - } - }, - "required": [ - "otherPaneId", - "paneId" - ], - "type": "object" - }, "processReach": "none", - "title": "Swap panes", "tmuxEffects": [ - "change", - "observe" + "change" ], "toolset": "manage" } } }, { - "name": "wait_for_channel", - "wireName": "wait_for_channel", + "name": "snapshot_pane", + "wireName": "snapshot_pane", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 35 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 1887 }, - "description": "Change tmux state; no client-supplied executable input. Wait within one deadline for a tmux channel signal.", + "description": "Return pane metadata and visible terminal content from one call. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "channel": { - "description": "Caller-controlled channel.", - "maxLength": 1024, + "paneId": { + "description": "Stable pane ID.", + "maxLength": 512, "type": "string" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" } }, "required": [ - "channel" + "paneId" ], "type": "object" }, "outputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - }, - "effectiveTimeout": { - "type": "number" - }, - "released": { - "type": "boolean" - }, - "seconds": { - "type": "number" - } - }, - "required": [ - "channel", - "effectiveTimeout", - "released", - "seconds" - ], + "additionalProperties": true, "type": "object" }, "annotations": { @@ -61890,201 +62814,76 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Wait for channel" + "title": "Snapshot a tmux pane" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Change tmux state; no client-supplied executable input. Wait within one deadline for a tmux channel signal.", "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "description": "Caller-controlled channel.", - "maxLength": 1024, - "type": "string" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "channel" - ], - "type": "object" - }, "mayExposeSecrets": true, "mayReturnUntrustedContent": true, - "name": "wait_for_channel", "nestedAuthority": [], "outputClasses": [ - "tmux-metadata" + "tmux-metadata", + "terminal-content" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - }, - "effectiveTimeout": { - "type": "number" - }, - "released": { - "type": "boolean" - }, - "seconds": { - "type": "number" - } - }, - "required": [ - "channel", - "effectiveTimeout", - "released", - "seconds" - ], - "type": "object" - }, "processReach": "none", - "title": "Wait for channel", "tmuxEffects": [ - "change" + "observe" ], - "toolset": "manage" + "toolset": "inspect" } } }, { - "name": "wait_for_text", - "wireName": "wait_for_text", + "name": "split_window", + "wireName": "split_window", "source": { - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "file": "Sources/LibTmuxMCP/ToolOperation.swift", - "line": 20 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2622 }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait within one deadline for pane text.", + "description": "Create a configured-process pane; path data is literalized before tmux expansion. Start a pane's configured process; accepts no command payload.", "schemaStatus": "runtime", "inputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, + "direction": { + "description": "vertical or horizontal.", + "maxLength": 16, "type": "string" }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, "paneId": { - "description": "Caller-controlled paneId.", + "description": "Stable pane to split.", + "maxLength": 512, "type": "string" }, - "patterns": { - "description": "Caller-controlled patterns.", - "items": { - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "maxItems": 32, - "type": "array" - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "stop": { - "description": "Caller-controlled stop.", - "items": { - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "maxItems": 32, - "type": "array" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" + "startDirectory": { + "description": "Literal pane start directory.", + "maxLength": 4096, + "type": "string" } }, "required": [ - "paneId", - "patterns" + "paneId" ], "type": "object" }, "outputSchema": { "additionalProperties": false, "properties": { - "cursor": { - "type": [ - "string", - "null" - ] - }, - "effectiveTimeout": { - "type": "number" - }, - "matched": { - "type": [ - "string", - "null" - ] - }, - "matchedAtEntry": { + "changed": { "type": "boolean" }, - "matchedIndex": { - "type": [ - "integer", - "null" - ] - }, - "outcome": { - "type": "string" - }, - "paneRef": { + "pane_id": { + "pattern": "^%[0-9]+$", "type": "string" - }, - "sawNewOutput": { - "type": "boolean" - }, - "seconds": { - "type": "number" - }, - "tail": { - "items": { - "type": "string" - }, - "type": "array" } }, "required": [ - "cursor", - "effectiveTimeout", - "matched", - "matchedAtEntry", - "matchedIndex", - "outcome", - "paneRef", - "sawNewOutput", - "seconds", - "tail" + "pane_id" ], "type": "object" }, @@ -62093,8845 +62892,7973 @@ "idempotentHint": false, "openWorldHint": true, "readOnlyHint": false, - "title": "Wait for text" + "title": "Split a tmux window" }, "meta": { "com.git-pull.libtmux-mcp/capability": { "amplifiesFutureInput": false, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false - }, - "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait within one deadline for pane text.", - "inputLiteralization": {}, - "inputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "description": "Caller-controlled cursor.", - "maxLength": 16384, - "type": "string" - }, - "maxLines": { - "description": "Caller-controlled maxLines.", - "maximum": 2000, - "minimum": 1, - "type": "integer" - }, - "paneId": { - "description": "Caller-controlled paneId.", - "type": "string" - }, - "patterns": { - "description": "Caller-controlled patterns.", - "items": { - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "maxItems": 32, - "type": "array" - }, - "regex": { - "description": "Caller-controlled regex.", - "type": "boolean" - }, - "stop": { - "description": "Caller-controlled stop.", - "items": { - "type": "string", - "x-libtmux-max-utf8-bytes": 4096 - }, - "maxItems": 32, - "type": "array" - }, - "timeoutMs": { - "description": "Caller-controlled timeoutMs.", - "maximum": 600000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "paneId", - "patterns" - ], - "type": "object" + "inputLiteralization": { + "startDirectory": "double-hash-once" }, - "mayExposeSecrets": true, - "mayReturnUntrustedContent": true, - "name": "wait_for_text", + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, "nestedAuthority": [], "outputClasses": [ - "terminal-content", "tmux-metadata" ], - "outputSchema": { - "additionalProperties": false, - "properties": { - "cursor": { - "type": [ - "string", - "null" - ] - }, - "effectiveTimeout": { - "type": "number" - }, - "matched": { - "type": [ - "string", - "null" - ] - }, - "matchedAtEntry": { - "type": "boolean" - }, - "matchedIndex": { - "type": [ - "integer", - "null" - ] - }, - "outcome": { - "type": "string" - }, - "paneRef": { - "type": "string" - }, - "sawNewOutput": { - "type": "boolean" - }, - "seconds": { - "type": "number" - }, - "tail": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": [ - "cursor", - "effectiveTimeout", - "matched", - "matchedAtEntry", - "matchedIndex", - "outcome", - "paneRef", - "sawNewOutput", - "seconds", - "tail" - ], - "type": "object" - }, - "processReach": "none", - "title": "Wait for text", + "processReach": "configured-process", "tmuxEffects": [ - "observe" + "observe", + "change" ], - "toolset": "inspect" + "toolset": "execute" } } - } - ], - "wirePrefix": "", - "selectable": true, - "source": "Sources/LibTmuxMCP", - "repo": "libtmux/libtmux-swift", - "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", - "selection": { - "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" - }, - "protocol": { - "capabilities": { - "resources": { - "listChanged": false, - "subscribe": false - }, - "tools": { - "listChanged": false - } }, - "prompts": [], - "protocolVersion": "2025-11-25", - "resources": [ - { - "description": "The frozen tool surface, capability declarations, socket selection, and provenance.", - "mimeType": "application/json", - "name": "capabilities", - "title": "Effective tmux MCP capabilities", - "uri": "tmux://capabilities" - } - ], - "resourceTemplates": [], - "serverInfo": { - "name": "libtmux", - "title": "tmux", - "version": "0.1.0-alpha.6" - } - } - }, - "ruby": { - "tools": [ - "capabilities", - "capture", - "close", - "create", - "run", - "send", - "snapshot", - "wait" - ], - "registrations": [ { - "name": "capabilities", - "wireName": "tmux_capabilities", + "name": "swap_pane", + "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 249 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2435 }, - "description": "Discover the fixed endpoint, server binding, enabled tools, criteria schema and limits. Acquires metadata; starts no daemon.", + "description": "Exchange two pane positions without changing their IDs. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", - "enabledByDefault": true, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, - "properties": {}, - "required": [], + "properties": { + "sourcePaneId": { + "description": "Stable source pane ID.", + "maxLength": 512, + "type": "string" + }, + "targetPaneId": { + "description": "Stable target pane ID.", + "maxLength": 512, + "type": "string" + } + }, + "required": [ + "sourcePaneId", + "targetPaneId" + ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "authored_run": { - "additionalProperties": false, - "properties": { - "authorization": { - "const": "exact_generation_at_queue_grant" - }, - "availability": { - "enum": [ - "conditional", - "unsupported" - ] - }, - "descendant_termination": { - "const": "unobserved" - }, - "enrollment": { - "const": "explicit_source" - }, - "persistent_shell_changes": { - "const": false - }, - "requirements": { - "items": { - "type": "string" - }, - "type": "array" - }, - "shell_profile": { - "const": "zsh-5.9-zle" - }, - "stdin": { - "const": "closed" - } - }, - "required": [ - "availability", - "shell_profile", - "enrollment", - "authorization", - "stdin", - "persistent_shell_changes", - "descendant_termination", - "requirements" - ], - "type": "object" - }, - "criteria_schema": { - "type": "object" - }, - "enabled_tools": { - "items": { - "type": "string" - }, - "type": "array" - }, - "endpoint": { - "type": "string" - }, - "limits": { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - "observation": { - "additionalProperties": false, - "properties": { - "history_continuity": { - "const": "unknown" - }, - "process_cursor": { - "enum": [ - "conditional", - "unsupported" - ] - }, - "requirements": { - "items": { - "type": "string" - }, - "type": "array" - }, - "screen": { - "const": "bounded_rows" - }, - "wait_conditions": { - "items": { - "enum": [ - "screen_contains", - "process_exit" - ] - }, - "type": "array" - } - }, - "required": [ - "screen", - "history_continuity", - "process_cursor", - "requirements", - "wait_conditions" - ], - "type": "object" - }, - "owns_daemon": { - "const": false - }, - "resource_subscriptions": { - "const": false - }, - "server_identity": { - "additionalProperties": false, - "properties": { - "generation": { - "type": "string" - }, - "pid": { - "type": "integer" - }, - "start_time": { - "type": "integer" - }, - "tmux_version": { - "type": "string" - } - }, - "required": [ - "generation", - "pid", - "start_time", - "tmux_version" - ], - "type": "object" - } - }, - "required": [ - "endpoint", - "server_identity", - "enabled_tools", - "criteria_schema", - "limits", - "owns_daemon", - "resource_subscriptions", - "authored_run", - "observation" - ], - "type": "object" - }, - "ok": { - "const": true - } - }, - "required": [ - "ok", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } - }, - "required": [ - "state", - "created" - ], - "type": "object" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error" - ], - "type": "object" - } - ] + "additionalProperties": true, + "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false + "openWorldHint": true, + "readOnlyHint": false, + "title": "Swap two tmux panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "observe", + "change" + ], + "toolset": "manage" + } } }, { - "name": "capture", - "wireName": "tmux_capture", + "name": "wait_for_channel", + "wireName": "wait_for_channel", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 239 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2476 }, - "description": "Read exact-pane screen/history rows preserving LF. Defaults: 200 lines, 65536 bytes, zero history lines, track=false. Limits: 1000 lines/history, 262144 bytes. UTF-8 or base64; truncation is separate from unknown history continuity. Tracked process cursors require tmux>=3.3 and a native process identity backend: Linux peer pidfds with matching PID namespaces, or Darwin kqueue process observation. Continuation returns an exact state row splice, not a live-output journal. Refuses capture after-hooks.", + "description": "Wait for a named server-side channel with an optional deadline. Change tmux state; no client-supplied executable input.", "schemaStatus": "runtime", - "enabledByDefault": false, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" - }, - "max_lines": { - "maximum": 1000, - "minimum": 1, - "type": "integer" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "track": { - "type": "boolean" - } - }, - "required": [ - "target" - ], - "type": "object" + "additionalProperties": false, + "properties": { + "channel": { + "description": "Bounded channel name.", + "maxLength": 256, + "type": "string" }, - { - "additionalProperties": false, - "properties": { - "cursor": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "cursor" - ], - "type": "object" + "timeoutMs": { + "description": "Optional bounded wait in milliseconds.", + "maximum": 60000, + "minimum": 1, + "type": "integer" } + }, + "required": [ + "channel" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "data": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" - }, - "capture_id": { - "type": "string" - }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] - }, - "history_continuity": { - "const": "unknown" - }, - "interval": { - "additionalProperties": false, - "properties": { - "clock": { - "const": "monotonic_seconds" - }, - "finished": { - "type": "number" - }, - "started": { - "type": "number" - } - }, - "required": [ - "clock", - "started", - "finished" - ], - "type": "object" - }, - "mode": { - "const": "snapshot" - }, - "next_cursor": { - "type": "string" - }, - "process_generation": { - "type": [ - "string", - "null" - ] - }, - "row_count": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "rows": { - "items": { - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "scope": { - "additionalProperties": false, - "properties": { - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" - }, - "max_lines": { - "maximum": 1000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "max_lines", - "max_bytes", - "history_lines" - ], - "type": "object" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "target", - "capture_id", - "process_generation", - "encoding", - "row_count", - "bytes", - "truncated", - "history_continuity", - "interval", - "scope", - "mode", - "rows" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "base_capture_id": { - "type": "string" - }, - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" - }, - "capture_id": { - "type": "string" - }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] - }, - "history_continuity": { - "const": "unknown" - }, - "interval": { - "additionalProperties": false, - "properties": { - "clock": { - "const": "monotonic_seconds" - }, - "finished": { - "type": "number" - }, - "started": { - "type": "number" - } - }, - "required": [ - "clock", - "started", - "finished" - ], - "type": "object" - }, - "mode": { - "const": "delta" - }, - "next_cursor": { - "type": "string" - }, - "process_generation": { - "type": [ - "string", - "null" - ] - }, - "reset": { - "type": "boolean" - }, - "row_count": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "scope": { - "additionalProperties": false, - "properties": { - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" - }, - "max_lines": { - "maximum": 1000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "max_lines", - "max_bytes", - "history_lines" - ], - "type": "object" - }, - "splice": { - "additionalProperties": false, - "properties": { - "delete": { - "minimum": 0, - "type": "integer" - }, - "rows": { - "items": { - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "start": { - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "start", - "delete", - "rows" - ], - "type": "object" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "target", - "capture_id", - "process_generation", - "encoding", - "row_count", - "bytes", - "truncated", - "history_continuity", - "interval", - "scope", - "mode", - "base_capture_id", - "reset", - "splice", - "next_cursor" - ], - "type": "object" - } - ] - }, - "ok": { - "const": true - } - }, - "required": [ - "ok", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } - }, - "required": [ - "state", - "created" - ], - "type": "object" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error" - ], - "type": "object" - } - ] + "additionalProperties": true, + "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false + "openWorldHint": true, + "readOnlyHint": false, + "title": "Wait for a tmux channel" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": false, + "mayReturnUntrustedContent": false, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "processReach": "none", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } } }, { - "name": "close", - "wireName": "tmux_close", + "name": "wait_for_text", + "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 247 + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "file": "apps/mcp/src/tool_catalog.cpp", + "line": 2006 }, - "description": "Destroy one exact session, window or pane. Opt-in destructive operation; closing a session or window also removes its contained topology. Never selects by name or closes the daemon directly. Returns the final tmux client outcome.", + "description": "Discount this server's pending input and recent submitted echoes; unmodelled keys stop tracking the current line. Wait for a new shell's prompt before typing. `matched_at_entry` reports visible text at entry; a mode ending in -unconfirmed identifies input that was still unconfirmed at the deadline. Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted.", "schemaStatus": "runtime", - "enabledByDefault": false, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target" - ], - "type": "object" + "additionalProperties": false, + "properties": { + "target": { + "description": "Pane ID or pane target.", + "maxLength": 512, + "type": "string" + }, + "text": { + "description": "Literal text to wait for.", + "maxLength": 4096, + "type": "string" + }, + "timeout_ms": { + "description": "Bounded wait in milliseconds.", + "maximum": 60000, + "minimum": 1, + "type": "integer" } + }, + "required": [ + "target", + "text" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "client_exit_status": { - "const": 0 - }, - "delivery": { - "const": "observed" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "delivery", - "client_exit_status" - ], - "type": "object" - }, - "ok": { - "const": true - } - }, - "required": [ - "ok", - "data" - ], - "type": "object" + "additionalProperties": false, + "properties": { + "elapsed_ms": { + "minimum": 0, + "type": "integer" }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } - }, - "required": [ - "state", - "created" - ], - "type": "object" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" - }, - "ok": { - "const": false - } - }, - "required": [ - "ok", - "error" - ], - "type": "object" + "matched": { + "type": "boolean" + }, + "matched_at_entry": { + "type": "boolean" + }, + "mode": { + "type": "string" + }, + "pane_id": { + "pattern": "^%[0-9]+$", + "type": "string" + }, + "text": { + "type": "string" + }, + "timed_out": { + "type": "boolean" } - ] + }, + "required": [ + "elapsed_ms", + "matched", + "matched_at_entry", + "mode", + "text", + "timed_out" + ], + "type": "object" }, "annotations": { "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false + "openWorldHint": true, + "readOnlyHint": false, + "title": "Wait for pane text" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "inputLiteralization": {}, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata", + "terminal-content" + ], + "processReach": "none", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } } + } + ], + "wirePrefix": "", + "selectable": true, + "source": "apps/mcp/src", + "repo": "libtmux/libtmux-cxx", + "revision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "extractedRevision": "3f93b021cb51e8349bfb9cecc6fd4091f6e79a0f", + "selection": { + "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" + }, + "protocol": { + "capabilities": { + "resources": { + "listChanged": false, + "subscribe": false + }, + "tools": {} }, + "prompts": [], + "protocolVersion": "2025-11-25", + "resources": [ + { + "description": "The startup-frozen effective tool capability manifest.", + "mimeType": "application/json", + "name": "tmux-capabilities", + "title": "Effective tmux capabilities", + "uri": "tmux://capabilities" + } + ], + "resourceTemplates": [], + "serverInfo": { + "name": "libtmux-cxx", + "title": "libtmux C++ tmux server", + "version": "0.1.0-alpha.11" + } + } + }, + "swift": { + "tools": [ + "call_read_tools_batch", + "capture_pane", + "capture_since", + "clear_pane_scrollback", + "create_session", + "create_window", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "kill_pane", + "kill_session", + "kill_window", + "list_panes", + "list_sessions", + "list_windows", + "move_window", + "paste_text", + "rename_session", + "rename_window", + "resize_pane", + "resize_window", + "respawn_pane", + "run_shell_command", + "search_panes", + "select_layout", + "select_pane", + "select_window", + "send_keys", + "send_keys_batch", + "set_history_limit", + "set_mouse_enabled", + "set_pane_title", + "set_synchronize_panes", + "show_environment", + "show_hooks", + "show_option", + "signal_channel", + "snapshot_pane", + "split_window", + "swap_pane", + "wait_for_channel", + "wait_for_text" + ], + "registrations": [ { - "name": "create", - "wireName": "tmux_create", + "name": "call_read_tools_batch", + "wireName": "call_read_tools_batch", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 245 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 3 }, - "description": "Create a session, window in an exact session, or split an exact pane using argv. Opt-in mutation; 64 KiB total string bytes and at most 256 argv entries. Window/pane focus defaults false. Cwd/environment are optional; size is cells or percent. Assigned refs prove creation, not program readiness or completion.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. Retained rows contain full nested envelopes; oversized results are marked resultTruncated, and the response stays below the 1,000,000-byte wire cap.", "schemaStatus": "runtime", - "enabledByDefault": false, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "argv": { - "items": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "maxItems": 256, - "minItems": 1, - "prefixItems": [ - { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - } - ], - "type": "array" - }, - "cwd": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "environment": { - "additionalProperties": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "maxProperties": 128, - "propertyNames": { - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" - }, - "type": "object" - }, - "height": { - "maximum": 2147483647, - "minimum": 1, - "type": "integer" - }, - "kind": { - "const": "session" - }, - "name": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "width": { - "maximum": 2147483647, - "minimum": 1, - "type": "integer" - }, - "window_name": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - } - }, - "required": [ - "kind", - "name", - "argv" + "additionalProperties": false, + "properties": { + "onError": { + "description": "Caller-controlled onError.", + "enum": [ + "stop", + "continue" ], - "type": "object" + "type": "string" }, - { - "additionalProperties": false, - "properties": { - "argv": { - "items": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" + "operations": { + "description": "Caller-controlled operations.", + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "end": { + "description": "Caller-controlled end.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + }, + "joinWrapped": { + "description": "Caller-controlled joinWrapped.", + "type": "boolean" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "start": { + "description": "Caller-controlled start.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "maxItems": 256, - "minItems": 1, - "prefixItems": [ - { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - } - ], - "type": "array" - }, - "cwd": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "environment": { - "additionalProperties": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "waitMs": { + "description": "Caller-controlled waitMs.", + "maximum": 10000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_since", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "maxProperties": 128, - "propertyNames": { - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "corner": { + "description": "Caller-controlled corner.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "type": "object" - }, - "focus": { - "type": "boolean" - }, - "index": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window" - }, - "name": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "parent": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "get_pane_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "get_server_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } }, - "kind": { - "const": "session" - } + "required": [ + "session" + ], + "type": "object" }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "kind", - "parent", - "name", - "argv" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "argv": { - "items": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" + "tool": { + "const": "get_session_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "maxItems": 256, - "minItems": 1, - "prefixItems": [ - { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - } - ], - "type": "array" - }, - "cwd": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "direction": { - "enum": [ - "horizontal", - "vertical" - ] - }, - "environment": { - "additionalProperties": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "names": { + "description": "Caller-controlled names.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "type": "array" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "tool": { + "const": "get_tmux_variables", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "maxProperties": 128, - "propertyNames": { - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" }, - "type": "object" - }, - "focus": { - "type": "boolean" - }, - "kind": { - "const": "pane" - }, - "parent": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "window": { + "description": "Caller-controlled window.", + "type": "string" + } }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" + "required": [], + "type": "object" + }, + "tool": { + "const": "list_panes", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_sessions", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } }, - "kind": { - "const": "pane" - } + "required": [], + "type": "object" }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "size": { - "oneOf": [ - { - "maximum": 2147483647, - "minimum": 1, - "type": "integer" + "tool": { + "const": "list_windows", + "type": "string" + } }, - { - "pattern": "^(?:[1-9][0-9]?|100)%$", - "type": "string" - } - ] - } - }, - "required": [ - "kind", - "parent", - "direction", - "argv" - ], - "type": "object" - } - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "maxMatchesPerPane": { + "description": "Caller-controlled maxMatchesPerPane.", + "maximum": 200, + "minimum": 1, + "type": "integer" }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "pattern": { + "description": "Caller-controlled pattern.", + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "regex": { + "description": "Caller-controlled regex.", + "type": "boolean" }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" + "scrollbackLines": { + "description": "Caller-controlled scrollbackLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" } - ] + }, + "required": [ + "pattern" + ], + "type": "object" }, - "maxItems": 3, - "minItems": 1, - "type": "array" + "tool": { + "const": "search_panes", + "type": "string" + } }, - "delivery": { - "const": "observed" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_environment", + "type": "string" + } }, - "entity": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } + "required": [], + "type": "object" + }, + "tool": { + "const": "show_hooks", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "scope": { + "description": "Caller-controlled scope.", + "enum": [ + "server", + "global_session", + "global_window", + "session", + "window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Caller-controlled target.", + "type": "string" + } }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } }, - { + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "snapshot_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "operations" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "failed": { + "type": "integer" + }, + "onError": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": [ + "string", + "null" + ] + }, + "index": { + "type": "integer" + }, + "result": { + "additionalProperties": false, + "properties": { + "content": { + "items": { "additionalProperties": false, "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", + "text": { "type": "string" }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", + "type": { "type": "string" } }, "required": [ - "generation", - "kind", - "id", - "session_id", - "index" + "text", + "type" ], "type": "object" - } - ] - }, - "program_completion": { - "const": "unobserved" - } - }, - "required": [ - "entity", - "created", - "delivery", - "program_completion" - ], - "type": "object" - }, - "ok": { - "const": true - } - }, - "required": [ - "ok", - "data" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } + "type": "array" }, - "required": [ - "state", - "created" - ], - "type": "object" + "isError": { + "type": "boolean" + }, + "structuredContent": {} }, - "message": { - "type": "string" - } + "required": [ + "content", + "structuredContent", + "isError" + ], + "type": [ + "object", + "null" + ] }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" + "resultTruncated": { + "type": "boolean" + }, + "success": { + "type": "boolean" + }, + "tool": { + "type": "string" + } }, - "ok": { - "const": false - } + "required": [ + "error", + "index", + "result", + "resultTruncated", + "success", + "tool" + ], + "type": "object" }, - "required": [ - "ok", - "error" - ], - "type": "object" - } - ] - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false - } - }, - { - "name": "run", - "wireName": "tmux_run", - "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 237 - }, - "description": "Run an authored POSIX script in an explicitly enrolled idle, empty zsh 5.9 editor. Opt-in; no terminal injection. Exact queue authorization binds the existing shell generation; execution may follow a later pane replacement without retargeting it. Inherits cwd/exported environment, closed stdin, separate bounded UTF-8/base64 outputs. Defaults: 65536 bytes per output, 65536 script bytes; overflow refuses completion. Reports native exit/signal only from the helper; cancellation never proves descendants stopped.", - "schemaStatus": "runtime", - "enabledByDefault": false, - "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "properties": { - "script": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" + "type": "array" }, - "stderr_limit": { - "maximum": 262144, - "minimum": 0, - "type": "integer" + "stoppedAt": { + "type": [ + "integer", + "null" + ] }, - "stdout_limit": { - "maximum": 262144, - "minimum": 0, + "succeeded": { "type": "integer" }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" } }, "required": [ - "target", - "script" + "failed", + "onError", + "results", + "stoppedAt", + "succeeded", + "truncated", + "truncatedBytes" ], "type": "object" }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Call read tools batch" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Invoke a serial batch of at most 16 inspect tools. One client approval covers every nested name; inner tools receive no separate approval. Retained rows contain full nested envelopes; oversized results are marked resultTruncated, and the response stays below the 1,000,000-byte wire cap.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "data": { - "additionalProperties": false, - "properties": { - "authorization": { - "additionalProperties": false, - "properties": { - "enrollment_generation": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" - }, - "pane_id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" + "onError": { + "description": "Caller-controlled onError.", + "enum": [ + "stop", + "continue" + ], + "type": "string" + }, + "operations": { + "description": "Caller-controlled operations.", + "items": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "end": { + "description": "Caller-controlled end.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + }, + "joinWrapped": { + "description": "Caller-controlled joinWrapped.", + "type": "boolean" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "start": { + "description": "Caller-controlled start.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_pane", + "type": "string" + } }, - "process_generation": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "waitMs": { + "description": "Caller-controlled waitMs.", + "maximum": 10000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "capture_since", + "type": "string" + } }, - "run_id": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "corner": { + "description": "Caller-controlled corner.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "find_pane_by_position", + "type": "string" + } }, - "script_digest": { - "maxLength": 64, - "pattern": "^[a-f0-9]{64}$", - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "tool": { + "const": "get_pane_info", + "type": "string" + } }, - "server_generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "get_server_info", + "type": "string" + } }, - "state": { - "const": "authorized" - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "state", - "run_id", - "script_digest", - "server_generation", - "pane_id", - "enrollment_generation", - "process_generation" - ], - "type": "object" - }, - "completion": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "exit_status": { - "maximum": 255, - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } }, - "signal": { - "type": "null" + "required": [ + "session" + ], + "type": "object" + }, + "tool": { + "const": "get_session_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "names": { + "description": "Caller-controlled names.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "type": "array" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } }, - "state": { - "const": "exited" - } + "required": [ + "names" + ], + "type": "object" }, - "required": [ - "state", - "exit_status", - "signal" - ], - "type": "object" + "tool": { + "const": "get_tmux_variables", + "type": "string" + } }, - { - "additionalProperties": false, - "properties": { - "exit_status": { - "type": "null" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } }, - "signal": { - "maximum": 255, - "minimum": 1, - "type": "integer" + "required": [ + "windowId" + ], + "type": "object" + }, + "tool": { + "const": "get_window_info", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "window": { + "description": "Caller-controlled window.", + "type": "string" + } }, - "state": { - "const": "signaled" - } + "required": [], + "type": "object" }, - "required": [ - "state", - "exit_status", - "signal" - ], - "type": "object" - } - ] - }, - "stderr": { - "additionalProperties": false, - "properties": { - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" + "tool": { + "const": "list_panes", + "type": "string" + } }, - "data": { - "maxLength": 349528, - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_sessions", + "type": "string" + } }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "list_windows", + "type": "string" + } }, - "truncated": { - "const": false - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "encoding", - "data", - "bytes", - "truncated" - ], - "type": "object" - }, - "stdout": { - "additionalProperties": false, - "properties": { - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "maxMatchesPerPane": { + "description": "Caller-controlled maxMatchesPerPane.", + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "pattern": { + "description": "Caller-controlled pattern.", + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "regex": { + "description": "Caller-controlled regex.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "Caller-controlled scrollbackLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "tool": { + "const": "search_panes", + "type": "string" + } }, - "data": { - "maxLength": 349528, - "type": "string" + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_environment", + "type": "string" + } }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tool": { + "const": "show_hooks", + "type": "string" + } }, - "truncated": { - "const": false - } + "required": [ + "tool" + ], + "type": "object" }, - "required": [ - "encoding", - "data", - "bytes", - "truncated" - ], - "type": "object" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "scope": { + "description": "Caller-controlled scope.", + "enum": [ + "server", + "global_session", + "global_window", + "session", + "window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Caller-controlled target.", + "type": "string" + } }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" + "required": [ + "name" + ], + "type": "object" + }, + "tool": { + "const": "show_option", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": false, + "properties": { + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } }, - "kind": { - "const": "pane" - } + "required": [ + "paneId" + ], + "type": "object" }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } + "tool": { + "const": "snapshot_pane", + "type": "string" + } + }, + "required": [ + "tool" + ], + "type": "object" + } + ] }, - "required": [ - "target", - "authorization", - "completion", - "stdout", - "stderr" - ], - "type": "object" - }, - "ok": { - "const": true + "maxItems": 16, + "minItems": 1, + "type": "array" } }, "required": [ - "ok", - "data" + "operations" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "call_read_tools_batch", + "nestedAuthority": [ + "capture_pane", + "capture_since", + "find_pane_by_position", + "get_pane_info", + "get_server_info", + "get_session_info", + "get_tmux_variables", + "get_window_info", + "list_panes", + "list_sessions", + "list_windows", + "search_panes", + "show_environment", + "show_hooks", + "show_option", + "snapshot_pane" + ], + "outputClasses": [ + "configured-command", + "process-environment", + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "authorization": { - "oneOf": [ - { + "failed": { + "type": "integer" + }, + "onError": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": false, + "properties": { + "error": { + "type": [ + "string", + "null" + ] + }, + "index": { + "type": "integer" + }, + "result": { + "additionalProperties": false, + "properties": { + "content": { + "items": { "additionalProperties": false, "properties": { - "enrollment_generation": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" - }, - "pane_id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "process_generation": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" - }, - "run_id": { - "maxLength": 32, - "pattern": "^[a-f0-9]{32}$", - "type": "string" - }, - "script_digest": { - "maxLength": 64, - "pattern": "^[a-f0-9]{64}$", + "text": { "type": "string" }, - "server_generation": { - "maxLength": 128, - "minLength": 1, + "type": { "type": "string" - }, - "state": { - "const": "authorized" - } - }, - "required": [ - "state", - "run_id", - "script_digest", - "server_generation", - "pane_id", - "enrollment_generation", - "process_generation" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "completion": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "state": { - "const": "unobserved" - } - }, - "required": [ - "state" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "exit_status": { - "maximum": 255, - "minimum": 0, - "type": "integer" - }, - "signal": { - "type": "null" - }, - "state": { - "const": "exited" } }, "required": [ - "state", - "exit_status", - "signal" + "text", + "type" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "exit_status": { - "type": "null" - }, - "signal": { - "maximum": 255, - "minimum": 1, - "type": "integer" - }, - "state": { - "const": "signaled" - } - }, - "required": [ - "state", - "exit_status", - "signal" - ], - "type": "object" - } - ] + "type": "array" + }, + "isError": { + "type": "boolean" + }, + "structuredContent": {} }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } + "required": [ + "content", + "structuredContent", + "isError" + ], + "type": [ + "object", + "null" + ] }, - "required": [ - "state", - "authorization", - "completion" - ], - "type": "object" + "resultTruncated": { + "type": "boolean" + }, + "success": { + "type": "boolean" + }, + "tool": { + "type": "string" + } }, - "message": { - "type": "string" - } + "required": [ + "error", + "index", + "result", + "resultTruncated", + "success", + "tool" + ], + "type": "object" }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" + "type": "array" }, - "ok": { - "const": false + "stoppedAt": { + "type": [ + "integer", + "null" + ] + }, + "succeeded": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBytes": { + "type": "integer" } }, "required": [ - "ok", - "error" + "failed", + "onError", + "results", + "stoppedAt", + "succeeded", + "truncated", + "truncatedBytes" ], "type": "object" - } - ] - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Call read tools batch", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } } }, { - "name": "send", - "wireName": "tmux_send", + "name": "capture_pane", + "wireName": "capture_pane", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 243 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 4 }, - "description": "Send literal UTF-8 text or named keys to one exact pane. Opt-in mutation; 64 KiB total text bytes, at most 256 keys. Reports tmux client completion and input dispatch only; never shell completion.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return a bounded slice of rendered pane text.", "schemaStatus": "runtime", - "enabledByDefault": false, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { + "additionalProperties": false, + "properties": { + "end": { + "description": "Caller-controlled end.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + }, + "joinWrapped": { + "description": "Caller-controlled joinWrapped.", + "type": "boolean" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "start": { + "description": "Caller-controlled start.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "droppedLines", + "lines", + "paneId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Capture pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return a bounded slice of rendered pane text.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "input": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 65536, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "type": { - "const": "text" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "maxLength": 65536, - "minLength": 1, - "pattern": "^[^\\u0000]*$", - "type": "string" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - "type": { - "const": "keys" - } - }, - "required": [ - "type", - "keys" - ], - "type": "object" - } - ] + "end": { + "description": "Caller-controlled end.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] + "joinWrapped": { + "description": "Caller-controlled joinWrapped.", + "type": "boolean" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "start": { + "description": "Caller-controlled start.", + "maximum": 32767, + "minimum": -2147483648, + "type": "integer" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_pane", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "paneId": { + "type": "string" } }, "required": [ - "target", - "input" + "droppedLines", + "lines", + "paneId" ], "type": "object" + }, + "processReach": "none", + "title": "Capture pane", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "capture_since", + "wireName": "capture_since", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 5 + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return output after an opaque pane cursor.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "waitMs": { + "description": "Caller-controlled waitMs.", + "maximum": 10000, + "minimum": 0, + "type": "integer" } + }, + "required": [ + "paneId" ], "type": "object" }, "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { + "additionalProperties": false, + "properties": { + "cursor": { + "type": "string" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "linesMissed": { + "type": "boolean" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "restarted": { + "type": "boolean" + } + }, + "required": [ + "cursor", + "droppedLines", + "lines", + "linesMissed", + "pane", + "paneRef", + "restarted" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Capture since" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return output after an opaque pane cursor.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "data": { - "additionalProperties": false, - "properties": { - "client_exit_status": { - "const": 0 - }, - "completion": { - "const": "dispatch_only" - }, - "delivery": { - "const": "observed" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "delivery", - "client_exit_status", - "completion" - ], - "type": "object" + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" }, - "ok": { - "const": true + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "waitMs": { + "description": "Caller-controlled waitMs.", + "maximum": 10000, + "minimum": 0, + "type": "integer" } }, "required": [ - "ok", - "data" + "paneId" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "capture_since", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } - }, - "required": [ - "state", - "created" - ], - "type": "object" - }, - "message": { - "type": "string" - } + "cursor": { + "type": "string" + }, + "droppedLines": { + "type": "integer" + }, + "lines": { + "items": { + "type": "string" }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" + "type": "array" }, - "ok": { - "const": false + "linesMissed": { + "type": "boolean" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "restarted": { + "type": "boolean" } }, "required": [ - "ok", - "error" + "cursor", + "droppedLines", + "lines", + "linesMissed", + "pane", + "paneRef", + "restarted" ], "type": "object" + }, + "processReach": "none", + "title": "Capture since", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "clear_pane_scrollback", + "wireName": "clear_pane_scrollback", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 47 + }, + "description": "Delete tmux state; accepts no command payload. Irreversibly discard retained scrollback for one pane.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } - ] + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "deleted", + "paneId" + ], + "type": "object" }, "annotations": { "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false - } - }, - { - "name": "snapshot", - "wireName": "tmux_snapshot", - "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 6 + "openWorldHint": true, + "readOnlyHint": false, + "title": "Clear pane scrollback" }, - "description": "Capture ordered metadata and evaluate Ruby criteria locally. Pages retain one immutable capture; expired cursors require a new query. Limit defaults to 50 records, maximum 200.", - "schemaStatus": "runtime", - "enabledByDefault": true, - "inputSchema": { - "$defs": { - "client": { + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Irreversibly discard retained scrollback for one pane.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "and": { - "items": { - "$ref": "#/$defs/client" - }, - "maxItems": 2048, - "type": "array" - }, - "controlMode": { - "$ref": "#/$defs/client.control_mode" - }, - "created": { - "$ref": "#/$defs/client.created" - }, - "height": { - "$ref": "#/$defs/client.height" - }, - "name": { - "$ref": "#/$defs/client.name" - }, - "not": { - "$ref": "#/$defs/client" - }, - "or": { - "items": { - "$ref": "#/$defs/client" - }, - "maxItems": 2048, - "type": "array" - }, - "pid": { - "$ref": "#/$defs/client.pid" - }, - "readOnly": { - "$ref": "#/$defs/client.read_only" - }, - "session": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "anyOf": [ - { - "$ref": "#/$defs/session" - }, - { - "type": "null" - } - ] - }, - "isNot": { - "anyOf": [ - { - "$ref": "#/$defs/session" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "sessionId": { - "$ref": "#/$defs/client.session_id" - }, - "tty": { - "$ref": "#/$defs/client.tty" - }, - "utf8": { - "$ref": "#/$defs/client.utf8" - }, - "width": { - "$ref": "#/$defs/client.width" + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } }, + "required": [ + "paneId" + ], "type": "object" }, - "client.control_mode": { - "anyOf": [ - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "clear_pane_scrollback", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "type": "boolean" - }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.control_mode" - } - }, - "type": "object" + "paneId": { + "type": "string" } - ] + }, + "required": [ + "deleted", + "paneId" + ], + "type": "object" }, - "client.created": { - "anyOf": [ - { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "gt": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "gte": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "in": { - "items": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "lte": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/client.created" - } - }, - "type": "object" - } - ] + "processReach": "none", + "title": "Clear pane scrollback", + "tmuxEffects": [ + "delete" + ], + "toolset": "teardown" + } + } + }, + { + "name": "create_session", + "wireName": "create_session", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 37 + }, + "description": "Start a pane's configured process; accepts no command payload. Create a detached session with a configured pane process.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Caller-controlled height.", + "minimum": 1, + "type": "integer" }, - "client.height": { - "anyOf": [ - { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/client.height" - } - }, - "type": "object" - } - ] + "name": { + "description": "Caller-controlled name.", + "type": "string" }, - "client.name": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.name" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" - } - ] + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" }, - "client.pid": { - "anyOf": [ - { - "maximum": 2147483647, - "minimum": 0, + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "windowName": { + "description": "Caller-controlled windowName.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "isAttached": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "windowCount": { + "type": "integer" + } + }, + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create session" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Create a detached session with a configured pane process.", + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once", + "windowName": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Caller-controlled height.", + "minimum": 1, "type": "integer" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/client.pid" - } - }, - "type": "object" + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" + }, + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "windowName": { + "description": "Caller-controlled windowName.", + "type": "string" } - ] + }, + "required": [ + "name" + ], + "type": "object" }, - "client.read_only": { - "anyOf": [ - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_session", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "isAttached": { "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "type": "boolean" - }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.read_only" - } - }, - "type": "object" - } - ] - }, - "client.session_id": { - "anyOf": [ - { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] + "name": { + "type": "string" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] - }, - "in": { - "items": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.session_id" - } - }, - "type": "object" + "ref": { + "type": "string" + }, + "windowCount": { + "type": "integer" } - ] + }, + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], + "type": "object" }, - "client.tty": { - "anyOf": [ - { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] + "processReach": "configured-process", + "title": "Create session", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "create_window", + "wireName": "create_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 38 + }, + "description": "Start a pane's configured process; accepts no command payload. Create a window with a configured pane process.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "linkRef": { + "type": "string" + }, + "name": { + "type": "string" + }, + "paneCount": { + "type": "integer" + }, + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowRef": { + "type": "string" + } + }, + "required": [ + "height", + "id", + "index", + "isActive", + "linkRef", + "name", + "paneCount", + "sessionID", + "target", + "width", + "windowRef" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Create window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Create a window with a configured pane process.", + "inputLiteralization": { + "name": "double-hash-once", + "startDirectory": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] - }, - "in": { - "items": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.tty" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" } - ] + }, + "required": [ + "session" + ], + "type": "object" }, - "client.utf8": { - "anyOf": [ - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "create_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "type": "boolean" - }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/client.utf8" - } - }, - "type": "object" - } - ] - }, - "client.width": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, + "linkRef": { + "type": "string" + }, + "name": { + "type": "string" + }, + "paneCount": { "type": "integer" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/client.width" - } - }, - "type": "object" + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowRef": { + "type": "string" } - ] + }, + "required": [ + "height", + "id", + "index", + "isActive", + "linkRef", + "name", + "paneCount", + "sessionID", + "target", + "width", + "windowRef" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Create window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "find_pane_by_position", + "wireName": "find_pane_by_position", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 6 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find a pane occupying a named window corner.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "corner": { + "description": "Caller-controlled corner.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { "pane": { "additionalProperties": false, "properties": { - "active": { - "$ref": "#/$defs/pane.active" - }, - "and": { - "items": { - "$ref": "#/$defs/pane" - }, - "maxItems": 2048, - "type": "array" - }, "currentCommand": { - "$ref": "#/$defs/pane.current_command" + "type": "string" }, "currentPath": { - "$ref": "#/$defs/pane.current_path" - }, - "dead": { - "$ref": "#/$defs/pane.dead" - }, - "deadStatus": { - "$ref": "#/$defs/pane.dead_status" + "type": "string" }, "height": { - "$ref": "#/$defs/pane.height" + "type": "integer" }, "id": { - "$ref": "#/$defs/pane.id" + "type": "string" }, "index": { - "$ref": "#/$defs/pane.index" + "type": "integer" }, - "not": { - "$ref": "#/$defs/pane" + "isActive": { + "type": "boolean" }, - "or": { - "items": { - "$ref": "#/$defs/pane" - }, - "maxItems": 2048, - "type": "array" + "isAtBottom": { + "type": "boolean" }, - "pid": { - "$ref": "#/$defs/pane.pid" + "isAtLeft": { + "type": "boolean" }, - "title": { - "$ref": "#/$defs/pane.title" + "isAtRight": { + "type": "boolean" }, - "width": { - "$ref": "#/$defs/pane.width" + "isAtTop": { + "type": "boolean" }, - "window": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "$ref": "#/$defs/window" - }, - "isNot": { - "$ref": "#/$defs/window" - } - }, - "type": "object" + "isDead": { + "type": "boolean" }, - "windowId": { - "$ref": "#/$defs/pane.window_id" + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" } }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Find pane by position" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "pane.active": { - "anyOf": [ - { - "type": "boolean" + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Find a pane occupying a named window corner.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "corner": { + "description": "Caller-controlled corner.", + "enum": [ + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "type": "string" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "type": "boolean" - }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/pane.active" - } - }, - "type": "object" + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" } - ] + }, + "required": [ + "corner", + "windowId" + ], + "type": "object" }, - "pane.current_command": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "find_pane_by_position", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane": { "additionalProperties": false, - "minProperties": 1, "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/pane.current_command" + "currentCommand": { + "type": "string" }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" - } - ] - }, - "pane.current_path": { - "anyOf": [ - { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "currentPath": { + "type": "string" }, - { - "type": "null" - } - ] - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "height": { + "type": "integer" }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "id": { + "type": "string" }, - "equals": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] + "index": { + "type": "integer" }, - "in": { - "items": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "type": "null" - } - ] - }, - "maxItems": 1024, - "type": "array" + "isActive": { + "type": "boolean" }, - "not": { - "$ref": "#/$defs/pane.current_path" + "isAtBottom": { + "type": "boolean" }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" - } - ] - }, - "pane.dead": { - "anyOf": [ - { - "type": "boolean" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { + "isAtLeft": { "type": "boolean" }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" + "isAtRight": { + "type": "boolean" }, - "not": { - "$ref": "#/$defs/pane.dead" - } - }, - "type": "object" - } - ] - }, - "pane.dead_status": { - "anyOf": [ - { - "anyOf": [ - { - "maximum": 255, - "minimum": 0, - "type": "integer" + "isAtTop": { + "type": "boolean" }, - { - "type": "null" - } - ] - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "anyOf": [ - { - "maximum": 255, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ] + "isDead": { + "type": "boolean" }, - "gt": { - "maximum": 255, - "minimum": 0, - "type": "integer" + "isSynchronized": { + "type": "boolean" }, - "gte": { - "maximum": 255, - "minimum": 0, + "modeCount": { "type": "integer" }, - "in": { - "items": { - "anyOf": [ - { - "maximum": 255, - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 255, - "minimum": 0, - "type": "integer" + "ref": { + "type": "string" }, - "lte": { - "maximum": 255, - "minimum": 0, + "width": { "type": "integer" }, - "not": { - "$ref": "#/$defs/pane.dead_status" + "windowID": { + "type": "string" } }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], "type": "object" } - ] + }, + "required": [ + "pane" + ], + "type": "object" + }, + "processReach": "none", + "title": "Find pane by position", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_pane_info", + "wireName": "get_pane_info", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 7 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one pane.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane": { + "additionalProperties": false, + "properties": { + "currentCommand": { + "type": "string" + }, + "currentPath": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" + } + }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], + "type": "object" + } + }, + "required": [ + "pane" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get pane info" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one pane.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, - "pane.height": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_pane_info", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane": { "additionalProperties": false, - "minProperties": 1, "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "currentCommand": { + "type": "string" }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "currentPath": { + "type": "string" }, - "gte": { - "maximum": 4294967295, - "minimum": 0, + "height": { "type": "integer" }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" + "id": { + "type": "string" }, - "lt": { - "maximum": 4294967295, - "minimum": 0, + "index": { "type": "integer" }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isActive": { + "type": "boolean" }, - "not": { - "$ref": "#/$defs/pane.height" - } - }, - "type": "object" - } - ] - }, - "pane.id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "isAtBottom": { + "type": "boolean" }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" + "isAtLeft": { + "type": "boolean" }, - "not": { - "$ref": "#/$defs/pane.id" - } - }, - "type": "object" - } - ] - }, - "pane.index": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isAtRight": { + "type": "boolean" }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isAtTop": { + "type": "boolean" }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isDead": { + "type": "boolean" }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" + "isSynchronized": { + "type": "boolean" }, - "lt": { - "maximum": 4294967295, - "minimum": 0, + "modeCount": { "type": "integer" }, - "lte": { - "maximum": 4294967295, - "minimum": 0, + "ref": { + "type": "string" + }, + "width": { "type": "integer" }, - "not": { - "$ref": "#/$defs/pane.index" + "windowID": { + "type": "string" } }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], "type": "object" } - ] + }, + "required": [ + "pane" + ], + "type": "object" }, - "pane.pid": { - "anyOf": [ - { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" + "processReach": "none", + "title": "Get pane info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_server_info", + "wireName": "get_server_info", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 8 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return liveness and identity metadata for the selected tmux server.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "running": { + "type": "boolean" + }, + "socketPath": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "running" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get server info" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return liveness and identity metadata for the selected tmux server.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_server_info", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "running": { + "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/pane.pid" - } - }, - "type": "object" + "socketPath": { + "type": "string" + }, + "version": { + "type": "string" } - ] + }, + "required": [ + "running" + ], + "type": "object" }, - "pane.title": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "processReach": "none", + "title": "Get server info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_session_info", + "wireName": "get_session_info", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 9 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "integer" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/pane.title" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" + "id": { + "type": "string" + }, + "isAttached": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "windowCount": { + "type": "integer" } - ] + }, + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], + "type": "object" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get session info" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata for one session.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" }, - "pane.width": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_session_info", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "session": { "additionalProperties": false, - "minProperties": 1, "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, + "createdAt": { "type": "integer" }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "id": { + "type": "string" }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isAttached": { + "type": "boolean" }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" + "name": { + "type": "string" }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "ref": { + "type": "string" }, - "lte": { - "maximum": 4294967295, - "minimum": 0, + "windowCount": { "type": "integer" - }, - "not": { - "$ref": "#/$defs/pane.width" } }, + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], "type": "object" } - ] + }, + "required": [ + "session" + ], + "type": "object" }, - "pane.window_id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/pane.window_id" - } - }, - "type": "object" - } - ] + "processReach": "none", + "title": "Get session info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_tmux_variables", + "wireName": "get_tmux_variables", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 10 + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated variable names without accepting raw format syntax.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "names": { + "description": "Caller-controlled names.", + "items": { + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" + }, + "maxItems": 32, + "type": "array" }, - "session": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "values": { + "additionalProperties": { + "type": [ + "string", + "null" + ] + }, + "type": "object" + } + }, + "required": [ + "values" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get tmux variables" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Resolve validated variable names without accepting raw format syntax.", + "inputLiteralization": { + "names": "validated-variable-name" + }, + "inputSchema": { "additionalProperties": false, "properties": { - "and": { + "names": { + "description": "Caller-controlled names.", "items": { - "$ref": "#/$defs/session" + "pattern": "^[A-Za-z][A-Za-z0-9_]*$", + "type": "string" }, - "maxItems": 2048, + "maxItems": 32, "type": "array" }, - "attached": { - "$ref": "#/$defs/session.attached" - }, - "created": { - "$ref": "#/$defs/session.created" - }, - "currentWindow": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "anyOf": [ - { - "$ref": "#/$defs/window" - }, - { - "type": "null" - } - ] - }, - "isNot": { - "anyOf": [ - { - "$ref": "#/$defs/window" - }, - { - "type": "null" - } - ] - } + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_tmux_variables", + "nestedAuthority": [], + "outputClasses": [ + "configured-command", + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "values": { + "additionalProperties": { + "type": [ + "string", + "null" + ] }, "type": "object" + } + }, + "required": [ + "values" + ], + "type": "object" + }, + "processReach": "none", + "title": "Get tmux variables", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "get_window_info", + "wireName": "get_window_info", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 11 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "placements": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "ref": { + "type": "string" + }, + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "windowID": { + "type": "string" + } + }, + "required": [ + "index", + "isActive", + "ref", + "sessionID", + "target", + "windowID" + ], + "type": "object" + }, + "type": "array" + }, + "window": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" }, "id": { - "$ref": "#/$defs/session.id" + "type": "string" }, "name": { - "$ref": "#/$defs/session.name" - }, - "not": { - "$ref": "#/$defs/session" - }, - "or": { - "items": { - "$ref": "#/$defs/session" - }, - "maxItems": 2048, - "type": "array" - }, - "panes": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "every": { - "$ref": "#/$defs/pane" - }, - "none": { - "$ref": "#/$defs/pane" - }, - "some": { - "$ref": "#/$defs/pane" - } - }, - "type": "object" + "type": "string" }, - "windowCount": { - "$ref": "#/$defs/session.window_count" + "paneCount": { + "type": "integer" }, - "windowLinks": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "every": { - "$ref": "#/$defs/window_link" - }, - "none": { - "$ref": "#/$defs/window_link" - }, - "some": { - "$ref": "#/$defs/window_link" - } - }, - "type": "object" + "ref": { + "type": "string" }, - "windows": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "every": { - "$ref": "#/$defs/window" - }, - "none": { - "$ref": "#/$defs/window" - }, - "some": { - "$ref": "#/$defs/window" - } - }, - "type": "object" + "width": { + "type": "integer" } }, + "required": [ + "height", + "id", + "name", + "paneCount", + "ref", + "width" + ], "type": "object" + } + }, + "required": [ + "placements", + "window" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Get window info" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "session.attached": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. Return metadata and placements for one window.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "get_window_info", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "placements": { + "items": { + "additionalProperties": false, + "properties": { + "index": { "type": "integer" }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isActive": { + "type": "boolean" + }, + "ref": { + "type": "string" + }, + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "windowID": { + "type": "string" + } }, - "not": { - "$ref": "#/$defs/session.attached" - } + "required": [ + "index", + "isActive", + "ref", + "sessionID", + "target", + "windowID" + ], + "type": "object" }, - "type": "object" - } - ] - }, - "session.created": { - "anyOf": [ - { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" + "type": "array" }, - { + "window": { "additionalProperties": false, - "minProperties": 1, "properties": { - "equals": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "gt": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, + "height": { "type": "integer" }, - "gte": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" + "id": { + "type": "string" }, - "in": { - "items": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" + "name": { + "type": "string" }, - "lt": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, + "paneCount": { "type": "integer" }, - "lte": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" + "ref": { + "type": "string" }, - "not": { - "$ref": "#/$defs/session.created" + "width": { + "type": "integer" } }, + "required": [ + "height", + "id", + "name", + "paneCount", + "ref", + "width" + ], "type": "object" } - ] + }, + "required": [ + "placements", + "window" + ], + "type": "object" }, - "session.id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "processReach": "none", + "title": "Get window info", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "kill_pane", + "wireName": "kill_pane", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 48 + }, + "description": "Delete tmux state; accepts no command payload. Delete one pane and its running process.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "deleted", + "paneId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Kill pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Delete one pane and its running process.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/session.id" - } - }, - "type": "object" + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } - ] + }, + "required": [ + "paneId" + ], + "type": "object" }, - "session.name": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "kill_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/session.name" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" + "paneId": { + "type": "string" } - ] + }, + "required": [ + "deleted", + "paneId" + ], + "type": "object" }, - "session.window_count": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "processReach": "none", + "title": "Kill pane", + "tmuxEffects": [ + "delete", + "observe" + ], + "toolset": "teardown" + } + } + }, + { + "name": "kill_session", + "wireName": "kill_session", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 49 + }, + "description": "Delete tmux state; accepts no command payload. Delete one session and every window it owns.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "deleted", + "sessionId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Kill session" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Delete one session and every window it owns.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/session.window_count" - } - }, - "type": "object" + "session": { + "description": "Caller-controlled session.", + "type": "string" } - ] + }, + "required": [ + "session" + ], + "type": "object" }, - "window": { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "kill_session", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "activePane": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "anyOf": [ - { - "$ref": "#/$defs/pane" - }, - { - "type": "null" - } - ] - }, - "isNot": { - "anyOf": [ - { - "$ref": "#/$defs/pane" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - }, - "and": { - "items": { - "$ref": "#/$defs/window" - }, - "maxItems": 2048, - "type": "array" - }, - "height": { - "$ref": "#/$defs/window.height" - }, - "id": { - "$ref": "#/$defs/window.id" - }, - "layout": { - "$ref": "#/$defs/window.layout" - }, - "name": { - "$ref": "#/$defs/window.name" - }, - "not": { - "$ref": "#/$defs/window" - }, - "or": { - "items": { - "$ref": "#/$defs/window" - }, - "maxItems": 2048, - "type": "array" - }, - "paneCount": { - "$ref": "#/$defs/window.pane_count" - }, - "panes": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "every": { - "$ref": "#/$defs/pane" - }, - "none": { - "$ref": "#/$defs/pane" - }, - "some": { - "$ref": "#/$defs/pane" - } - }, - "type": "object" - }, - "width": { - "$ref": "#/$defs/window.width" - }, - "windowLinks": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "every": { - "$ref": "#/$defs/window_link" - }, - "none": { - "$ref": "#/$defs/window_link" - }, - "some": { - "$ref": "#/$defs/window_link" - } - }, - "type": "object" + "deleted": { + "type": "boolean" + }, + "sessionId": { + "type": "string" } }, + "required": [ + "deleted", + "sessionId" + ], "type": "object" }, - "window_link": { + "processReach": "none", + "title": "Kill session", + "tmuxEffects": [ + "delete", + "observe" + ], + "toolset": "teardown" + } + } + }, + { + "name": "kill_window", + "wireName": "kill_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 50 + }, + "description": "Delete tmux state; accepts no command payload. Delete one window and every pane it owns.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "deleted", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Kill window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Delete tmux state; accepts no command payload. Delete one window and every pane it owns.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "active": { - "$ref": "#/$defs/window_link.active" - }, - "and": { - "items": { - "$ref": "#/$defs/window_link" - }, - "maxItems": 2048, - "type": "array" - }, - "index": { - "$ref": "#/$defs/window_link.index" - }, - "not": { - "$ref": "#/$defs/window_link" - }, - "or": { - "items": { - "$ref": "#/$defs/window_link" - }, - "maxItems": 2048, - "type": "array" - }, - "session": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "$ref": "#/$defs/session" - }, - "isNot": { - "$ref": "#/$defs/session" - } - }, - "type": "object" - }, - "sessionId": { - "$ref": "#/$defs/window_link.session_id" - }, - "window": { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "is": { - "$ref": "#/$defs/window" - }, - "isNot": { - "$ref": "#/$defs/window" - } - }, - "type": "object" + "force": { + "description": "Caller-controlled force.", + "type": "boolean" }, "windowId": { - "$ref": "#/$defs/window_link.window_id" + "description": "Caller-controlled windowId.", + "type": "string" } }, + "required": [ + "windowId" + ], "type": "object" }, - "window_link.active": { - "anyOf": [ - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "kill_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "deleted": { "type": "boolean" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "type": "boolean" - }, - "in": { - "items": { - "type": "boolean" - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window_link.active" - } - }, - "type": "object" + "windowId": { + "type": "string" } - ] + }, + "required": [ + "deleted", + "windowId" + ], + "type": "object" }, - "window_link.index": { - "anyOf": [ - { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/window_link.index" - } - }, - "type": "object" - } - ] + "processReach": "none", + "title": "Kill window", + "tmuxEffects": [ + "delete", + "observe" + ], + "toolset": "teardown" + } + } + }, + { + "name": "list_panes", + "wireName": "list_panes", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 12 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List panes, optionally within a session or window.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" }, - "window_link.session_id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window_link.session_id" - } + "window": { + "description": "Caller-controlled window.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "currentCommand": { + "type": "string" }, - "type": "object" - } - ] - }, - "window_link.window_id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window_link.window_id" - } + "currentPath": { + "type": "string" }, - "type": "object" - } - ] - }, - "window.height": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/window.height" - } + "height": { + "type": "integer" }, - "type": "object" - } - ] - }, - "window.id": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window.id" - } + "id": { + "type": "string" }, - "type": "object" - } - ] + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" + } + }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "panes" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "List panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "window.layout": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List panes, optionally within a session or window.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window.layout" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" + "window": { + "description": "Caller-controlled window.", + "type": "string" } - ] + }, + "required": [], + "type": "object" }, - "window.name": { - "anyOf": [ - { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "contains": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "endsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "equals": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - }, - "in": { - "items": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_panes", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "panes": { + "items": { + "additionalProperties": false, + "properties": { + "currentCommand": { + "type": "string" }, - "maxItems": 1024, - "type": "array" - }, - "not": { - "$ref": "#/$defs/window.name" - }, - "startsWith": { - "maxLength": 65536, - "type": "string", - "x-maxUtf8Bytes": 65536 - } - }, - "type": "object" - } - ] - }, - "window.pane_count": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, + "currentPath": { + "type": "string" + }, + "height": { "type": "integer" }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "not": { - "$ref": "#/$defs/window.pane_count" - } - }, - "type": "object" - } - ] - }, - "window.width": { - "anyOf": [ - { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - { - "additionalProperties": false, - "minProperties": 1, - "properties": { - "equals": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "gte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "in": { - "items": { - "maximum": 4294967295, - "minimum": 0, + "id": { + "type": "string" + }, + "index": { "type": "integer" }, - "maxItems": 1024, - "type": "array" - }, - "lt": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "lte": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" + } }, - "not": { - "$ref": "#/$defs/window.width" - } + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" + ], + "type": "object" }, - "type": "object" + "type": "array" } - ] - } - }, - "$schema": "https://json-schema.org/draft/2020-12/schema", - "additionalProperties": false, - "oneOf": [ - { - "not": { - "required": [ - "cursor" - ] }, "required": [ - "entity" - ] + "panes" + ], + "type": "object" }, - { - "not": { - "anyOf": [ - { - "required": [ - "entity" - ] - }, - { - "required": [ - "criteria" - ] - }, - { - "required": [ - "limit" - ] - } - ] - }, - "required": [ - "cursor" - ] - } - ], + "processReach": "none", + "title": "List panes", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "list_sessions", + "wireName": "list_sessions", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 13 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List sessions on the selected server.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, "properties": { - "criteria": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "entity": { - "const": "session" - }, - "profile": { - "const": "libtmux-ruby.where" - }, - "version": { - "const": 1, - "type": "integer" - }, - "where": { - "$ref": "#/$defs/session" - } + "sessions": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "integer" }, - "required": [ - "profile", - "version", - "entity", - "where" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "entity": { - "const": "window" - }, - "profile": { - "const": "libtmux-ruby.where" - }, - "version": { - "const": 1, - "type": "integer" - }, - "where": { - "$ref": "#/$defs/window" - } + "id": { + "type": "string" }, - "required": [ - "profile", - "version", - "entity", - "where" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "entity": { - "const": "pane" - }, - "profile": { - "const": "libtmux-ruby.where" - }, - "version": { - "const": 1, - "type": "integer" - }, - "where": { - "$ref": "#/$defs/pane" - } + "isAttached": { + "type": "boolean" }, - "required": [ - "profile", - "version", - "entity", - "where" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "entity": { - "const": "window_link" - }, - "profile": { - "const": "libtmux-ruby.where" - }, - "version": { - "const": 1, - "type": "integer" - }, - "where": { - "$ref": "#/$defs/window_link" - } + "name": { + "type": "string" }, - "required": [ - "profile", - "version", - "entity", - "where" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "entity": { - "const": "client" - }, - "profile": { - "const": "libtmux-ruby.where" - }, - "version": { - "const": 1, - "type": "integer" - }, - "where": { - "$ref": "#/$defs/client" - } + "ref": { + "type": "string" }, - "required": [ - "profile", - "version", - "entity", - "where" - ], - "type": "object" - } - ] - }, - "cursor": { - "maxLength": 43, - "pattern": "^[a-f0-9]{32}:[0-9]{1,10}$", - "type": "string" - }, - "entity": { - "enum": [ - "session", - "window", - "pane", - "window_link", - "client" - ] - }, - "limit": { - "maximum": 200, - "minimum": 1, - "type": "integer" + "windowCount": { + "type": "integer" + } + }, + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], + "type": "object" + }, + "type": "array" } }, - "required": [], + "required": [ + "sessions" + ], "type": "object" }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "data": { - "additionalProperties": false, - "properties": { - "capture_id": { - "type": "string" - }, - "coverage": { - "additionalProperties": { - "enum": [ - "complete", - "unloaded" - ] - }, - "type": "object" - }, - "entity": { - "enum": [ - "session", - "window", - "pane", - "window_link", - "client" - ] - }, - "interval": { - "additionalProperties": false, - "properties": { - "clock": { - "const": "monotonic_seconds" - }, - "finished": { - "type": "number" - }, - "reads": { - "minimum": 0, - "type": "integer" - }, - "started": { - "type": "number" - } - }, - "required": [ - "clock", - "started", - "finished", - "reads" - ], - "type": "object" - }, - "items": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "fields": { - "additionalProperties": false, - "properties": { - "attached": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "created": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "windowCount": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "id", - "name", - "created", - "attached", - "windowCount" - ], - "type": "object" - }, - "kind": { - "const": "session" - }, - "ref": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "kind", - "fields", - "ref" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "fields": { - "additionalProperties": false, - "properties": { - "height": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "id": { - "type": "string" - }, - "layout": { - "type": "string" - }, - "name": { - "type": "string" - }, - "paneCount": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "width": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "id", - "name", - "width", - "height", - "paneCount", - "layout" - ], - "type": "object" - }, - "kind": { - "const": "window" - }, - "ref": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "kind", - "fields", - "ref" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "fields": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "currentCommand": { - "type": "string" - }, - "currentPath": { - "type": [ - "string", - "null" - ] - }, - "dead": { - "type": "boolean" - }, - "deadStatus": { - "maximum": 255, - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "height": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "id": { - "type": "string" - }, - "index": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "pid": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "width": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "id", - "windowId", - "index", - "pid", - "currentCommand", - "currentPath", - "title", - "active", - "dead", - "deadStatus", - "width", - "height" - ], - "type": "object" - }, - "kind": { - "const": "pane" - }, - "ref": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "kind", - "fields", - "ref" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "fields": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "index": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "sessionId": { - "type": "string" - }, - "windowId": { - "type": "string" - } - }, - "required": [ - "sessionId", - "windowId", - "index", - "active" - ], - "type": "object" - }, - "kind": { - "const": "window_link" - }, - "ref": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - } - }, - "required": [ - "kind", - "fields", - "ref" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "fields": { - "additionalProperties": false, - "properties": { - "controlMode": { - "type": "boolean" - }, - "created": { - "maximum": 9223372036854776000, - "minimum": -9223372036854776000, - "type": "integer" - }, - "height": { - "maximum": 4294967295, - "minimum": 0, - "type": [ - "integer", - "null" - ] - }, - "name": { - "type": "string" - }, - "pid": { - "maximum": 2147483647, - "minimum": 0, - "type": "integer" - }, - "readOnly": { - "type": "boolean" - }, - "sessionId": { - "type": [ - "string", - "null" - ] - }, - "tty": { - "type": [ - "string", - "null" - ] - }, - "utf8": { - "type": "boolean" - }, - "width": { - "maximum": 4294967295, - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "name", - "pid", - "created", - "tty", - "sessionId", - "width", - "height", - "readOnly", - "utf8", - "controlMode" - ], - "type": "object" - }, - "kind": { - "const": "client" - }, - "ref": { - "type": "null" - } - }, - "required": [ - "kind", - "fields", - "ref" - ], - "type": "object" - } - ] + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "List sessions" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List sessions on the selected server.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_sessions", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "sessions": { + "items": { + "additionalProperties": false, + "properties": { + "createdAt": { + "type": "integer" }, - "maxItems": 200, - "type": "array" - }, - "next_cursor": { - "type": "string" + "id": { + "type": "string" + }, + "isAttached": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "windowCount": { + "type": "integer" + } }, - "server_identity": { - "additionalProperties": false, - "properties": { - "generation": { - "type": "string" - }, - "pid": { - "type": "integer" - }, - "start_time": { - "type": "integer" - }, - "tmux_version": { - "type": "string" - } + "required": [ + "createdAt", + "id", + "isAttached", + "name", + "ref", + "windowCount" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "sessions" + ], + "type": "object" + }, + "processReach": "none", + "title": "List sessions", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "list_windows", + "wireName": "list_windows", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 14 + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List windows, optionally within one session.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "linkRef": { + "type": "string" + }, + "name": { + "type": "string" + }, + "paneCount": { + "type": "integer" + }, + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowRef": { + "type": "string" + } + }, + "required": [ + "height", + "id", + "index", + "isActive", + "linkRef", + "name", + "paneCount", + "sessionID", + "target", + "width", + "windowRef" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "windows" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "List windows" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Inspect tmux metadata; accepts no client-supplied executable input. List windows, optionally within one session.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "list_windows", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "windows": { + "items": { + "additionalProperties": false, + "properties": { + "height": { + "type": "integer" }, - "required": [ - "generation", - "pid", - "start_time", - "tmux_version" - ], - "type": "object" + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "linkRef": { + "type": "string" + }, + "name": { + "type": "string" + }, + "paneCount": { + "type": "integer" + }, + "sessionID": { + "type": "string" + }, + "target": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowRef": { + "type": "string" + } }, - "truncated": { - "type": "boolean" - } + "required": [ + "height", + "id", + "index", + "isActive", + "linkRef", + "name", + "paneCount", + "sessionID", + "target", + "width", + "windowRef" + ], + "type": "object" }, - "required": [ - "capture_id", - "server_identity", - "entity", - "items", - "coverage", - "interval", - "truncated" + "type": "array" + } + }, + "required": [ + "windows" + ], + "type": "object" + }, + "processReach": "none", + "title": "List windows", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "move_window", + "wireName": "move_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 22 + }, + "description": "Change tmux state; no client-supplied executable input. Move one window appearance to another session.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "index": { + "description": "Caller-controlled index.", + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "sourceIndex": { + "description": "Caller-controlled sourceIndex.", + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Caller-controlled sourceSession.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "target": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "target", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Move window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Move one window appearance to another session.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "index": { + "description": "Caller-controlled index.", + "minimum": 0, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + }, + "sourceIndex": { + "description": "Caller-controlled sourceIndex.", + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Caller-controlled sourceSession.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "move_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "target": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "target", + "windowId" + ], + "type": "object" + }, + "processReach": "none", + "title": "Move window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "paste_text", + "wireName": "paste_text", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 39 + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste literal text and an optional newline target-only after two state checks.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "description": "Caller-controlled enter.", + "type": "boolean" + }, + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "text": { + "description": "Caller-controlled text.", + "type": "string" + } + }, + "required": [ + "paneId", + "text" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "characters": { + "type": "integer" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + } + }, + "required": [ + "characters", + "pane", + "paneRef" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Paste text" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Paste literal text and an optional newline target-only after two state checks.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "description": "Caller-controlled enter.", + "type": "boolean" + }, + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "text": { + "description": "Caller-controlled text.", + "type": "string" + } + }, + "required": [ + "paneId", + "text" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "paste_text", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "characters": { + "type": "integer" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + } + }, + "required": [ + "characters", + "pane", + "paneRef" + ], + "type": "object" + }, + "processReach": "pane-input", + "title": "Paste text", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "rename_session", + "wireName": "rename_session", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 23 + }, + "description": "Change tmux state; no client-supplied executable input. Set a literal-safe session name.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "name", + "session" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "name", + "sessionId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rename session" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set a literal-safe session name.", + "inputLiteralization": { + "name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "name", + "session" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "rename_session", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "sessionId": { + "type": "string" + } + }, + "required": [ + "name", + "sessionId" + ], + "type": "object" + }, + "processReach": "none", + "title": "Rename session", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "rename_window", + "wireName": "rename_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 24 + }, + "description": "Change tmux state; no client-supplied executable input. Set a literal-safe window name.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Rename window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set a literal-safe window name.", + "inputLiteralization": { + "name": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "rename_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "name", + "windowId" + ], + "type": "object" + }, + "processReach": "none", + "title": "Rename window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "resize_pane", + "wireName": "resize_pane", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 25 + }, + "description": "Change tmux state; no client-supplied executable input. Resize one pane by dimensions or a directional amount.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Caller-controlled amount.", + "minimum": 1, + "type": "integer" + }, + "direction": { + "description": "Caller-controlled direction.", + "enum": [ + "up", + "down", + "left", + "right" + ], + "type": "string" + }, + "height": { + "description": "Caller-controlled height.", + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "zoom": { + "description": "Caller-controlled zoom.", + "type": "boolean" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Resize pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Resize one pane by dimensions or a directional amount.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "amount": { + "description": "Caller-controlled amount.", + "minimum": 1, + "type": "integer" + }, + "direction": { + "description": "Caller-controlled direction.", + "enum": [ + "up", + "down", + "left", + "right" ], - "type": "object" + "type": "string" + }, + "height": { + "description": "Caller-controlled height.", + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "zoom": { + "description": "Caller-controlled zoom.", + "type": "boolean" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "resize_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "processReach": "none", + "title": "Resize pane", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "resize_window", + "wireName": "resize_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 26 + }, + "description": "Change tmux state; no client-supplied executable input. Resize the terminal dimensions reported for one window.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Caller-controlled height.", + "minimum": 1, + "type": "integer" + }, + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "windowId": { + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Resize window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Resize the terminal dimensions reported for one window.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Caller-controlled height.", + "minimum": 1, + "type": "integer" }, - "ok": { - "const": true + "width": { + "description": "Caller-controlled width.", + "minimum": 1, + "type": "integer" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" } }, "required": [ - "ok", - "data" + "windowId" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "resize_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } - }, - "required": [ - "state", - "created" - ], - "type": "object" - }, - "message": { - "type": "string" - } - }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" - }, - "ok": { - "const": false + "windowId": { + "type": "string" } }, "required": [ - "ok", - "error" + "windowId" ], "type": "object" + }, + "processReach": "none", + "title": "Resize window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "respawn_pane", + "wireName": "respawn_pane", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 40 + }, + "description": "Start a pane's configured process; accepts no command payload. Restart only the pane's configured process; no caller command is accepted.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "killFirst": { + "description": "Caller-controlled killFirst.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" } - ] + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + } + }, + "required": [ + "pane", + "paneRef" + ], + "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false + "openWorldHint": true, + "readOnlyHint": false, + "title": "Respawn pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Start a pane's configured process; accepts no command payload. Restart only the pane's configured process; no caller command is accepted.", + "inputLiteralization": { + "startDirectory": "double-hash-once" + }, + "inputSchema": { + "additionalProperties": false, + "properties": { + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "killFirst": { + "description": "Caller-controlled killFirst.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "respawn_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + } + }, + "required": [ + "pane", + "paneRef" + ], + "type": "object" + }, + "processReach": "configured-process", + "title": "Respawn pane", + "tmuxEffects": [ + "change", + "delete", + "observe" + ], + "toolset": "execute" + } } }, { - "name": "wait", - "wireName": "tmux_wait", + "name": "run_shell_command", + "wireName": "run_shell_command", "source": { - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "file": "gems/libtmux-mcp/lib/libtmux/mcp/catalog.rb", - "line": 241 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 41 }, - "description": "Wait for observed literal screen text or the initial pane process exit. Deadline in seconds is capped by the application limit. Uses control events/process descriptors; no polling. Requires tmux>=3.3 and Linux peer pidfds with matching PID namespaces or Darwin kqueue process observation. Reports observed evidence, never remote termination caused by cancellation or an inferred process exit status.", + "description": "Run a shell command in a pane with your user's permissions. Run one command in a singular trusted POSIX shell and return bounded output.", "schemaStatus": "runtime", - "enabledByDefault": false, "inputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { + "additionalProperties": false, + "properties": { + "command": { + "description": "Caller-controlled command.", + "type": "string" + }, + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "command", + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "droppedLines": { + "type": "integer" + }, + "effectiveTimeout": { + "type": "number" + }, + "exitStatus": { + "type": [ + "integer", + "null" + ] + }, + "linesMissed": { + "type": "boolean" + }, + "output": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "seconds": { + "type": "number" + }, + "timedOut": { + "type": "boolean" + } + }, + "required": [ + "droppedLines", + "effectiveTimeout", + "exitStatus", + "linesMissed", + "output", + "pane", + "paneRef", + "seconds", + "timedOut" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Run shell command" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Run a shell command in a pane with your user's permissions. Run one command in a singular trusted POSIX shell and return bounded output.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "condition": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "text": { - "maxLength": 4096, - "minLength": 1, - "type": "string" - }, - "type": { - "const": "screen_contains" - } - }, - "required": [ - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "type": { - "const": "process_exit" - } - }, - "required": [ - "type" - ], - "type": "object" - } - ] - }, - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" + "command": { + "description": "Caller-controlled command.", + "type": "string" }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" + "force": { + "description": "Caller-controlled force.", + "type": "boolean" }, - "max_lines": { - "maximum": 1000, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, "minimum": 1, "type": "integer" }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" }, - "timeout": { - "exclusiveMinimum": 0, - "maximum": 60, - "type": "number" + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" } }, "required": [ - "target", - "condition" + "command", + "paneId" ], "type": "object" - } - ], - "type": "object" - }, - "outputSchema": { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "oneOf": [ - { + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "run_shell_command", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "data": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "capture": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" - }, - "capture_id": { - "type": "string" - }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] - }, - "history_continuity": { - "const": "unknown" - }, - "interval": { - "additionalProperties": false, - "properties": { - "clock": { - "const": "monotonic_seconds" - }, - "finished": { - "type": "number" - }, - "started": { - "type": "number" - } - }, - "required": [ - "clock", - "started", - "finished" - ], - "type": "object" - }, - "mode": { - "const": "snapshot" - }, - "next_cursor": { - "type": "string" - }, - "process_generation": { - "type": [ - "string", - "null" - ] - }, - "row_count": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "rows": { - "items": { - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "scope": { - "additionalProperties": false, - "properties": { - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" - }, - "max_lines": { - "maximum": 1000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "max_lines", - "max_bytes", - "history_lines" - ], - "type": "object" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "target", - "capture_id", - "process_generation", - "encoding", - "row_count", - "bytes", - "truncated", - "history_continuity", - "interval", - "scope", - "mode", - "rows" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "base_capture_id": { - "type": "string" - }, - "bytes": { - "maximum": 262144, - "minimum": 0, - "type": "integer" - }, - "capture_id": { - "type": "string" - }, - "encoding": { - "enum": [ - "utf-8", - "base64" - ] - }, - "history_continuity": { - "const": "unknown" - }, - "interval": { - "additionalProperties": false, - "properties": { - "clock": { - "const": "monotonic_seconds" - }, - "finished": { - "type": "number" - }, - "started": { - "type": "number" - } - }, - "required": [ - "clock", - "started", - "finished" - ], - "type": "object" - }, - "mode": { - "const": "delta" - }, - "next_cursor": { - "type": "string" - }, - "process_generation": { - "type": [ - "string", - "null" - ] - }, - "reset": { - "type": "boolean" - }, - "row_count": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "scope": { - "additionalProperties": false, - "properties": { - "history_lines": { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - "max_bytes": { - "maximum": 262144, - "minimum": 1, - "type": "integer" - }, - "max_lines": { - "maximum": 1000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "max_lines", - "max_bytes", - "history_lines" - ], - "type": "object" - }, - "splice": { - "additionalProperties": false, - "properties": { - "delete": { - "minimum": 0, - "type": "integer" - }, - "rows": { - "items": { - "type": "string" - }, - "maxItems": 1000, - "type": "array" - }, - "start": { - "minimum": 0, - "type": "integer" - } - }, - "required": [ - "start", - "delete", - "rows" - ], - "type": "object" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "target", - "capture_id", - "process_generation", - "encoding", - "row_count", - "bytes", - "truncated", - "history_continuity", - "interval", - "scope", - "mode", - "base_capture_id", - "reset", - "splice", - "next_cursor" - ], - "type": "object" - } - ] - }, - "condition": { - "const": "screen_contains" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "condition", - "capture" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "condition": { - "const": "process_exit" - }, - "exit_status": { - "const": "unobserved" - }, - "observed_at": { - "type": "number" - }, - "process_generation": { - "type": "string" - }, - "target": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - } - ] - } - }, - "required": [ - "target", - "condition", - "process_generation", - "observed_at", - "exit_status" - ], - "type": "object" - } + "droppedLines": { + "type": "integer" + }, + "effectiveTimeout": { + "type": "number" + }, + "exitStatus": { + "type": [ + "integer", + "null" ] }, - "ok": { - "const": true + "linesMissed": { + "type": "boolean" + }, + "output": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "seconds": { + "type": "number" + }, + "timedOut": { + "type": "boolean" + } + }, + "required": [ + "droppedLines", + "effectiveTimeout", + "exitStatus", + "linesMissed", + "output", + "pane", + "paneRef", + "seconds", + "timedOut" + ], + "type": "object" + }, + "processReach": "pane-command", + "title": "Run shell command", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "search_panes", + "wireName": "search_panes", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 15 + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Search bounded pane content for literal text or a regular expression.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "maxMatchesPerPane": { + "description": "Caller-controlled maxMatchesPerPane.", + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "pattern": { + "description": "Caller-controlled pattern.", + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "regex": { + "description": "Caller-controlled regex.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "Caller-controlled scrollbackLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [ + "pattern" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "integer" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "line", + "pane", + "paneRef", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "panesAvailable": { + "type": "integer" + }, + "panesSearched": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBy": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "matches", + "panesAvailable", + "panesSearched", + "truncated", + "truncatedBy" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Search panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Search bounded pane content for literal text or a regular expression.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "maxMatchesPerPane": { + "description": "Caller-controlled maxMatchesPerPane.", + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "pattern": { + "description": "Caller-controlled pattern.", + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "regex": { + "description": "Caller-controlled regex.", + "type": "boolean" + }, + "scrollbackLines": { + "description": "Caller-controlled scrollbackLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "session": { + "description": "Caller-controlled session.", + "type": "string" } }, "required": [ - "ok", - "data" + "pattern" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "search_panes", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "delivery": { - "enum": [ - "not_sent", - "possibly_sent", - "observed" - ] - }, - "effects": { - "additionalProperties": false, - "properties": { - "created": { - "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - }, - "kind": { - "const": "session" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "kind": { - "const": "window" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^%[0-9]+$", - "type": "string" - }, - "kind": { - "const": "pane" - } - }, - "required": [ - "generation", - "kind", - "id" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "generation": { - "maxLength": 128, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 32, - "pattern": "^@[0-9]+$", - "type": "string" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "kind": { - "const": "window_link" - }, - "session_id": { - "maxLength": 32, - "pattern": "^\\$[0-9]+$", - "type": "string" - } - }, - "required": [ - "generation", - "kind", - "id", - "session_id", - "index" - ], - "type": "object" - } - ] - }, - "maxItems": 3, - "type": "array" - }, - "state": { - "enum": [ - "none", - "known", - "unknown" - ] - } + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "line": { + "type": "integer" }, - "required": [ - "state", - "created" - ], - "type": "object" + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "text": { + "type": "string" + } }, - "message": { - "type": "string" - } + "required": [ + "line", + "pane", + "paneRef", + "text" + ], + "type": "object" }, - "required": [ - "code", - "message", - "delivery" - ], - "type": "object" + "type": "array" }, - "ok": { - "const": false + "panesAvailable": { + "type": "integer" + }, + "panesSearched": { + "type": "integer" + }, + "truncated": { + "type": "boolean" + }, + "truncatedBy": { + "items": { + "type": "string" + }, + "type": "array" } }, "required": [ - "ok", - "error" + "matches", + "panesAvailable", + "panesSearched", + "truncated", + "truncatedBy" + ], + "type": "object" + }, + "processReach": "none", + "title": "Search panes", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "select_layout", + "wireName": "select_layout", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 27 + }, + "description": "Change tmux state; no client-supplied executable input. Apply a named layout, a unique abbreviation for the running tmux version, or a checksummed saved layout. Invalid syntax is refused before window lookup; tmux validates geometry when applying the layout.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "description": "Caller-controlled layout.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "layout", + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "layout", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select layout" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Apply a named layout, a unique abbreviation for the running tmux version, or a checksummed saved layout. Invalid syntax is refused before window lookup; tmux validates geometry when applying the layout.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "description": "Caller-controlled layout.", + "type": "string" + }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "layout", + "windowId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "select_layout", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "layout": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "layout", + "windowId" ], "type": "object" + }, + "processReach": "none", + "title": "Select layout", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "select_pane", + "wireName": "select_pane", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 28 + }, + "description": "Change tmux state; no client-supplied executable input. Select one pane as active.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } - ] + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" }, "annotations": { - "destructiveHint": false, + "destructiveHint": true, "idempotentHint": false, - "openWorldHint": false, - "readOnlyHint": false - } - } - ], - "wirePrefix": "tmux_", - "selectable": false, - "source": "gems/libtmux-mcp/lib/libtmux/mcp", - "repo": "libtmux/libtmux-ruby", - "revision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "extractedRevision": "9b1545562a112353c2c893a1d3e8c0d9b4b51f8d", - "selection": { - "mode": "explicit CLI options", - "tools": "tmux_capabilities,tmux_snapshot,tmux_capture,tmux_wait,tmux_create,tmux_send,tmux_close,tmux_run" - }, - "protocol": { - "capabilities": { - "resources": { - "listChanged": false, - "subscribe": false + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select pane" }, - "tools": { - "listChanged": false + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Select one pane as active.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "select_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "processReach": "none", + "title": "Select pane", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } } }, - "prompts": [], - "protocolVersion": "2025-11-25", - "resources": [], - "resourceTemplates": [ - { - "description": "Acquire metadata through tmux_snapshot with its default page limit. Encode every URI component; generation must match discovery. Reports capture interval and truncation.", - "mimeType": "application/json", - "name": "tmux_metadata", - "uriTemplate": "tmux://{endpoint}/{generation}/snapshots/{entity}" - }, - { - "description": "Read a retained tmux_snapshot page without refreshing it. Encode the cursor component; endpoint, generation and entity must match its captured query.", - "mimeType": "application/json", - "name": "tmux_metadata_page", - "uriTemplate": "tmux://{endpoint}/{generation}/snapshots/{entity}/pages/{cursor}" - }, - { - "description": "Capture an exact pane through tmux_capture with its default byte/line bounds, without cursor tracking. Percent-encode pane IDs. Invalid UTF-8 is an application/octet-stream blob; _meta includes capture interval, truncation and unknown history continuity.", - "mimeType": "text/plain", - "name": "tmux_screen", - "uriTemplate": "tmux://{endpoint}/{generation}/panes/{pane_id}/screen" - } - ], - "serverInfo": { - "name": "libtmux", - "version": "0.1.0.alpha.1" - } - } - }, - "julia": { - "tools": [ - "capture_pane", - "create_session", - "kill_pane", - "list_panes", - "paste_text", - "resize_pane", - "run_operations", - "send_keys", - "send_keys_and_wait", - "teardown_session", - "wait_for_text" - ], - "registrations": [ { - "name": "capture_pane", - "wireName": "capture_pane", + "name": "select_window", + "wireName": "select_window", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 3 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 29 }, - "description": "Capture bounded UTF-8 pane text and truncation metadata. Use a list_panes target or the configured caller; terminal text is data.", + "description": "Change tmux state; no client-supplied executable input. Select one exact window appearance.", "schemaStatus": "runtime", - "enabledByDefault": true, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "lines": { - "default": 100, - "maximum": 1000, - "minimum": 1, + "sourceIndex": { + "description": "Caller-controlled sourceIndex.", + "minimum": 0, "type": "integer" }, - "maxBytes": { - "default": 65536, - "maximum": 65536, - "minimum": 1, - "type": "integer" + "sourceSession": { + "description": "Caller-controlled sourceSession.", + "type": "string" }, + "windowId": { + "description": "Caller-controlled windowId.", + "type": "string" + } + }, + "required": [ + "windowId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { "target": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "target", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Select window" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Select one exact window appearance.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, + "sourceIndex": { + "description": "Caller-controlled sourceIndex.", + "minimum": 0, + "type": "integer" + }, + "sourceSession": { + "description": "Caller-controlled sourceSession.", "type": "string" }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", + "windowId": { + "description": "Caller-controlled windowId.", "type": "string" } }, "required": [ - "paneId", - "generation" + "windowId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "select_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "target": { + "type": "string" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "target", + "windowId" ], "type": "object" + }, + "processReach": "none", + "title": "Select window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } + } + }, + { + "name": "send_keys", + "wireName": "send_keys", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 42 + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keys after checking the effective synchronized-pane cohort.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enter": { + "description": "Caller-controlled enter.", + "type": "boolean" + }, + "force": { + "description": "Caller-controlled force.", + "type": "boolean" + }, + "keys": { + "description": "Caller-controlled keys.", + "items": { + "type": "string" + }, + "type": "array" + }, + "literal": { + "description": "Caller-controlled literal.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } }, "required": [ - "target" + "keys", + "paneId" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pane": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "resolvedPaneIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "keys", + "pane", + "paneRef", + "resolvedPaneIds" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Send keys" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send keys after checking the effective synchronized-pane cohort.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "byteLimit": { - "type": "integer" + "enter": { + "description": "Caller-controlled enter.", + "type": "boolean" }, - "encoding": { - "type": "string" + "force": { + "description": "Caller-controlled force.", + "type": "boolean" }, - "lineLimit": { - "type": "integer" + "keys": { + "description": "Caller-controlled keys.", + "items": { + "type": "string" + }, + "type": "array" }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } + "literal": { + "description": "Caller-controlled literal.", + "type": "boolean" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + } + }, + "required": [ + "keys", + "paneId" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "send_keys", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "keys": { + "items": { + "type": "string" }, - "required": [ - "paneId", - "generation" - ], - "type": "object" + "type": "array" }, - "terminalContent": { + "pane": { "type": "string" }, - "text": { + "paneRef": { "type": "string" }, - "truncated": { - "type": "boolean" + "resolvedPaneIds": { + "items": { + "type": "string" + }, + "type": "array" } }, "required": [ - "terminalContent", - "encoding", - "lineLimit", - "text", - "truncated", - "byteLimit", - "target" + "keys", + "pane", + "paneRef", + "resolvedPaneIds" ], "type": "object" }, - { - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { + "processReach": "pane-input", + "title": "Send keys", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } + } + }, + { + "name": "send_keys_batch", + "wireName": "send_keys_batch", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 43 + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered bounded batch with a fresh check for every row.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "onError": { + "description": "Caller-controlled onError.", + "enum": [ + "stop", + "continue" + ], + "type": "string" + }, + "operations": { + "description": "Caller-controlled operations.", + "items": { + "additionalProperties": false, + "properties": { + "enter": { + "type": "boolean" + }, + "force": { + "type": "boolean" + }, + "keys": { + "items": { "type": "string" }, - "retryable": { - "type": "boolean" - } + "type": "array" }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" - } + "literal": { + "type": "boolean" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "paneId", + "keys" + ], + "type": "object" }, - "required": [ - "error" - ], - "type": "object" + "maxItems": 64, + "type": "array" } + }, + "required": [ + "operations" ], "type": "object" }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": true, - "readOnlyHint": true - } - }, - { - "name": "create_session", - "wireName": "create_session", - "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 9 - }, - "description": "Start an argv command in a new application-owned session. Requires allow_create; the session is removed when the application closes. Completion means creation, not command exit.", - "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", - "inputSchema": { + "outputSchema": { "additionalProperties": false, "properties": { - "command": { - "description": "Executable and argv; no shell expansion", + "completed": { + "type": "integer" + }, + "failures": { "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "index", + "reason" + ], + "type": "object" }, - "maxItems": 32, - "minItems": 1, "type": "array" }, - "name": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^[A-Za-z0-9_-]+$", - "type": "string" + "targets": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "resolvedPaneIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "index", + "resolvedPaneIds" + ], + "type": "object" + }, + "type": "array" } }, "required": [ - "name", - "command" + "completed", + "failures", + "targets" ], "type": "object" }, - "outputSchema": { - "anyOf": [ - { + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Send keys batch" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Send input to a pane's program; a shell that receives it runs it with your user's permissions. Send an ordered bounded batch with a fresh check for every row.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "completed": { - "type": "boolean" - }, - "generation": { + "onError": { + "description": "Caller-controlled onError.", + "enum": [ + "stop", + "continue" + ], "type": "string" }, - "ownership": { - "const": "application" - }, - "panes": { + "operations": { + "description": "Caller-controlled operations.", "items": { "additionalProperties": false, "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" + "enter": { + "type": "boolean" + }, + "force": { + "type": "boolean" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "literal": { + "type": "boolean" }, "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", "type": "string" } }, "required": [ "paneId", - "generation" + "keys" ], "type": "object" }, - "maxItems": 256, + "maxItems": 64, "type": "array" - }, - "sessionId": { - "type": "string" } }, "required": [ - "completed", - "panes", - "sessionId", - "generation", - "ownership" + "operations" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "send_keys_batch", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] + "completed": { + "type": "integer" + }, + "failures": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "reason": { + "type": "string" + } }, - "message": { - "type": "string" + "required": [ + "index", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "targets": { + "items": { + "additionalProperties": false, + "properties": { + "index": { + "type": "integer" + }, + "resolvedPaneIds": { + "items": { + "type": "string" + }, + "type": "array" + } }, - "retryable": { - "type": "boolean" - } + "required": [ + "index", + "resolvedPaneIds" + ], + "type": "object" }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "type": "array" } }, "required": [ - "error" + "completed", + "failures", + "targets" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "pane-input", + "title": "Send keys batch", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } } }, { - "name": "kill_pane", - "wireName": "kill_pane", + "name": "set_history_limit", + "wireName": "set_history_limit", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 7 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 30 }, - "description": "Destroy one explicitly authorized pane and its running process. Its window or session may also disappear.", + "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "target": { + "lines": { + "description": "Caller-controlled lines.", + "maximum": 2000000, + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "lines" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "lines": { + "type": "integer" + } + }, + "required": [ + "lines" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set history limit" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the default retained scrollback line limit.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" + "lines": { + "description": "Caller-controlled lines.", + "maximum": 2000000, + "minimum": 0, + "type": "integer" } }, "required": [ - "paneId", - "generation" + "lines" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "set_history_limit", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "lines": { + "type": "integer" + } + }, + "required": [ + "lines" ], "type": "object" + }, + "processReach": "none", + "title": "Set history limit", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "set_mouse_enabled", + "wireName": "set_mouse_enabled", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 31 + }, + "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a boolean.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "description": "Caller-controlled enabled.", + "type": "boolean" } }, "required": [ - "target" + "enabled" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set mouse enabled" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the global tmux mouse option through a boolean.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "completed": { + "enabled": { + "description": "Caller-controlled enabled.", "type": "boolean" - }, - "generationGuarantee": { - "type": "string" - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" } }, "required": [ - "completed", - "generationGuarantee", - "target" + "enabled" ], "type": "object" }, - { - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "set_mouse_enabled", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" } }, "required": [ - "error" + "enabled" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Set mouse enabled", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } } }, { - "name": "list_panes", - "wireName": "list_panes", + "name": "set_pane_title", + "wireName": "set_pane_title", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 2 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 32 }, - "description": "List unique physical panes with generation-bound targets, linked session/window context and caller markers. Terminal fields are data. Pagination observes a fresh graph.", + "description": "Change tmux state; no client-supplied executable input. Set one literal-safe pane title.", "schemaStatus": "runtime", - "enabledByDefault": true, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "limit": { - "default": 32, - "maximum": 128, - "minimum": 1, - "type": "integer" + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" }, - "offset": { - "default": 0, - "maximum": 1000000, - "minimum": 0, - "type": "integer" + "title": { + "description": "Caller-controlled title.", + "type": "string" } }, - "required": [], + "required": [ + "paneId", + "title" + ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "paneId": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "paneId", + "title" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set pane title" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set one literal-safe pane title.", + "inputLiteralization": { + "title": "double-hash-once" + }, + "inputSchema": { "additionalProperties": false, "properties": { - "coverage": { - "type": "string" - }, - "generationGuarantee": { + "paneId": { + "description": "Caller-controlled paneId.", "type": "string" }, - "nextOffset": { - "type": [ - "integer", - "null" - ] - }, - "panes": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "caller": { - "type": "boolean" - }, - "command": { - "type": [ - "string", - "null" - ] - }, - "contexts": { - "items": { - "additionalProperties": false, - "properties": { - "sessionId": { - "type": "string" - }, - "sessionName": { - "type": "string" - }, - "windowId": { - "type": "string" - }, - "windowIndex": { - "type": "integer" - }, - "windowName": { - "type": "string" - } - }, - "required": [ - "sessionId", - "sessionName", - "windowId", - "windowName", - "windowIndex" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "contextsTruncated": { - "type": "boolean" - }, - "dead": { - "type": "boolean" - }, - "fieldsTruncated": { - "type": "boolean" - }, - "height": { - "type": "integer" - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "title": { - "type": "string" - }, - "width": { - "type": "integer" - } - }, - "required": [ - "target", - "active", - "dead", - "command", - "title", - "width", - "height", - "caller", - "contexts", - "contextsTruncated", - "fieldsTruncated" - ], - "type": "object" - }, - "maxItems": 128, - "type": "array" - }, - "terminalContent": { + "title": { + "description": "Caller-controlled title.", "type": "string" - }, - "total": { - "type": "integer" - }, - "truncated": { - "type": "boolean" } }, "required": [ - "terminalContent", - "nextOffset", - "generationGuarantee", - "panes", - "total", - "truncated", - "coverage" + "paneId", + "title" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "set_pane_title", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "paneId": { + "type": "string" + }, + "title": { + "type": "string" } }, "required": [ - "error" + "paneId", + "title" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": true, - "openWorldHint": true, - "readOnlyHint": true + }, + "processReach": "none", + "title": "Set pane title", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } } }, { - "name": "paste_text", - "wireName": "paste_text", + "name": "set_synchronize_panes", + "wireName": "set_synchronize_panes", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 5 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 44 }, - "description": "Paste UTF-8 text through a temporary owned buffer without adding Enter. The terminal application may transform input.", + "description": "Change tmux state; no client-supplied executable input. Set the window input default; pane overrides determine effective synchronization.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" + "enabled": { + "description": "Caller-controlled enabled.", + "type": "boolean" }, - "text": { - "description": "Valid UTF-8; at most 65536 bytes", - "maxLength": 65536, + "windowId": { + "description": "Caller-controlled windowId.", "type": "string" } }, "required": [ - "target", - "text" + "enabled", + "windowId" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "windowId": { + "type": "string" + } + }, + "required": [ + "enabled", + "windowId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Set synchronize panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": true, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Set the window input default; pane overrides determine effective synchronization.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "completed": { + "enabled": { + "description": "Caller-controlled enabled.", "type": "boolean" }, - "generationGuarantee": { + "windowId": { + "description": "Caller-controlled windowId.", "type": "string" - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" } }, "required": [ - "completed", - "generationGuarantee", - "target" + "enabled", + "windowId" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "set_synchronize_panes", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "enabled": { + "type": "boolean" + }, + "windowId": { + "type": "string" } }, "required": [ - "error" + "enabled", + "windowId" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Set synchronize panes", + "tmuxEffects": [ + "change" + ], + "toolset": "execute" + } } }, { - "name": "resize_pane", - "wireName": "resize_pane", + "name": "show_environment", + "wireName": "show_environment", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 6 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 16 }, - "description": "Request pane width or height in cells. tmux may constrain the resulting size to fit its window.", + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Read global or session tmux environment values.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, - "anyOf": [ - { - "required": [ - "width" - ] - }, - { - "required": [ - "height" - ] + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" } - ], + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, "properties": { - "height": { - "maximum": 10000, - "minimum": 1, - "type": "integer" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } + "environment": { + "additionalProperties": { + "type": [ + "string", + "null" + ] }, - "required": [ - "paneId", - "generation" - ], "type": "object" - }, - "width": { - "maximum": 10000, - "minimum": 1, - "type": "integer" } }, "required": [ - "target" + "environment" ], "type": "object" }, - "outputSchema": { - "anyOf": [ - { + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Show environment" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read the tmux environment; accepts no client-supplied executable input. Returned values may contain secrets. Read global or session tmux environment values.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "completed": { - "type": "boolean" - }, - "generationGuarantee": { + "session": { + "description": "Caller-controlled session.", "type": "string" - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" } }, - "required": [ - "completed", - "generationGuarantee", - "target" - ], + "required": [], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_environment", + "nestedAuthority": [], + "outputClasses": [ + "process-environment" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } + "environment": { + "additionalProperties": { + "type": [ + "string", + "null" + ] }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], "type": "object" } }, "required": [ - "error" + "environment" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": true, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Show environment", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } } }, { - "name": "run_operations", - "wireName": "run_operations", + "name": "show_hooks", + "wireName": "show_hooks", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 8 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 17 }, - "description": "Run up to eight enabled tool calls sequentially after validating every item. Stop at the first execution failure and return ordered completed results plus a one-based failedIndex; no rollback.", + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read configured hooks, optionally for one session.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "operations": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "hooks": { "items": { - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "limit": { - "default": 32, - "maximum": 128, - "minimum": 1, - "type": "integer" - }, - "offset": { - "default": 0, - "maximum": 1000000, - "minimum": 0, - "type": "integer" - } - }, - "required": [], - "type": "object" - }, - "tool": { - "const": "list_panes" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "lines": { - "default": 100, - "maximum": 1000, - "minimum": 1, - "type": "integer" - }, - "maxBytes": { - "default": 65536, - "maximum": 65536, - "minimum": 1, - "type": "integer" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - } - }, - "required": [ - "target" - ], - "type": "object" - }, - "tool": { - "const": "capture_pane" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" - }, - "literal": { - "default": false, - "type": "boolean" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - } - }, - "required": [ - "target", - "keys" - ], - "type": "object" - }, - "tool": { - "const": "send_keys" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "text": { - "description": "Valid UTF-8; at most 65536 bytes", - "maxLength": 65536, - "type": "string" - } - }, - "required": [ - "target", - "text" - ], - "type": "object" - }, - "tool": { - "const": "paste_text" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" + "additionalProperties": false, + "properties": { + "command": { + "type": "string" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "width" - ] - }, - { - "required": [ - "height" - ] - } - ], - "properties": { - "height": { - "maximum": 10000, - "minimum": 1, - "type": "integer" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "width": { - "maximum": 10000, - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "target" - ], - "type": "object" - }, - "tool": { - "const": "resize_pane" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" + "index": { + "type": "integer" }, - { + "name": { + "type": "string" + } + }, + "required": [ + "command", + "index", + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "hooks" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Show hooks" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read configured hooks, optionally for one session.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "session": { + "description": "Caller-controlled session.", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_hooks", + "nestedAuthority": [], + "outputClasses": [ + "configured-command" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "hooks": { + "items": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - } - }, - "required": [ - "target" - ], - "type": "object" + "command": { + "type": "string" }, - "tool": { - "const": "kill_pane" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "command": { - "description": "Executable and argv; no shell expansion", - "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" - }, - "maxItems": 32, - "minItems": 1, - "type": "array" - }, - "name": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^[A-Za-z0-9_-]+$", - "type": "string" - } - }, - "required": [ - "name", - "command" - ], - "type": "object" + "index": { + "type": "integer" }, - "tool": { - "const": "create_session" + "name": { + "type": "string" } }, "required": [ - "tool", - "arguments" + "command", + "index", + "name" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Valid UTF-8; at most 128 bytes", - "maxLength": 128, - "type": "string" - }, - "sessionId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "type": "string" - } - }, - "required": [ - "sessionId", - "generation" - ], - "type": "object" - }, - "tool": { - "const": "teardown_session" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" + "type": "array" + } + }, + "required": [ + "hooks" + ], + "type": "object" + }, + "processReach": "none", + "title": "Show hooks", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "show_option", + "wireName": "show_option", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 18 + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one exact tmux option.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "scope": { + "description": "Caller-controlled scope.", + "enum": [ + "server", + "global_session", + "global_window", + "session", + "window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Caller-controlled target.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "options": { + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" }, - { + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "options" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Show option" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read configured tmux commands; accepts no client-supplied executable input. Returned values may contain executable configuration. Read one exact tmux option.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Caller-controlled name.", + "type": "string" + }, + "scope": { + "description": "Caller-controlled scope.", + "enum": [ + "server", + "global_session", + "global_window", + "session", + "window", + "pane" + ], + "type": "string" + }, + "target": { + "description": "Caller-controlled target.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "show_option", + "nestedAuthority": [], + "outputClasses": [ + "configured-command", + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "options": { + "items": { "additionalProperties": false, "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "text": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "target", - "text" - ], - "type": "object" + "name": { + "type": "string" }, - "tool": { - "const": "wait_for_text" + "value": { + "type": "string" } }, "required": [ - "tool", - "arguments" + "name", + "value" ], "type": "object" }, - { - "additionalProperties": false, - "properties": { - "arguments": { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" - }, - "literal": { - "default": false, - "type": "boolean" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "text": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "target", - "keys", - "text" - ], - "type": "object" - }, - "tool": { - "const": "send_keys_and_wait" - } - }, - "required": [ - "tool", - "arguments" - ], - "type": "object" - } - ] + "type": "array" + } }, - "maxItems": 8, - "minItems": 1, - "type": "array" + "required": [ + "options" + ], + "type": "object" + }, + "processReach": "none", + "title": "Show option", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "signal_channel", + "wireName": "signal_channel", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 33 + }, + "description": "Change tmux state; no client-supplied executable input. Signal one tmux wait-for channel.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "Caller-controlled channel.", + "type": "string" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "type": "string" + }, + "signalled": { + "type": "boolean" + } + }, + "required": [ + "channel", + "signalled" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Signal channel" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Signal one tmux wait-for channel.", + "inputLiteralization": {}, + "inputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "Caller-controlled channel.", + "type": "string" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "signal_channel", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, + "properties": { + "channel": { + "type": "string" + }, + "signalled": { + "type": "boolean" + } + }, + "required": [ + "channel", + "signalled" + ], + "type": "object" + }, + "processReach": "none", + "title": "Signal channel", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } + } + }, + { + "name": "snapshot_pane", + "wireName": "snapshot_pane", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 19 + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return pane metadata and bounded terminal content together.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } }, "required": [ - "operations" + "paneId" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "capture": { "additionalProperties": false, "properties": { - "atomic": { - "const": false + "droppedLines": { + "type": "integer" }, - "completed": { + "lines": { "items": { - "additionalProperties": false, - "properties": { - "result": { - "type": "object" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "tool", - "result" - ], - "type": "object" + "type": "string" }, - "maxItems": 8, "type": "array" }, - "failedIndex": { - "type": "null" + "paneId": { + "type": "string" } }, "required": [ - "failedIndex", - "completed", - "atomic" + "droppedLines", + "lines", + "paneId" ], "type": "object" }, - { + "pane": { "additionalProperties": false, "properties": { - "atomic": { - "const": false + "currentCommand": { + "type": "string" }, - "completed": { - "items": { - "additionalProperties": false, - "properties": { - "result": { - "type": "object" - }, - "tool": { - "type": "string" - } - }, - "required": [ - "tool", - "result" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" + "currentPath": { + "type": "string" }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "height": { + "type": "integer" }, - "failedIndex": { - "maximum": 8, - "minimum": 1, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { "type": "integer" + }, + "windowID": { + "type": "string" } }, "required": [ - "failedIndex", - "completed", - "atomic", - "error" + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" ], "type": "object" + } + }, + "required": [ + "capture", + "pane" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Snapshot pane" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - { + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Return pane metadata and bounded terminal content together.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "atomic": { - "const": false - }, - "completed": { - "items": { - "additionalProperties": false, - "properties": { - "completed": { - "const": true - }, - "resultOmitted": { - "const": true - }, - "tool": { - "type": "string" - } - }, - "required": [ - "tool", - "completed", - "resultOmitted" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "const": "result_limit" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" }, - "failedIndex": { - "type": "null" + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" } }, "required": [ - "completed", - "atomic", - "error", - "failedIndex" + "paneId" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "snapshot_pane", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "atomic": { - "const": false - }, - "completed": { - "items": { - "additionalProperties": false, - "properties": { - "completed": { - "const": true - }, - "resultOmitted": { - "const": true - }, - "tool": { - "type": "string" - } - }, - "required": [ - "tool", - "completed", - "resultOmitted" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "error": { + "capture": { "additionalProperties": false, "properties": { - "code": { - "const": "result_limit" + "droppedLines": { + "type": "integer" }, - "effects": { - "enum": [ - "none", - "possible" - ] + "lines": { + "items": { + "type": "string" + }, + "type": "array" }, - "message": { + "paneId": { "type": "string" - }, - "retryable": { - "type": "boolean" } }, "required": [ - "code", - "message", - "effects", - "retryable" + "droppedLines", + "lines", + "paneId" ], "type": "object" }, - "failedIndex": { - "maximum": 8, - "minimum": 1, - "type": "integer" - }, - "originalError": { + "pane": { "additionalProperties": false, "properties": { - "code": { + "currentCommand": { "type": "string" - } - }, - "required": [ - "code" - ], - "type": "object" - } - }, - "required": [ - "completed", - "atomic", - "error", - "failedIndex", - "originalError" - ], - "type": "object" - }, - { - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { + }, + "currentPath": { "type": "string" }, - "effects": { - "enum": [ - "none", - "possible" - ] + "height": { + "type": "integer" }, - "message": { + "id": { "type": "string" }, - "retryable": { + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" } }, "required": [ - "code", - "message", - "effects", - "retryable" + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" ], "type": "object" } }, "required": [ - "error" + "capture", + "pane" ], "type": "object" + }, + "processReach": "none", + "title": "Snapshot pane", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } + } + }, + { + "name": "split_window", + "wireName": "split_window", + "source": { + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 45 + }, + "description": "Start a pane's configured process; accepts no command payload. Create a configured-process pane without accepting command or environment data.", + "schemaStatus": "runtime", + "inputSchema": { + "additionalProperties": false, + "properties": { + "direction": { + "description": "Caller-controlled direction.", + "enum": [ + "right", + "left", + "above", + "below" + ], + "type": "string" + }, + "paneId": { + "description": "Caller-controlled paneId.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", + "type": "string" + } + }, + "required": [ + "paneId" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "currentCommand": { + "type": "string" + }, + "currentPath": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { + "type": "boolean" + }, + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" } + }, + "required": [ + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" ], "type": "object" }, @@ -70939,623 +70866,696 @@ "destructiveHint": true, "idempotentHint": false, "openWorldHint": true, - "readOnlyHint": false - } - }, - { - "name": "send_keys", - "wireName": "send_keys", - "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 4 + "readOnlyHint": false, + "title": "Split window" }, - "description": "Send explicit key tokens or literal text to one captured target. No Enter is added; use a separate Enter token when intended.", - "schemaStatus": "runtime", - "enabledByDefault": true, - "enableOption": "--tool", - "inputSchema": { - "additionalProperties": false, - "properties": { - "keys": { - "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false }, - "literal": { - "default": false, - "type": "boolean" + "description": "Start a pane's configured process; accepts no command payload. Create a configured-process pane without accepting command or environment data.", + "inputLiteralization": { + "startDirectory": "double-hash-once" }, - "target": { + "inputSchema": { "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, + "direction": { + "description": "Caller-controlled direction.", + "enum": [ + "right", + "left", + "above", + "below" + ], "type": "string" }, "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", + "description": "Caller-controlled paneId.", + "type": "string" + }, + "startDirectory": { + "description": "Caller-controlled startDirectory.", "type": "string" } }, "required": [ - "paneId", - "generation" + "paneId" ], "type": "object" - } - }, - "required": [ - "target", - "keys" - ], - "type": "object" - }, - "outputSchema": { - "anyOf": [ - { + }, + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "split_window", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { "additionalProperties": false, "properties": { - "completed": { + "currentCommand": { + "type": "string" + }, + "currentPath": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "id": { + "type": "string" + }, + "index": { + "type": "integer" + }, + "isActive": { "type": "boolean" }, - "generationGuarantee": { + "isAtBottom": { + "type": "boolean" + }, + "isAtLeft": { + "type": "boolean" + }, + "isAtRight": { + "type": "boolean" + }, + "isAtTop": { + "type": "boolean" + }, + "isDead": { + "type": "boolean" + }, + "isSynchronized": { + "type": "boolean" + }, + "modeCount": { + "type": "integer" + }, + "ref": { "type": "string" }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" + "width": { + "type": "integer" + }, + "windowID": { + "type": "string" } }, "required": [ - "completed", - "generationGuarantee", - "target" + "currentCommand", + "currentPath", + "height", + "id", + "index", + "isActive", + "isAtBottom", + "isAtLeft", + "isAtRight", + "isAtTop", + "isDead", + "isSynchronized", + "modeCount", + "ref", + "width", + "windowID" ], "type": "object" }, - { - "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" - } - }, - "required": [ - "error" - ], - "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + "processReach": "configured-process", + "title": "Split window", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "execute" + } } }, { - "name": "send_keys_and_wait", - "wireName": "send_keys_and_wait", + "name": "swap_pane", + "wireName": "swap_pane", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 12 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 34 }, - "description": "Register output before sending explicit keys, then wait for literal text in output observed since registration. No Enter is added. Concurrent output may also match; this is not command-exit proof.", + "description": "Change tmux state; no client-supplied executable input. Swap two panes without changing their identities.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "keys": { - "items": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "type": "string" - }, - "maxItems": 64, - "minItems": 1, - "type": "array" - }, - "literal": { - "default": false, - "type": "boolean" - }, - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" + "otherPaneId": { + "description": "Caller-controlled otherPaneId.", + "type": "string" }, - "text": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "minLength": 1, + "paneId": { + "description": "Caller-controlled paneId.", "type": "string" } }, "required": [ - "target", - "keys", - "text" + "otherPaneId", + "paneId" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "otherPaneId": { + "type": "string" + }, + "paneId": { + "type": "string" + } + }, + "required": [ + "otherPaneId", + "paneId" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Swap panes" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Swap two panes without changing their identities.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "continuity": { - "const": "reset" - }, - "evidence": { - "const": "literal_text" - }, - "generationGuarantee": { + "otherPaneId": { + "description": "Caller-controlled otherPaneId.", "type": "string" }, - "keysSent": { - "type": "boolean" - }, - "matched": { - "type": "boolean" - }, - "source": { - "enum": [ - "baseline", - "output" - ] - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "terminalContent": { - "const": "data" - }, - "text": { + "paneId": { + "description": "Caller-controlled paneId.", "type": "string" } }, "required": [ - "matched", - "source", - "terminalContent", - "evidence", - "continuity", - "text", - "generationGuarantee", - "keysSent", - "target" + "otherPaneId", + "paneId" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "swap_pane", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "otherPaneId": { + "type": "string" + }, + "paneId": { + "type": "string" } }, "required": [ - "error" + "otherPaneId", + "paneId" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Swap panes", + "tmuxEffects": [ + "change", + "observe" + ], + "toolset": "manage" + } } }, { - "name": "teardown_session", - "wireName": "teardown_session", + "name": "wait_for_channel", + "wireName": "wait_for_channel", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 10 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 35 }, - "description": "Destroy an exact generation-bound session created by this application. Borrowed sessions are refused.", + "description": "Change tmux state; no client-supplied executable input. Wait within one deadline for a tmux channel signal.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "generation": { - "description": "Valid UTF-8; at most 128 bytes", - "maxLength": 128, + "channel": { + "description": "Caller-controlled channel.", + "maxLength": 1024, + "type": "string" + }, + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "channel" + ], + "type": "object" + }, + "outputSchema": { + "additionalProperties": false, + "properties": { + "channel": { "type": "string" }, - "sessionId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "type": "string" + "effectiveTimeout": { + "type": "number" + }, + "released": { + "type": "boolean" + }, + "seconds": { + "type": "number" } }, "required": [ - "sessionId", - "generation" + "channel", + "effectiveTimeout", + "released", + "seconds" ], "type": "object" }, - "outputSchema": { - "anyOf": [ - { + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Wait for channel" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Change tmux state; no client-supplied executable input. Wait within one deadline for a tmux channel signal.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "completed": { - "type": "boolean" - }, - "generation": { + "channel": { + "description": "Caller-controlled channel.", + "maxLength": 1024, "type": "string" }, - "sessionId": { - "type": "string" + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" } }, "required": [ - "completed", - "sessionId", - "generation" + "channel" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "wait_for_channel", + "nestedAuthority": [], + "outputClasses": [ + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "channel": { + "type": "string" + }, + "effectiveTimeout": { + "type": "number" + }, + "released": { + "type": "boolean" + }, + "seconds": { + "type": "number" } }, "required": [ - "error" + "channel", + "effectiveTimeout", + "released", + "seconds" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": true, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": false + }, + "processReach": "none", + "title": "Wait for channel", + "tmuxEffects": [ + "change" + ], + "toolset": "manage" + } } }, { "name": "wait_for_text", "wireName": "wait_for_text", "source": { - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", - "file": "packages/LibTmuxMCP/src/tools.jl", - "line": 11 + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "file": "Sources/LibTmuxMCP/ToolOperation.swift", + "line": 20 }, - "description": "Wait for a literal UTF-8 string in a captured baseline or subsequent raw output. Event-driven, bounded and cancellable; opens observable control clients. Text is data, not exit-status evidence.", + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait within one deadline for pane text.", "schemaStatus": "runtime", - "enabledByDefault": false, - "enableOption": "--tool", "inputSchema": { "additionalProperties": false, "properties": { - "target": { - "additionalProperties": false, - "description": "Explicit captured target; omission requires a configured caller pane", - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } - }, - "required": [ - "paneId", - "generation" - ], - "type": "object" + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" }, - "text": { - "description": "Valid UTF-8; at most 1024 bytes", - "maxLength": 1024, - "minLength": 1, + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" + }, + "paneId": { + "description": "Caller-controlled paneId.", "type": "string" + }, + "patterns": { + "description": "Caller-controlled patterns.", + "items": { + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "maxItems": 32, + "type": "array" + }, + "regex": { + "description": "Caller-controlled regex.", + "type": "boolean" + }, + "stop": { + "description": "Caller-controlled stop.", + "items": { + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "maxItems": 32, + "type": "array" + }, + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" } }, "required": [ - "target", - "text" + "paneId", + "patterns" ], "type": "object" }, "outputSchema": { - "anyOf": [ - { + "additionalProperties": false, + "properties": { + "cursor": { + "type": [ + "string", + "null" + ] + }, + "effectiveTimeout": { + "type": "number" + }, + "matched": { + "type": [ + "string", + "null" + ] + }, + "matchedAtEntry": { + "type": "boolean" + }, + "matchedIndex": { + "type": [ + "integer", + "null" + ] + }, + "outcome": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "sawNewOutput": { + "type": "boolean" + }, + "seconds": { + "type": "number" + }, + "tail": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "cursor", + "effectiveTimeout", + "matched", + "matchedAtEntry", + "matchedIndex", + "outcome", + "paneRef", + "sawNewOutput", + "seconds", + "tail" + ], + "type": "object" + }, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false, + "title": "Wait for text" + }, + "meta": { + "com.git-pull.libtmux-mcp/capability": { + "amplifiesFutureInput": false, + "annotations": { + "destructiveHint": true, + "idempotentHint": false, + "openWorldHint": true, + "readOnlyHint": false + }, + "description": "Read pane output; accepts no client-supplied executable input. Returned content may be sensitive or untrusted. Wait within one deadline for pane text.", + "inputLiteralization": {}, + "inputSchema": { "additionalProperties": false, "properties": { - "continuity": { - "const": "reset" + "cursor": { + "description": "Caller-controlled cursor.", + "maxLength": 16384, + "type": "string" }, - "evidence": { - "const": "literal_text" + "maxLines": { + "description": "Caller-controlled maxLines.", + "maximum": 2000, + "minimum": 1, + "type": "integer" }, - "generationGuarantee": { + "paneId": { + "description": "Caller-controlled paneId.", "type": "string" }, - "keysSent": { - "type": "boolean" + "patterns": { + "description": "Caller-controlled patterns.", + "items": { + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 + }, + "maxItems": 32, + "type": "array" }, - "matched": { + "regex": { + "description": "Caller-controlled regex.", "type": "boolean" }, - "source": { - "enum": [ - "baseline", - "output" - ] - }, - "target": { - "additionalProperties": false, - "properties": { - "generation": { - "description": "Opaque generation from list_panes", - "maxLength": 128, - "type": "string" - }, - "paneId": { - "description": "Valid UTF-8; at most 64 bytes", - "maxLength": 64, - "pattern": "^%(0|[1-9][0-9]*)$", - "type": "string" - } + "stop": { + "description": "Caller-controlled stop.", + "items": { + "type": "string", + "x-libtmux-max-utf8-bytes": 4096 }, - "required": [ - "paneId", - "generation" - ], - "type": "object" - }, - "terminalContent": { - "const": "data" + "maxItems": 32, + "type": "array" }, - "text": { - "type": "string" + "timeoutMs": { + "description": "Caller-controlled timeoutMs.", + "maximum": 600000, + "minimum": 100, + "type": "integer" } }, "required": [ - "matched", - "source", - "terminalContent", - "evidence", - "continuity", - "text", - "generationGuarantee", - "keysSent", - "target" + "paneId", + "patterns" ], "type": "object" }, - { + "mayExposeSecrets": true, + "mayReturnUntrustedContent": true, + "name": "wait_for_text", + "nestedAuthority": [], + "outputClasses": [ + "terminal-content", + "tmux-metadata" + ], + "outputSchema": { + "additionalProperties": false, "properties": { - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "effects": { - "enum": [ - "none", - "possible" - ] - }, - "message": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } + "cursor": { + "type": [ + "string", + "null" + ] + }, + "effectiveTimeout": { + "type": "number" + }, + "matched": { + "type": [ + "string", + "null" + ] + }, + "matchedAtEntry": { + "type": "boolean" + }, + "matchedIndex": { + "type": [ + "integer", + "null" + ] + }, + "outcome": { + "type": "string" + }, + "paneRef": { + "type": "string" + }, + "sawNewOutput": { + "type": "boolean" + }, + "seconds": { + "type": "number" + }, + "tail": { + "items": { + "type": "string" }, - "required": [ - "code", - "message", - "effects", - "retryable" - ], - "type": "object" + "type": "array" } }, "required": [ - "error" + "cursor", + "effectiveTimeout", + "matched", + "matchedAtEntry", + "matchedIndex", + "outcome", + "paneRef", + "sawNewOutput", + "seconds", + "tail" ], "type": "object" - } - ], - "type": "object" - }, - "annotations": { - "destructiveHint": false, - "idempotentHint": false, - "openWorldHint": true, - "readOnlyHint": true + }, + "processReach": "none", + "title": "Wait for text", + "tmuxEffects": [ + "observe" + ], + "toolset": "inspect" + } } } ], "wirePrefix": "", - "selectable": false, - "source": "packages/LibTmuxMCP/src", - "repo": "libtmux/libtmux-julia", - "revision": "6f62bd72cb8d99f3759ca5e2cc3591165a03c768", - "extractedRevision": "31fb196d01a7f9787a72037f168dfa1feed73fcf", + "selectable": true, + "source": "Sources/LibTmuxMCP", + "repo": "libtmux/libtmux-swift", + "revision": "7993e7044347629b08020e9b02ae8bcffa0e5898", + "extractedRevision": "7993e7044347629b08020e9b02ae8bcffa0e5898", "selection": { - "mode": "explicit CLI options", - "tools": "all registered tools via repeated --tool", - "allowCreate": "--allow-create" + "LIBTMUX_TOOLSETS": "inspect,manage,execute,teardown" }, "protocol": { "capabilities": { + "resources": { + "listChanged": false, + "subscribe": false + }, "tools": { "listChanged": false } }, "prompts": [], "protocolVersion": "2025-11-25", - "resources": [], + "resources": [ + { + "description": "The frozen tool surface, capability declarations, socket selection, and provenance.", + "mimeType": "application/json", + "name": "capabilities", + "title": "Effective tmux MCP capabilities", + "uri": "tmux://capabilities" + } + ], "resourceTemplates": [], "serverInfo": { "name": "libtmux", - "version": "0.1.0-alpha.1" + "title": "tmux", + "version": "0.1.0-alpha.6" } } } From 41cb8f7bb56a13266d4d2dbc8654d026a3626157 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 17:15:03 -0500 Subject: [PATCH 05/15] test(site) Reproduce missing glossary navigation why: Core glossaries omit page contents and both glossary layout paths omit heading permalinks. what: - Guard actual core and DocsLayout output with strict expected failures - Retain native catalogs, contextual targets and the API browse tree --- site/test/api-glossary-navigation.test.ts | 203 ++++++++++++++++++++++ site/test/api-glossary.test.ts | 2 +- 2 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 site/test/api-glossary-navigation.test.ts diff --git a/site/test/api-glossary-navigation.test.ts b/site/test/api-glossary-navigation.test.ts new file mode 100644 index 00000000..453f8547 --- /dev/null +++ b/site/test/api-glossary-navigation.test.ts @@ -0,0 +1,203 @@ +import { afterEach, expect, it, vi } from 'vitest' +vi.mock('astro:content', () => ({ getCollection: vi.fn(async () => []) })) +import { readFileSync, realpathSync } from 'node:fs' +import { createRequire } from 'node:module' +import { pathToFileURL } from 'node:url' +import { experimental_AstroContainer } from 'astro/container' +import { Window } from 'happy-dom' +import * as model from '@libtmux/api-model' +import * as glossary from '../src/lib/api-glossary' +import { NATIVE_API_GLOSSARIES } from '../src/lib/api-glossary-native' +import * as models from '../src/lib/api-models' +import * as sections from '../src/lib/api-sections' +import * as relationships from '../src/lib/api-relationships' +import * as tree from '../src/lib/api-tree' +import * as search from '../src/lib/api-search' +import * as treeState from '../src/components/api/api-tree-state' +import * as labels from '../src/lib/api-labels' +import * as wordBreak from '../src/lib/word-break' +import * as ports from '../src/lib/ports' +import * as products from '../src/lib/product-api' +import * as versions from '../src/lib/versions' +import * as roots from '../src/lib/site-root' +import * as sidebar from '../src/lib/sidebar' +import * as documentation from '../src/lib/documentation-navigation' +import * as pagePorts from '../src/lib/page-ports-for' +import * as markdown from '../src/lib/markdown-twins' +import * as manual from '../src/lib/tmux-manual-data' +import * as locales from '../src/i18n/locales' +import * as resolve from '../src/i18n/resolve' +import * as contribute from '../src/i18n/contribute' +import * as constants from '../src/constants' +import * as toc from '../src/utils/generateToC' +import * as branding from '../src/lib/branding' +import mentions from '../src/data/mentions.json' + +const windows: Window[] = [] +afterEach(async () => { + for (const win of windows.splice(0)) await win.happyDOM.abort() + vi.unstubAllGlobals() + vi.unstubAllEnvs() +}) + +/** Keep the edited templates, native catalogs, API tree and both contents renderers real. */ +async function components() { + const modules: Record = { + '@libtmux/api-model': model, + ...Object.fromEntries(Object.entries({ + 'api-glossary': glossary, 'api-models': models, 'api-sections': sections, + 'api-relationships': relationships, 'api-tree': tree, 'api-search': search, + 'api-labels': labels, 'word-break': wordBreak, ports, 'product-api': products, + versions, 'site-root': roots, sidebar, 'documentation-navigation': documentation, + 'page-ports-for': pagePorts, 'markdown-twins': markdown, 'tmux-manual-data': manual, + branding, + }).map(([name, exports]) => [new URL(`../src/lib/${name}.ts`, import.meta.url).href, exports])), + ...Object.fromEntries(Object.entries({ locales, resolve, contribute }).map(([name, exports]) => + [new URL(`../src/i18n/${name}.ts`, import.meta.url).href, exports])), + [new URL('../src/components/api/api-tree-state.ts', import.meta.url).href]: treeState, + [new URL('../src/constants.ts', import.meta.url).href]: constants, + [new URL('../src/utils/generateToC.ts', import.meta.url).href]: toc, + [new URL('../src/data/mentions.json', import.meta.url).href]: { default: mentions }, + } + vi.stubGlobal('__glossaryNavigationModules', modules) + const astroRequire = createRequire(realpathSync(new URL('../node_modules/astro/package.json', import.meta.url))) + const { transform } = await import(astroRequire.resolve('@astrojs/compiler-rs')) + const runtime = pathToFileURL(astroRequire.resolve('astro/compiler-runtime')).href + const realTemplates = new Set([ + 'api/ApiReference.astro', 'api/ApiGlossary.astro', 'api/ApiGlossaryContent.astro', + 'api/ApiPageContents.astro', 'api/ApiTree.astro', 'api/ApiTreeItems.astro', + 'api/ApiBadge.astro', 'api/SymbolName.astro', 'TableOfContents/TableOfContents.astro', + 'TableOfContents/TableOfContentsList.astro', 'MobileToC.astro', + ].map((name) => new URL(`../src/components/${name}`, import.meta.url).href)) + realTemplates.add(new URL('../src/layouts/DocsLayout.astro', import.meta.url).href) + const compiled = new Map() + // Collection loading and outer chrome are outside this regression. No glossary or TOC stub. + const shell = (await transform('', { + filename: 'glossary-test-chrome.astro', internalURL: 'astro/compiler-runtime', resultScopedSlot: true, + resolvePath: (specifier: string) => specifier, + })).code.replaceAll('"astro/compiler-runtime"', JSON.stringify(runtime)) + const chrome = `data:text/javascript;base64,${Buffer.from(shell).toString('base64')}` + + async function compile(file: URL): Promise { + if (compiled.has(file.href)) return compiled.get(file.href)! + const source = readFileSync(file, 'utf8') + .replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/g, '') + .replace(/^import ['"][^'"\n]+\.css['"];?\s*$/gm, '') + const result = await transform(source, { filename: file.pathname, internalURL: 'astro/compiler-runtime', + resultScopedSlot: true, resolvePath: (specifier: string) => specifier }) + expect(result.diagnostics.filter((item: { severity: string }) => item.severity === 'error')).toEqual([]) + let code = result.code.replaceAll('"astro/compiler-runtime"', JSON.stringify(runtime)) + const specifiers = [...code.matchAll(/\bfrom\s+["']([^"']+)["']/g)].map((match) => match[1]) + for (const specifier of new Set(specifiers)) { + if (specifier === 'astro/compiler-runtime' || specifier === runtime || specifier.startsWith('node:')) continue + const path = specifier.startsWith('.') ? new URL(specifier, file) : undefined + let replacement: string + if (specifier.endsWith('.astro')) { + replacement = realTemplates.has(path!.href) ? await compile(path!) : chrome + } else { + const key = path ? `${path.href}${/\.(?:ts|json)$/.test(path.pathname) ? '' : '.ts'}` : specifier + const exports = modules[key] + if (!exports) throw new Error(`Unbound real helper ${specifier} in ${file.pathname}`) + const access = `globalThis.__glossaryNavigationModules[${JSON.stringify(key)}]` + const names = Object.keys(exports).filter((name) => name !== 'default') + const bridge = `${names.length ? `export const { ${names.join(', ')} } = ${access};` : ''}${'default' in exports ? `export default ${access}.default;` : ''}` + replacement = `data:text/javascript;base64,${Buffer.from(bridge).toString('base64')}` + } + code = code.replaceAll(JSON.stringify(specifier), JSON.stringify(replacement)) + } + const url = `data:text/javascript;base64,${Buffer.from(`${code}\n//# sourceURL=${file.pathname}`).toString('base64')}` + compiled.set(file.href, url) + return url + } + return async (name: string) => (await import(/* @vite-ignore */ await compile(new URL(`../src/components/api/${name}.astro`, import.meta.url)))).default +} + +function expectedHeadings(path: string) { + return glossary.apiGlossary(path).groups.flatMap((group) => [ + { id: group.id, text: group.title }, ...group.terms.map((term) => ({ id: term.id, text: term.id })), + ]) +} + +function checkHeadings(document: Document, path: string) { + const expected = expectedHeadings(path) + for (const { id, text } of expected) { + const targets = [...document.querySelectorAll('[id]')].filter((element) => element.id === id) + expect(targets, `${path} has one target for ${id}`).toHaveLength(1) + const heading = targets[0] + expect(['H2', 'H3']).toContain(heading.tagName) + const permalink = heading.querySelector('a')! + expect(permalink, `${path} heading ${id} has a permalink`).not.toBeNull() + expect(permalink.getAttribute('href')).toBe(`#${id}`) + expect(permalink.getAttribute('aria-label')).toContain(text) + expect(permalink.textContent).toBe('#') + expect(heading.lastElementChild).toBe(permalink) + expect(permalink.getAttribute('data-pagefind-ignore')).toBe('all') + expect(permalink.getAttribute('tabindex')).not.toBe('-1') + if (heading.tagName === 'H3') expect(heading.querySelector('code')?.textContent).toBe(id) + } + expect(document.querySelectorAll('a a')).toHaveLength(0) +} + +function checkContents(document: Document, path: string) { + const expected = expectedHeadings(path) + const outlets = document.querySelectorAll('nav[aria-label="On this page"], nav.toc-nav') + expect(outlets.length, `${path} has within-page navigation`).toBeGreaterThan(0) + for (const nav of outlets) { + expect([...nav.querySelectorAll('a')].map((link) => link.getAttribute('href'))).toEqual(expected.map(({ id }) => `#${id}`)) + } +} + +it.fails.each([{ port: 'go', term: 'struct' }, { port: 'ts', term: 'class' }])('renders $port core glossary contents without replacing the API browse tree', async ({ port, term }) => { + vi.stubEnv('LIBTMUX_DOCS_VERSION', 'v9-proof') + const path = `${ports.referenceUrl(ports.PORT_BY_SLUG[port], 'v9-proof')}glossary/` + const component = await (await components())('ApiReference') + const container = await experimental_AstroContainer.create() + const win = new Window({ url: `https://libtmux.org${path}#${term}` }) + windows.push(win) + win.document.body.innerHTML = await container.renderToString(component, { + props: { model: models.API_MODELS[port], glossary: true }, params: { slug: 'glossary' }, + request: new Request(`https://libtmux.org${path}`), + }) + expect(win.document.querySelector('.api-nav-column [role="tree"]')).not.toBeNull() + expect(win.document.querySelector(`.api-nav a[href="${path}"]`)?.getAttribute('aria-current')).toBe('page') + checkContents(win.document, path) + expect([...win.document.querySelectorAll('details')].some((details) => + details.querySelector('summary')?.textContent === 'On this page' && details.querySelector(`a[href="#${term}"]`))).toBe(true) + checkHeadings(win.document, path) + expect(win.document.querySelector('a[href$=".json"]')?.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) +}) + +it.fails.each([undefined, 'mcp', 'workspace'] as const)('preserves real DocsLayout contents and adds %s glossary permalinks', async (product) => { + const path = product ? `${ports.referenceUrl(ports.PORT_BY_SLUG.go, 'v9-proof', product)}glossary/` : glossary.API_GLOSSARY_PATH + const component = await (await components())('ApiGlossary') + const container = await experimental_AstroContainer.create() + const win = new Window({ url: `https://libtmux.org${path}` }) + windows.push(win) + win.document.body.innerHTML = await container.renderToString(component, { + props: { ...(product ? { port: 'go', product } : {}), version: 'v9-proof' }, + request: new Request(`https://libtmux.org${path}`), + }) + checkContents(win.document, path) + expect(win.document.querySelector('#mobile-toc nav.toc-nav')).not.toBeNull() + checkHeadings(win.document, path) +}) + +it.fails.each(Object.keys(NATIVE_API_GLOSSARIES))('keeps %s filtered native glossary targets and definitions in every product', async (port) => { + const component = await (await components())('ApiGlossaryContent') + const container = await experimental_AstroContainer.create() + const win = new Window() + windows.push(win) + for (const product of ['', 'mcp/', 'workspace/']) { + const path = `/preview-17/en/${port}/v9-proof/${product}reference/glossary/` + win.document.body.innerHTML = await container.renderToString(component, { props: { contextPath: path } }) + const native = glossary.apiGlossary(path) + expect([...win.document.querySelectorAll('h2[id], h3[id]')].map((heading) => heading.id)).toEqual(expectedHeadings(path).map(({ id }) => id)) + for (const group of native.groups) for (const term of group.terms) { + const section = win.document.querySelector(`section[aria-labelledby="${term.id}"]`)! + expect(section.textContent).toContain(term.definition) + expect([...section.querySelectorAll('p a')].map((link) => link.getAttribute('href'))).toEqual(term.references.map((reference) => reference.url)) + } + checkHeadings(win.document, path) + expect(win.document.querySelector('a[href$=".json"]')?.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) + } +}) diff --git a/site/test/api-glossary.test.ts b/site/test/api-glossary.test.ts index 8232c954..5ce3bdba 100644 --- a/site/test/api-glossary.test.ts +++ b/site/test/api-glossary.test.ts @@ -295,7 +295,7 @@ describe('rendered API badges', () => { const section = win.document.querySelector('section[aria-labelledby="method"]')! expect(section.textContent).toContain('declared with def') expect(section.textContent).toContain('extension method') - expect([...section.querySelectorAll('a')].map((link) => new URL(link.href).hostname)).toEqual(['docs.scala-lang.org', 'docs.scala-lang.org']) + expect([...section.querySelectorAll('p a')].map((link) => new URL(link.href).hostname)).toEqual(['docs.scala-lang.org', 'docs.scala-lang.org']) expect(win.document.body.textContent).not.toMatch(/Python|Julia/) expect(win.document.querySelector('a[href$=".json"]')!.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) expect(Boolean(win.document.querySelector('#readOnlyHint'))).toBe(product === 'mcp/') From db2cf8b2209b2549f060bcc4b0dd7786f40bcaf2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 17:19:19 -0500 Subject: [PATCH 06/15] fix(site) Add glossary contents and heading links why: Core glossaries had no owner-derived page navigation, and the shared glossary headings omitted permalink controls. what: - Derive both layout outlets from the filtered native glossary metadata - Keep wide contents and native narrow links beside the API browse tree - Share adjacent heading controls and measured fragment clearance --- site/src/components/api/ApiGlossary.astro | 9 ++-- .../components/api/ApiGlossaryContent.astro | 4 +- site/src/components/api/ApiReference.astro | 24 ++++++--- site/src/lib/api-glossary.ts | 8 +++ site/src/styles/api-headings.css | 17 +++++++ site/src/styles/api.css | 49 +++++++------------ site/src/styles/global.css | 1 + 7 files changed, 68 insertions(+), 44 deletions(-) create mode 100644 site/src/styles/api-headings.css diff --git a/site/src/components/api/ApiGlossary.astro b/site/src/components/api/ApiGlossary.astro index eebfd7e7..2f4eb4d8 100644 --- a/site/src/components/api/ApiGlossary.astro +++ b/site/src/components/api/ApiGlossary.astro @@ -10,13 +10,10 @@ const referenceBase = port ? referenceUrl(PORT_BY_SLUG[port], version, product ? const pagePath = product ? `${product}/reference/glossary` : 'reference/glossary' const glossaryPath = `${referenceBase}glossary/` import { CONTRIBUTE_BRANCH, CONTRIBUTE_REPO } from '../../i18n/contribute' -import { apiGlossary, API_GLOSSARY_PATH, API_GLOSSARY_TITLE } from '../../lib/api-glossary' +import { apiGlossary, apiGlossaryHeadings, API_GLOSSARY_PATH, API_GLOSSARY_TITLE } from '../../lib/api-glossary' -const { title, description, groups } = apiGlossary(glossaryPath) -const headings = groups.flatMap((group) => [ - { depth: 2, slug: group.id, text: group.title }, - ...group.terms.map((term) => ({ depth: 3, slug: term.id, text: term.id })), -]) +const { title, description } = apiGlossary(glossaryPath) +const headings = apiGlossaryHeadings(glossaryPath) const markdownHref = `${glossaryPath.slice(0, -1)}.md` --- diff --git a/site/src/components/api/ApiGlossaryContent.astro b/site/src/components/api/ApiGlossaryContent.astro index 76067fcc..d5a13a00 100644 --- a/site/src/components/api/ApiGlossaryContent.astro +++ b/site/src/components/api/ApiGlossaryContent.astro @@ -8,10 +8,10 @@ const jsonHref = `${glossary.path.slice(0, -1)}.json`

{glossary.description} Select an annotation or full API badge to open its definition here.

The signature and entry documentation describe the API’s behavior, including its calling conventions, storage and runtime checks.

{groups.map((group) =>
-

{group.title}

+

{group.title}#

{group.description}

{group.terms.map((term) =>
-

{term.id}

+

{term.id}#

{term.definition}

{term.detail &&

{term.detail}

}

References: {term.references.map((reference, index) => <> diff --git a/site/src/components/api/ApiReference.astro b/site/src/components/api/ApiReference.astro index ecf729e5..c2287e0f 100644 --- a/site/src/components/api/ApiReference.astro +++ b/site/src/components/api/ApiReference.astro @@ -8,7 +8,7 @@ import ApiRelationships from './ApiRelationships.astro' import { apiRelationshipSections, type ApiRelationshipPath } from '../../lib/api-relationships' import ApiBadge from '../../components/api/ApiBadge.astro' import ApiGlossaryContent from './ApiGlossaryContent.astro' -import { apiGlossary, API_GLOSSARY_TITLE, apiGlossaryHref } from '../../lib/api-glossary' +import { apiGlossary, apiGlossaryHeadings, API_GLOSSARY_TITLE, apiGlossaryHref } from '../../lib/api-glossary' import ApiQualifiedName from '../../components/api/ApiQualifiedName.astro' import ApiType from '../../components/api/ApiType.astro' import ApiPageContents from '../../components/api/ApiPageContents.astro' @@ -346,7 +346,10 @@ const memberGroups = apiMemberGroups(listed, signals) const scalarMembers = Boolean(owner && hasScalarMembers(owner, listed)) const showMemberGroups = !scalarMembers && memberGroups.length > 1 const membersLabel = owner?.variant || (language === 'julia' && owner?.kind === 'struct' && listed.every((member) => member.kind === 'property')) ? 'Fields' : 'Members' -const pageSections: ApiSection[] = owner ? [ +const glossaryContext = apiGlossary(`${refBase}glossary/`) +const pageSections: ApiSection[] = glossary ? apiGlossaryHeadings(glossaryContext.path).map((heading) => ({ + id: heading.slug, label: heading.text, nested: heading.depth === 3, +})) : owner ? [ { id: 'api-overview', label: 'Overview' }, ...apiEntrySections(owner, language), ...(listed.length ? [{ id: 'api-members', label: membersLabel, count: listed.length }, @@ -372,7 +375,6 @@ const pageTitle = glossary ? API_GLOSSARY_TITLE : owner ? title : source?.title const displayName = owner ? (declaringType ? `${declaringType.name}.${owner.name}` : owner.name) : pageTitle const breadcrumbs = source?.breadcrumbs ?? await pageBreadcrumbs(displayName, glossary ? 'reference/glossary' : slug ? `reference/${slug}` : 'reference', version, port) const pagePath = glossary ? 'reference/glossary' : source?.pagePath ?? (slug ? `reference/${slug}` : 'reference') -const glossaryContext = apiGlossary(`${refBase}glossary/`) const description = glossary ? glossaryContext.description : source?.description ?? `Types, methods, and functions in libtmux for ${label}.` const bases = owner && 'extends' in owner ? owner.extends ?? [] : [] --- @@ -417,7 +419,7 @@ const bases = owner && 'extends' in owner ? owner.extends ?? [] : [] } -

+
{model && ( } - {glossary &&
} + {glossary && <> +
+ On this page + +
+
+ } { !glossary && !owner && !model && ( <> @@ -832,7 +844,7 @@ const bases = owner && 'extends' in owner ? owner.extends ?? [] : [] ) } - {owner && } + {(owner || glossary) && }
diff --git a/site/src/lib/api-glossary.ts b/site/src/lib/api-glossary.ts index f416fdec..864e77c2 100644 --- a/site/src/lib/api-glossary.ts +++ b/site/src/lib/api-glossary.ts @@ -269,6 +269,14 @@ export function apiGlossary(contextPath?: string) { } } +/** Page contents follow the same filtered native groups and term order. */ +export function apiGlossaryHeadings(contextPath?: string) { + return apiGlossary(contextPath).groups.flatMap((group) => [ + { depth: 2, slug: group.id, text: group.title }, + ...group.terms.map((term) => ({ depth: 3, slug: term.id, text: term.id })), + ]) +} + /** Unknown labels remain plain text rather than linking to an absent definition. */ export function apiGlossaryHref(term: string, contextPath?: string): string | undefined { if (!terms.has(term)) return undefined diff --git a/site/src/styles/api-headings.css b/site/src/styles/api-headings.css new file mode 100644 index 00000000..7fcdd5f5 --- /dev/null +++ b/site/src/styles/api-headings.css @@ -0,0 +1,17 @@ +/* Shared API and glossary permalinks stay beside the heading label. */ +.api-heading-link { + flex: none; + display: inline-flex; + align-items: center; + justify-content: center; + min-inline-size: 1.5rem; + min-block-size: 1.5rem; + margin-inline-start: 0.25rem; + padding: 0.2rem 0.35rem; + color: var(--color-muted); + font-size: 0.875rem; + font-weight: 400; + text-decoration: none; +} +.api-heading-link:hover { color: var(--color-link); } +.api-heading-link:focus-visible { outline: 2px solid var(--focus-ring-color); outline-offset: 2px; } diff --git a/site/src/styles/api.css b/site/src/styles/api.css index 89ea16be..2e0727ec 100644 --- a/site/src/styles/api.css +++ b/site/src/styles/api.css @@ -667,30 +667,33 @@ dl.gp-sphinx-api-container > dt.gp-sphinx-api-header .gp-sphinx-api-layout-right overflow-wrap: anywhere; } .api-reference-layout { max-width: 108rem; margin-inline: auto; } -html:has(.api-reference-layout--symbol) { +html:has(:is(.api-reference-layout--symbol, .api-reference-layout--glossary)) { --api-header-height: 0px; --api-sections-height: 0px; --api-reading-top: calc(var(--api-header-height) + var(--api-sections-height) + 0.75rem); scroll-padding-top: var(--api-reading-top); } -html:has(.api-reference-layout--symbol):has(.site-header :focus) { scroll-padding-top: 0; } +html:has(:is(.api-reference-layout--symbol, .api-reference-layout--glossary)):has(.site-header :focus) { scroll-padding-top: 0; } /* Sticky controls need measured clearance when text wraps or grows. */ -html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site-header { +html:has(:is(.api-reference-layout--symbol, .api-reference-layout--glossary)):not([data-api-sections-measured]) .site-header { position: static; } @media (min-width: 56rem) { .api-reference-layout:has(> .api-nav-column) { grid-template-columns: 16rem minmax(0, 1fr); } - .api-reference-layout--symbol .api-nav { + :is(.api-reference-layout--symbol, .api-reference-layout--glossary) .api-nav { top: var(--api-header-height); height: calc(100dvh - var(--api-header-height)); } } .api-page-contents { display: none; } +.api-glossary-contents { margin-block: 1.25rem; } +.api-glossary-contents > summary { cursor: pointer; padding-block: 0.375rem; font-size: 0.875rem; } +.api-glossary-contents > summary:focus-visible { outline: 2px solid var(--focus-ring-color); outline-offset: 2px; } @media (min-width: 85rem) { - .api-reference-layout--symbol:has(> .api-nav-column) { + :is(.api-reference-layout--symbol, .api-reference-layout--glossary):has(> .api-nav-column) { grid-template-columns: 16rem minmax(0, 1fr) 14rem; } - .api-reference-layout--symbol > .api-reference-content { + :is(.api-reference-layout--symbol, .api-reference-layout--glossary) > .api-reference-content { padding-inline: 2.25rem; padding-bottom: 3rem; } @@ -699,6 +702,7 @@ html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site- min-width: 0; padding: 4.5rem 0.5rem 2rem 0; } + .api-glossary-contents { display: none; } .api-page-contents > aside { position: sticky; top: calc(var(--api-header-height) + 1rem); @@ -716,8 +720,8 @@ html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site- letter-spacing: 0.045em; margin-bottom: 1rem; } -.api-page-contents ul { list-style: none; margin: 0; padding: 0; } -.api-page-contents a { +:is(.api-page-contents, .api-glossary-contents) ul { list-style: none; margin: 0; padding: 0; } +:is(.api-page-contents, .api-glossary-contents) a { display: flex; gap: 0.5rem; padding: 0.4rem 0.35rem; @@ -728,8 +732,8 @@ html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site- overflow-wrap: anywhere; text-decoration: none; } -.api-page-contents a:hover { color: var(--color-link); } -.api-page-contents a[aria-current="location"] { +:is(.api-page-contents, .api-glossary-contents) a:hover { color: var(--color-link); } +:is(.api-page-contents, .api-glossary-contents) a[aria-current="location"] { border-left-color: var(--color-link); color: var(--color-link); font-weight: 600; @@ -738,10 +742,11 @@ html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site- .api-related { margin-top: 2rem; } .api-related code { font-size: inherit; } .api-related a { align-items: center; } -.api-page-contents a:focus-visible { +:is(.api-page-contents, .api-glossary-contents) a:focus-visible { outline: 2px solid var(--focus-ring-color); outline-offset: -2px; } +.api-glossary-contents a { font-size: 0.875rem; } .api-reference-heading { margin-block: 1rem 1.25rem; } @@ -782,22 +787,6 @@ html:has(.api-reference-layout--symbol):not([data-api-sections-measured]) .site- } .page-toolbar-controls--reference select { max-width: 11rem; } .api-section-heading { display: flex; align-items: baseline; gap: 0.375rem; } -.api-heading-link { - flex: none; - display: inline-flex; - align-items: center; - justify-content: center; - min-inline-size: 1.5rem; - min-block-size: 1.5rem; - margin-inline-start: 0.25rem; - padding: 0.2rem 0.35rem; - color: var(--color-muted); - font-size: 0.875rem; - font-weight: 400; - text-decoration: none; -} -.api-heading-link:hover { color: var(--color-link); } -.api-heading-link:focus-visible { outline: 2px solid var(--focus-ring-color); outline-offset: 2px; } .api-related-types { margin-top: 2rem; } .api-related-cards { display: grid; gap: 0.75rem; margin-top: 0.75rem; } .api-related-card { padding: 0.875rem 1rem; border: 1px solid var(--color-edge); border-radius: 0.4rem; } @@ -934,12 +923,12 @@ html[data-api-sections-measured] .api-section-links { } .api-source-details { margin-block: 1rem 1.5rem; font-size: 0.875rem; } .api-source-details > summary { cursor: pointer; color: var(--color-muted); } -.api-reference-layout--symbol .api-reference-content [id] { +:is(.api-reference-layout--symbol, .api-reference-layout--glossary) .api-reference-content [id] { scroll-margin-top: 0; } @media print { - .api-page-contents, .api-section-links { display: none; } - .api-reference-layout--symbol { display: block; } + .api-page-contents, .api-glossary-contents, .api-section-links { display: none; } + :is(.api-reference-layout--symbol, .api-reference-layout--glossary) { display: block; } } @container gp-sphinx-api-entry (max-width: 36rem) { diff --git a/site/src/styles/global.css b/site/src/styles/global.css index df9716cb..56abe681 100644 --- a/site/src/styles/global.css +++ b/site/src/styles/global.css @@ -8,6 +8,7 @@ @import "./gp-sphinx-tokens.css"; @import "./brand.css"; @import "./api-kinds.css"; +@import "./api-headings.css"; @import "./flags.css" layer(components); @import "./image-loading.css" layer(components); /* Unlayered, like the widgets, so prose margins cannot outrank it. */ From a093b192a5af204777582feab0964cca6557902d Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 17:21:15 -0500 Subject: [PATCH 07/15] test(site) Enforce glossary navigation regressions why: Both real glossary layout paths now render their required controls. what: - Remove the strict expected-failure markers after source isolation - Load the shared heading styles in the existing parameter fixture --- site/test/api-glossary-navigation.test.ts | 8 ++++---- site/test/parameter-permalinks.test.ts | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/site/test/api-glossary-navigation.test.ts b/site/test/api-glossary-navigation.test.ts index 453f8547..2ea5651c 100644 --- a/site/test/api-glossary-navigation.test.ts +++ b/site/test/api-glossary-navigation.test.ts @@ -4,7 +4,7 @@ import { readFileSync, realpathSync } from 'node:fs' import { createRequire } from 'node:module' import { pathToFileURL } from 'node:url' import { experimental_AstroContainer } from 'astro/container' -import { Window } from 'happy-dom' +import { Window, type Document } from 'happy-dom' import * as model from '@libtmux/api-model' import * as glossary from '../src/lib/api-glossary' import { NATIVE_API_GLOSSARIES } from '../src/lib/api-glossary-native' @@ -147,7 +147,7 @@ function checkContents(document: Document, path: string) { } } -it.fails.each([{ port: 'go', term: 'struct' }, { port: 'ts', term: 'class' }])('renders $port core glossary contents without replacing the API browse tree', async ({ port, term }) => { +it.each([{ port: 'go', term: 'struct' }, { port: 'ts', term: 'class' }])('renders $port core glossary contents without replacing the API browse tree', async ({ port, term }) => { vi.stubEnv('LIBTMUX_DOCS_VERSION', 'v9-proof') const path = `${ports.referenceUrl(ports.PORT_BY_SLUG[port], 'v9-proof')}glossary/` const component = await (await components())('ApiReference') @@ -167,7 +167,7 @@ it.fails.each([{ port: 'go', term: 'struct' }, { port: 'ts', term: 'class' }])(' expect(win.document.querySelector('a[href$=".json"]')?.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) }) -it.fails.each([undefined, 'mcp', 'workspace'] as const)('preserves real DocsLayout contents and adds %s glossary permalinks', async (product) => { +it.each([undefined, 'mcp', 'workspace'] as const)('preserves real DocsLayout contents and adds %s glossary permalinks', async (product) => { const path = product ? `${ports.referenceUrl(ports.PORT_BY_SLUG.go, 'v9-proof', product)}glossary/` : glossary.API_GLOSSARY_PATH const component = await (await components())('ApiGlossary') const container = await experimental_AstroContainer.create() @@ -182,7 +182,7 @@ it.fails.each([undefined, 'mcp', 'workspace'] as const)('preserves real DocsLayo checkHeadings(win.document, path) }) -it.fails.each(Object.keys(NATIVE_API_GLOSSARIES))('keeps %s filtered native glossary targets and definitions in every product', async (port) => { +it.each(Object.keys(NATIVE_API_GLOSSARIES))('keeps %s filtered native glossary targets and definitions in every product', async (port) => { const component = await (await components())('ApiGlossaryContent') const container = await experimental_AstroContainer.create() const win = new Window() diff --git a/site/test/parameter-permalinks.test.ts b/site/test/parameter-permalinks.test.ts index 11ab61ca..f9bf6180 100644 --- a/site/test/parameter-permalinks.test.ts +++ b/site/test/parameter-permalinks.test.ts @@ -9,7 +9,8 @@ import { apiEntryFields, parameterBindingFacts, POWER_SHELL_COMMON_HELP } from ' import { linkTmuxDoc } from '../src/lib/tmux-links' const astroRequire = createRequire(realpathSync(new URL('../node_modules/astro/package.json', import.meta.url))) -const css = readFileSync(new URL('../src/styles/api.css', import.meta.url), 'utf8') +const css = ['api-headings.css', 'api.css'].map((name) => + readFileSync(new URL(`../src/styles/${name}`, import.meta.url), 'utf8')).join('\n') const windows: Window[] = [] afterEach(async () => { for (const win of windows.splice(0)) await win.happyDOM.abort() From 6c8ed30814d00f0acb480f9c4ef20a6fb26581a6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 20:06:20 -0500 Subject: [PATCH 08/15] test(glossary) Type native reference anchors why: Astro rejects href on an untyped compound selector. what: - Use the Happy DOM anchor type without changing runtime assertions --- site/test/api-glossary.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/test/api-glossary.test.ts b/site/test/api-glossary.test.ts index 5ce3bdba..3ac76c22 100644 --- a/site/test/api-glossary.test.ts +++ b/site/test/api-glossary.test.ts @@ -4,7 +4,7 @@ import { pathToFileURL } from 'node:url' import { afterEach, describe, expect, it, vi } from 'vitest' import ts from 'typescript' import { experimental_AstroContainer } from 'astro/container' -import { Window } from 'happy-dom' +import { Window, type HTMLAnchorElement } from 'happy-dom' import { API_GLOSSARY_GROUPS, ALL_GLOSSARY_GROUPS, MCP_GLOSSARY_GROUPS, API_GLOSSARY_PATH, apiGlossary, apiGlossaryHref, apiGlossaryMarkdown } from '../src/lib/api-glossary' import { NATIVE_API_GLOSSARIES } from '../src/lib/api-glossary-native' import { glossaryPreview } from '../src/lib/link-preview' @@ -295,7 +295,7 @@ describe('rendered API badges', () => { const section = win.document.querySelector('section[aria-labelledby="method"]')! expect(section.textContent).toContain('declared with def') expect(section.textContent).toContain('extension method') - expect([...section.querySelectorAll('p a')].map((link) => new URL(link.href).hostname)).toEqual(['docs.scala-lang.org', 'docs.scala-lang.org']) + expect([...section.querySelectorAll('p a')].map((link) => new URL(link.href).hostname)).toEqual(['docs.scala-lang.org', 'docs.scala-lang.org']) expect(win.document.body.textContent).not.toMatch(/Python|Julia/) expect(win.document.querySelector('a[href$=".json"]')!.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) expect(Boolean(win.document.querySelector('#readOnlyHint'))).toBe(product === 'mcp/') From 9d465d805597fb45ce91725e1399c1b3cc6e1d83 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 21:28:30 -0500 Subject: [PATCH 09/15] test(site[install]) Reproduce tab edge shortcuts why: Home and End leave package manager and language tabs unchanged. what: - Exercise the rendered component and its client script with strict failures. - Cover focus, saved choices and synchronized widget instances. - Preserve arrow, other-key and single-tab behavior. --- site/test/nuget-install.test.ts | 135 +++++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 2 deletions(-) diff --git a/site/test/nuget-install.test.ts b/site/test/nuget-install.test.ts index b5ae1dc3..228c165a 100644 --- a/site/test/nuget-install.test.ts +++ b/site/test/nuget-install.test.ts @@ -91,14 +91,14 @@ async function component() { return (await import(/* @vite-ignore */ url)).default })() } -async function render(slug: string, saved?: string) { +async function render(slug: string, saved?: string, ports = [slug]) { const win = new Window({ url: `https://libtmux.org/en/${slug}/latest/` }); windows.push(win) if (saved) { win.localStorage.setItem(`libtmux-docs.package-install.manager.${slug}`, saved) win.document.documentElement.setAttribute(`data-pkg-manager-${slug}`, saved) } const container = await experimental_AstroContainer.create() - win.document.body.innerHTML = await container.renderToString(await component(), { props: { ports: [slug] } }) + win.document.body.innerHTML = await container.renderToString(await component(), { props: { ports } }) const style = win.document.createElement('style') style.textContent = readFileSync(new URL('../src/components/widgets/package-install.css', import.meta.url), 'utf8') + pickerPaintRules() win.document.head.append(style) @@ -111,6 +111,137 @@ function hydrate(win: Window, file: URL) { win.document.dispatchEvent(new win.Event('astro:page-load')) } +async function renderPair(slug: string, ports = [slug]) { + const win = await render(slug, '3', ports) + win.document.body.append(win.document.querySelector('.lm-pkg-install')!.cloneNode(true)) + hydrate(win, packageFile) + return win +} + +function pressKey(win: Window, tab: HTMLButtonElement, key: string) { + tab.focus() + const event = new win.KeyboardEvent('keydown', { key, bubbles: true, cancelable: true }) + tab.dispatchEvent(event) + return event +} + +function expectSelected(tabs: HTMLButtonElement[], index: number) { + expect(tabs.map((tab) => [tab.getAttribute('aria-selected'), tab.tabIndex])).toEqual( + tabs.map((_, position) => [String(position === index), position === index ? 0 : -1]), + ) +} + +function tabGroups(win: Window, strip: 'manager' | 'language') { + const selector = strip === 'manager' + ? '.lm-pkg-install__panel[data-port="csharp"] .lm-pkg-install__manager' + : '.lm-pkg-install__tabs > .lm-pkg-install__tab' + return [...win.document.querySelectorAll('.lm-pkg-install')] + .map((widget) => [...widget.querySelectorAll(selector)]) +} + +function savedState(win: Window) { + return Array.from({ length: win.localStorage.length }, (_, index) => { + const key = win.localStorage.key(index)! + return [key, win.localStorage.getItem(key)] + }) +} + +describe('package tab keyboard navigation', () => { + it.fails.each([ + ['csharp', 'Home', 0], ['csharp', 'End', 7], + ['fsharp', 'Home', 0], ['fsharp', 'End', 7], + ] as const)('selects and remembers the %s manager edge with %s', async (slug, key, index) => { + const win = await renderPair(slug), doc = win.document + const panels = [...doc.querySelectorAll('.lm-pkg-install__panel')] + const groups = panels.map((panel) => [...panel.querySelectorAll('.lm-pkg-install__manager')]) + let changes = 0 + win.addEventListener('lm-pkg-install:manager', () => changes++) + const event = pressKey(win, groups[0][3], key) + expect(doc.activeElement?.getAttribute('data-manager-value')).toBe(String(index)) + expect(event.defaultPrevented).toBe(true) + expect(doc.activeElement).toBe(groups[0][index]) + for (const [position, tabs] of groups.entries()) { + expectSelected(tabs, index) + expect(panels[position].getAttribute('data-active-manager')).toBe(String(index)) + } + expect(doc.documentElement.getAttribute(`data-pkg-manager-${slug}`)).toBe(String(index)) + expect(win.localStorage.getItem(`libtmux-docs.package-install.manager.${slug}`)).toBe(String(index)) + expect(changes).toBe(1) + }) + + it.fails.each(['Home', 'End'])('selects and remembers the language edge with %s', async (key) => { + const win = await renderPair('csharp', ['csharp', 'fsharp']), doc = win.document + const groups = tabGroups(win, 'language'), index = key === 'Home' ? 0 : groups[0].length - 1 + const start = key === 'Home' ? groups[0].at(-1)! : groups[0][0] + start.click() + let changes = 0 + win.addEventListener('lm-pkg-install:change', () => changes++) + const event = pressKey(win, start, key), slug = groups[0][index].dataset.tabValue! + expect(doc.activeElement?.getAttribute('data-tab-value')).toBe(slug) + expect(event.defaultPrevented).toBe(true) + expect(doc.activeElement).toBe(groups[0][index]) + for (const tabs of groups) expectSelected(tabs, index) + expect([...doc.querySelectorAll('.lm-pkg-install')].map((widget) => widget.getAttribute('data-active-port'))).toEqual([slug, slug]) + expect(doc.documentElement.getAttribute('data-pkg-port')).toBe(slug) + expect(win.localStorage.getItem('libtmux-docs.package-install.port')).toBe(slug) + expect(changes).toBe(1) + }) + + it.each(['manager', 'language'] as const)('preserves wrapping arrow navigation in the %s strip', async (strip) => { + const win = await renderPair('csharp', ['csharp', 'fsharp']), groups = tabGroups(win, strip) + const last = groups[0].length - 1 + groups[0][last].click() + for (const [key, index] of [['ArrowRight', 0], ['ArrowLeft', last]] as const) { + const current = groups[0].find((tab) => tab.getAttribute('aria-selected') === 'true')! + expect(pressKey(win, current, key).defaultPrevented).toBe(true) + expect(win.document.activeElement).toBe(groups[0][index]) + for (const tabs of groups) expectSelected(tabs, index) + } + }) + + it.each(['manager', 'language'] as const)('leaves other keys to the %s strip', async (strip) => { + const win = await renderPair('csharp', ['csharp', 'fsharp']), groups = tabGroups(win, strip) + const index = strip === 'manager' ? 3 : 1, current = groups[0][index] + current.click() + const before = savedState(win) + let changes = 0 + win.addEventListener('lm-pkg-install:manager', () => changes++) + win.addEventListener('lm-pkg-install:change', () => changes++) + for (const key of ['Tab', 'Enter', ' ', 'ArrowUp', 'ArrowDown', 'x']) { + expect(pressKey(win, current, key).defaultPrevented).toBe(false) + expect(win.document.activeElement).toBe(current) + for (const tabs of groups) expectSelected(tabs, index) + expect(savedState(win)).toEqual(before) + } + expect(changes).toBe(0) + }) + + it.each(['manager', 'language'] as const)('keeps a single remaining %s tab unchanged', async (strip) => { + const win = await renderPair('csharp', ['csharp', 'fsharp']), groups = tabGroups(win, strip) + const current = groups[0][0] + current.click() + for (const tab of groups[0].slice(1)) tab.remove() + const before = savedState(win) + let changes = 0 + win.addEventListener('lm-pkg-install:manager', () => changes++) + win.addEventListener('lm-pkg-install:change', () => changes++) + for (const key of ['Home', 'End', 'ArrowLeft', 'ArrowRight']) { + expect(pressKey(win, current, key).defaultPrevented).toBe(false) + expect(win.document.activeElement).toBe(current) + expectSelected([current], 0) + expectSelected(groups[1], 0) + expect(savedState(win)).toEqual(before) + } + expect(changes).toBe(0) + }) + + it('omits tab strips when the rendered port has one install choice', async () => { + const win = await render('rs') + expect(win.document.querySelectorAll('[role="tab"]')).toHaveLength(0) + expect(win.document.querySelectorAll('.lm-pkg-install__cmd')).toHaveLength(1) + }) +}) + describe('NuGet widget rendering and copied fragments', () => { it.each(['csharp', 'fsharp'])('paints the saved CPM choice and copies each %s fragment separately', async (slug) => { const win = await render(slug, '3'), doc = win.document From 3ce67910c2603a84133fa812cac41fcda2c048d6 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 21:30:14 -0500 Subject: [PATCH 10/15] fix(site[install]) Honor Home and End tab keys why: The shared tab handler ignored edge keys, leaving NuGet managers and language choices unchanged. what: - Select the first or last tab through the existing focus and sync path. - Retain arrow wrapping and single-tab and other-key handling. --- site/src/components/widgets/PackageInstall.astro | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/site/src/components/widgets/PackageInstall.astro b/site/src/components/widgets/PackageInstall.astro index 7391630b..26dae70c 100644 --- a/site/src/components/widgets/PackageInstall.astro +++ b/site/src/components/widgets/PackageInstall.astro @@ -382,11 +382,12 @@ const cooldownGroup = (slug: string) => `cooldown-mode-${packageId}-${slug}` } /** - * Arrow keys along a tab strip. + * Keyboard navigation along a tab strip. * * `role="tablist"` is a promise that Left and Right move between the tabs; * without it a keyboard reader Tabs through every tab in the strip to reach - * the content, which is what the roles exist to avoid. Shared by both strips + * the content, which is what the roles exist to avoid. Home and End select + * the first and last tabs. Shared by both strips * because the mechanism is the same either way — only the selector and what * a selection means differ. */ @@ -397,9 +398,11 @@ const cooldownGroup = (slug: string) => `cooldown-mode-${packageId}-${slug}` select: (tab: HTMLButtonElement) => void, ) { const delta = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0 - if (!delta || tabs.length < 2) return + if ((!delta && event.key !== 'Home' && event.key !== 'End') || tabs.length < 2) return event.preventDefault() - const next = tabs[(tabs.indexOf(current) + delta + tabs.length) % tabs.length]! + const index = event.key === 'Home' ? 0 : event.key === 'End' ? tabs.length - 1 + : (tabs.indexOf(current) + delta + tabs.length) % tabs.length + const next = tabs[index]! select(next) next.focus() } From 1e006401cb7a1f26257e1c85252ca64c07cc1f6c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 21:30:43 -0500 Subject: [PATCH 11/15] test(site[install]) Enforce Home and End navigation why: Edge keys now select and focus the first and last tabs. what: Run the component regressions without expected-failure markers, including persisted choices and cross-instance synchronization. --- site/test/nuget-install.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/test/nuget-install.test.ts b/site/test/nuget-install.test.ts index 228c165a..bb3d4aa1 100644 --- a/site/test/nuget-install.test.ts +++ b/site/test/nuget-install.test.ts @@ -147,7 +147,7 @@ function savedState(win: Window) { } describe('package tab keyboard navigation', () => { - it.fails.each([ + it.each([ ['csharp', 'Home', 0], ['csharp', 'End', 7], ['fsharp', 'Home', 0], ['fsharp', 'End', 7], ] as const)('selects and remembers the %s manager edge with %s', async (slug, key, index) => { @@ -169,7 +169,7 @@ describe('package tab keyboard navigation', () => { expect(changes).toBe(1) }) - it.fails.each(['Home', 'End'])('selects and remembers the language edge with %s', async (key) => { + it.each(['Home', 'End'])('selects and remembers the language edge with %s', async (key) => { const win = await renderPair('csharp', ['csharp', 'fsharp']), doc = win.document const groups = tabGroups(win, 'language'), index = key === 'Home' ? 0 : groups[0].length - 1 const start = key === 'Home' ? groups[0].at(-1)! : groups[0][0] From 81be64445bb371b8069c034cc0a2e49c15a56c46 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Fri, 16 Oct 2026 21:41:05 -0500 Subject: [PATCH 12/15] test(site[contents]) Reproduce the layout handoff gap Exercise emitted product and hub controls through the responsive handoff, including native details and the actual drawer lifecycle. Strict expected failures retain the missing 64rem to 80rem channel. --- site/test/api-glossary-navigation.test.ts | 191 +++++++++++++++++++++- 1 file changed, 185 insertions(+), 6 deletions(-) diff --git a/site/test/api-glossary-navigation.test.ts b/site/test/api-glossary-navigation.test.ts index 2ea5651c..7600ca9e 100644 --- a/site/test/api-glossary-navigation.test.ts +++ b/site/test/api-glossary-navigation.test.ts @@ -4,7 +4,9 @@ import { readFileSync, realpathSync } from 'node:fs' import { createRequire } from 'node:module' import { pathToFileURL } from 'node:url' import { experimental_AstroContainer } from 'astro/container' -import { Window, type Document } from 'happy-dom' +import { Window, type Document, type Element, type HTMLElement } from 'happy-dom' +import ts from 'typescript' +import { compile as compileTailwind } from 'tailwindcss' import * as model from '@libtmux/api-model' import * as glossary from '../src/lib/api-glossary' import { NATIVE_API_GLOSSARIES } from '../src/lib/api-glossary-native' @@ -25,9 +27,11 @@ import * as documentation from '../src/lib/documentation-navigation' import * as pagePorts from '../src/lib/page-ports-for' import * as markdown from '../src/lib/markdown-twins' import * as manual from '../src/lib/tmux-manual-data' +import * as reference from '../src/lib/tmux-reference' import * as locales from '../src/i18n/locales' import * as resolve from '../src/i18n/resolve' import * as contribute from '../src/i18n/contribute' +import * as ui from '../src/i18n/ui' import * as constants from '../src/constants' import * as toc from '../src/utils/generateToC' import * as branding from '../src/lib/branding' @@ -49,10 +53,10 @@ async function components() { 'api-relationships': relationships, 'api-tree': tree, 'api-search': search, 'api-labels': labels, 'word-break': wordBreak, ports, 'product-api': products, versions, 'site-root': roots, sidebar, 'documentation-navigation': documentation, - 'page-ports-for': pagePorts, 'markdown-twins': markdown, 'tmux-manual-data': manual, + 'page-ports-for': pagePorts, 'markdown-twins': markdown, 'tmux-manual-data': manual, 'tmux-reference': reference, branding, }).map(([name, exports]) => [new URL(`../src/lib/${name}.ts`, import.meta.url).href, exports])), - ...Object.fromEntries(Object.entries({ locales, resolve, contribute }).map(([name, exports]) => + ...Object.fromEntries(Object.entries({ locales, resolve, contribute, ui }).map(([name, exports]) => [new URL(`../src/i18n/${name}.ts`, import.meta.url).href, exports])), [new URL('../src/components/api/api-tree-state.ts', import.meta.url).href]: treeState, [new URL('../src/constants.ts', import.meta.url).href]: constants, @@ -68,9 +72,11 @@ async function components() { 'api/ApiPageContents.astro', 'api/ApiTree.astro', 'api/ApiTreeItems.astro', 'api/ApiBadge.astro', 'api/SymbolName.astro', 'TableOfContents/TableOfContents.astro', 'TableOfContents/TableOfContentsList.astro', 'MobileToC.astro', + 'docs/DocumentationContext.astro', 'docs/DocumentationNavigationButtons.astro', ].map((name) => new URL(`../src/components/${name}`, import.meta.url).href)) realTemplates.add(new URL('../src/layouts/DocsLayout.astro', import.meta.url).href) const compiled = new Map() + const styles: string[] = [] // Collection loading and outer chrome are outside this regression. No glossary or TOC stub. const shell = (await transform('', { filename: 'glossary-test-chrome.astro', internalURL: 'astro/compiler-runtime', resultScopedSlot: true, @@ -81,12 +87,14 @@ async function components() { async function compile(file: URL): Promise { if (compiled.has(file.href)) return compiled.get(file.href)! const source = readFileSync(file, 'utf8') - .replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/g, '') + .replace(/]*>[\s\S]*?<\/script>/g, '') .replace(/^import ['"][^'"\n]+\.css['"];?\s*$/gm, '') const result = await transform(source, { filename: file.pathname, internalURL: 'astro/compiler-runtime', - resultScopedSlot: true, resolvePath: (specifier: string) => specifier }) + resultScopedSlot: true, scopedStyleStrategy: 'attribute', resolvePath: (specifier: string) => specifier }) expect(result.diagnostics.filter((item: { severity: string }) => item.severity === 'error')).toEqual([]) + styles.push(...result.css) let code = result.code.replaceAll('"astro/compiler-runtime"', JSON.stringify(runtime)) + .replace(/^import ["'][^"'\n]+\?astro&type=style[^"'\n]+["'];?\s*$/gm, '') const specifiers = [...code.matchAll(/\bfrom\s+["']([^"']+)["']/g)].map((match) => match[1]) for (const specifier of new Set(specifiers)) { if (specifier === 'astro/compiler-runtime' || specifier === runtime || specifier.startsWith('node:')) continue @@ -109,7 +117,8 @@ async function components() { compiled.set(file.href, url) return url } - return async (name: string) => (await import(/* @vite-ignore */ await compile(new URL(`../src/components/api/${name}.astro`, import.meta.url)))).default + return Object.assign(async (name: string) => + (await import(/* @vite-ignore */ await compile(new URL(`../src/components/api/${name}.astro`, import.meta.url)))).default, { styles }) } function expectedHeadings(path: string) { @@ -201,3 +210,173 @@ it.each(Object.keys(NATIVE_API_GLOSSARIES))('keeps %s filtered native glossary t expect(win.document.querySelector('a[href$=".json"]')?.getAttribute('href')).toBe(`${path.slice(0, -1)}.json`) } }) + +// Use the installed Tailwind theme and actual emitted component CSS. No +// hand-written breakpoint styles stand in for the production controls. +async function paint(win: Window, styles: string[]) { + const require = createRequire(new URL('../package.json', import.meta.url)) + const theme = readFileSync(require.resolve('tailwindcss/theme.css'), 'utf8') + const compiler = await compileTailwind(`${theme}\n@tailwind utilities;`) + const classes = [...win.document.querySelectorAll('[class]')].flatMap((element) => [...element.classList]) + const style = win.document.createElement('style') + style.textContent = `${compiler.build(classes)}\n${styles.join('\n')}` + win.document.head.append(style) +} + +function displayed(win: Window, element: Element | null): boolean { + if (!element) return false + for (let current: Element | null = element; current; current = current.parentElement) { + if (win.getComputedStyle(current).display === 'none') return false + } + return true +} + +async function contentsPage(product: 'mcp' | undefined, width: number, javascript = true, empty = false) { + const path = pathFor(product) + const templates = await components() + const container = await experimental_AstroContainer.create() + const html = await container.renderToString(await templates(empty ? '../../layouts/DocsLayout' : 'ApiGlossary'), { + props: empty + ? { title: 'No headings', ...(product ? { port: 'go' } : {}), version: 'latest', navigation: [], pagePorts: [], breadcrumbs: [] } + : { ...(product ? { port: 'go', product } : {}), version: 'latest' }, + request: new Request(`https://libtmux.org${path}`), + }) + const win = new Window({ url: `https://libtmux.org${path}`, width, height: 899 }) + windows.push(win) + // Select the real noscript payload for the DOM fixture. This does not claim + // browser no-JavaScript rendering or geometry acceptance. + win.document.body.innerHTML = html.replace(/]*>([\s\S]*?)<\/noscript>/g, javascript ? '' : '$1') + await paint(win, templates.styles) + return win +} + +const contentsCases = (widths: number[]) => [undefined, 'mcp' as const].flatMap((product) => + [true, false].flatMap((javascript) => widths.map((width) => ({ product, javascript, width })))) + +async function checkContentsHandoff({ product, javascript, width }: ReturnType[number]) { + const win = await contentsPage(product, width, javascript) + const doc = win.document + const desktop = doc.querySelector('main + aside nav.toc-nav') + const fallback = [...doc.querySelectorAll('.mobile-fallback details')] + const browse = fallback.find((details) => details.querySelector('summary')?.textContent === 'Browse documentation') + const contents = fallback.find((details) => details.querySelector('summary')?.textContent === 'On this page') + const compact = javascript ? doc.getElementById('mobile-toc-toggle') : contents ?? null + expect(displayed(win, compact), 'compact contents remains available until its desktop replacement').toBe(width < 1280) + expect(displayed(win, desktop), 'desktop contents retains its existing 80rem handoff').toBe(width >= 1280) + expect([compact, desktop].filter((element) => displayed(win, element))).toHaveLength(1) + if (javascript) { + expect(displayed(win, doc.getElementById('mobile-sidebar-toggle')), 'navigation still hands off at 64rem').toBe(width < 1024) + expect(displayed(win, doc.getElementById('mobile-toc'))).toBe(width < 1280) + expect(displayed(win, doc.getElementById('mobile-toc-overlay'))).toBe(width < 1280) + expect(doc.getElementById('mobile-toc-toggle')?.getAttribute('aria-controls')).toBe('mobile-toc') + expect(doc.getElementById('mobile-toc')?.hasAttribute('inert')).toBe(true) + } else { + expect(displayed(win, browse ?? null), 'native navigation still hands off at 64rem').toBe(width < 1024) + expect(displayed(win, doc.getElementById('mobile-toc-toggle'))).toBe(false) + expect(displayed(win, doc.getElementById('mobile-toc'))).toBe(false) + expect(contents?.querySelector('summary')?.textContent).toBe('On this page') + } + checkContents(doc, pathFor(product)) +} + +function pathFor(product: 'mcp' | undefined) { + return product ? '/en/go/latest/mcp/reference/glossary/' : glossary.API_GLOSSARY_PATH +} + +it.each(contentsCases([390, 1023, 1280, 1440]))('retains contents handoff controls at $width, product=$product, JS=$javascript', checkContentsHandoff) +it.fails.each(contentsCases([1024, 1036, 1279]))('bridges contents handoff at $width, product=$product, JS=$javascript', checkContentsHandoff) + +function hydrateDrawers(win: Window) { + for (const name of ['layouts/DocsLayout.astro', 'components/MobileToC.astro']) { + const source = readFileSync(new URL(`../src/${name}`, import.meta.url), 'utf8') + const script = source.match(/