Repository navigation
Releases
Releases · AmritaBot/mcp-ssh-reloaded
0.7.0
What's Changed
- Experimental
read_imagetool (#8): returns a remote PNG, JPEG, GIF or WebP as MCP image content. Off by default; enable with--enable-image-readingorMCP_SSH_ENABLE_IMAGE_READING=true. - Validation uses magic bytes and container structure only, never the file extension: PNG signature, IHDR checksum, IDAT and IEND; JPEG frame header and EOI; GIF block walk with image data; WebP RIFF and chunk lengths with VP8/VP8L/VP8X headers. Anything else is rejected with
Unsupported image format. - File size is capped by
MCP_SSH_MAX_IMAGE_BYTES(4 MB) and decoded dimensions byMCP_SSH_MAX_IMAGE_PIXELS(16 MP, 8192 per side). - Tool errors now keep the category set by the service layer instead of being re-categorized as
unknown. - The tool is removed again when image reading is disabled at runtime.
Full Changelog: v0.6.0...v0.7.0
0.6.0
0.5.0
0.4.2
What's Changed
- Fix: pager hardening, SFTP for multi-line scripts, and command-echo stripping by @AmriaLin in #4
- Chore: add AGENTS.md, enforce English single-line comments, drop all type-ignores by @AmriaLin in #5
Full Changelog: 0.4.1...v0.4.2
0.4.1
UTF-8-safe, resumable remote file reads, and quieter session diagnostics.
read_fileno longer prints the[CONTENT TRUNCATED ...]notice twice:FileManager.read_filereturns a structuredFileContentand the notice is rendered exactly once, inserver.py- reads are line-windowed, so the byte cap lands on a line boundary and a trailing partial character is trimmed by an incremental decoder — the result is always valid UTF-8
- added
start_line(1-based) andmax_lines; a truncated read reports its line range and thenext_start_lineto resume from, plustotal_lineswhen the whole file was read - the
sudo catfallback base64-wraps its payload so the byte cap cannot split a character on the wire, and usessedfor the line window get_session_diagnosticscollapses each recent command to a single short line, so a heredoc no longer floods theRecentfield
Full Changelog: 0.4.0...0.4.1
0.4.0
Interrupt recovery, bounded output and owned session state.
interrupt_command_by_idnow cancels the read loop, so an interrupted command no longer leaves the session wedged; the 30-second auto-recovery path does the same- a second reader can no longer race the previous worker for the same channel; the cancelled worker settles on
INTERRUPTEDwith exit code130 OutputBufferreplacesOutputLimiter: head 8 KB + tail 32 KB stay in memory, anything past 64 KB spills to a file whose path is returned instead of borrowing exit code124- truncation actually reaches the caller:
truncated/spilled_pathnow travel from the worker throughget_command_status()intoExecutionResultandCommandResult SessionRegistrycollects the twelve pieces of per-session state, removes cross-module private access and adds a per-session execution lock- output limits honour
MCP_SSH_MAX_OUTPUT_BYTES, and the head/tail windows are clamped to it
Full Changelog: 0.3.0...0.4.0
0.3.0
Consolidated types, a single execution stack and structured command results.
- all data types now live in
models.py;api_types.pyanddatastructures.pyare backward-compatible re-export shims CommandExecutoris the single execution stack;EnhancedCommandExecutoris demoted to an options layer (auto-extend / streaming / progress)CommandExecutor.execute_result()returns a structuredExecutionResult; exit code124and theASYNC:/AWAITING_INPUT:string protocols are now confined to a single adapter- integration tests run in CI against a throw-away sshd container (
.github/workflows/integration.yml) - MCP tool names, parameters and rendered output are unchanged
Full Changelog: 0.2.1...0.3.0
0.2.1
Fix: async file bugs
Full Changelog: v0.2.0...0.2.1
0.2.0
0.1.0
First Release.
Full Changelog: https://github.com/AmritaBot/MCPSSHSession-Reloaded/commits/v0.1.0