Skip to main content
Glama
kurtzhi

fsext-mcp-server

by kurtzhi
README.md
# FsExt\-MCP\-Server \(TypeScript\)

## Overview

A high\-performance, secure, and production\-grade Model Context Protocol \(MCP\) server built with TypeScript, providing comprehensive filesystem operations, advanced text search \& replace, image processing, and Tesseract OCR capabilities\. Designed for LLM agent integration, it delivers strict input validation, standardized response structures, streaming large\-file processing, and multi\-transport remote deployment support\.

This server fully complies with the official MCP specification, supporting`stdio` local integration, `SSE` legacy streaming transport, and modern `Streamable HTTP` bidirectional transport, serving as a universal filesystem tool backend for AI agents and automated workflow systems\.

## Core Features

- **Full Filesystem CRUD \& Directory Management**:Complete file/directory creation, deletion, copy, move, metadata query, and existence verification\. Supports recursive full\-directory tree replication and safe move operations with conflict protection\.

- **Streaming File I/O for Large Files**:Implements segmented text reading, chunked binary streaming reading, text/binary overwriting and appending\. Avoids full memory loading, perfectly supporting GB\-level large file processing\.

- **Advanced Text Search \& In\-Place Replace**:Directory\-wide recursive content search, single/multi\-file contextual matching with preview lines, regular expression support, case\-insensitive matching, and precise in\-file text replacement with change statistics\.

- **Professional Image Processing Suite**:Built\-in high\-performance image resize \(aspect ratio lock support\), precise crop, and arbitrary\-angle rotation based on Sharp, covering mainstream image editing scenarios\.

- **Cross\-Platform Tesseract OCR**:WASM\-first OCR recognition with customizable local Tesseract binary and tessdata paths, supporting multi\-language text extraction from images without local engine installation dependency\.

- **Strict Strict Input Validation \& Standardized Response**:All tool schemas enable strict additional property prohibition, with unified success/error response structures for consistent client parsing and error handling\.

- **Multi\-Standard MCP Transports**:Natively supports three official MCP transports: `stdio` \(local client\), `SSE` \(legacy remote stream\), `Streamable HTTP` \(modern bidirectional remote transport\)\.

- **Full TypeScript Type Safety**:Complete type definitions for all tool parameters, response structures, and transport configurations, ensuring runtime stability and development friendliness\.

## Quick Start

### Prerequisites

Node\.js `>=22.0.0 <27.0.0`

### Installation

#### Global Installation \(Recommended for CLI Usage\)

```bash
npm install -g fsext-mcp-server
```

#### Local Project Installation

```bash
npm install fsext-mcp-server
```

### Startup Commands

#### 1\. Default Stdio Mode \(For Claude Desktop / Cursor / Local MCP Clients\)

```bash
# Default stdio transport for local agent integration
fsext-mcp-server-ts
fsext-mcp-server

# Short alias
fsext-ts
fsext
```

#### 2\. SSE Remote Transport Mode

```bash
fsext-mcp-server --transport sse --host 0.0.0.0 --port 8000
```

**Endpoints**:

- SSE Stream Subscription:`http://<host>:<port>/sse`

- Client Request Channel: `http://<host>:<port>/messages`

#### 3\. Modern Streamable HTTP Transport Mode

```bash
fsext-mcp-server --transport http --host 0.0.0.0 --port 8000
```

**Unified Bidirectional Endpoint**: `http://<host>:<port>/mcp`

### Transport Mode Comparison

|Feature|SSE Transport|Streamable HTTP|
|---|---|---|
|Endpoint Architecture|Dual endpoints \(GET stream \+ POST message\)|Single unified bidirectional endpoint|
|Communication Mode|Unidirectional server\-to\-client streaming|Full bidirectional streaming \& standard HTTP response|
|Connection Stability|Prone to session inconsistency|Auto session recovery, high concurrency optimized|
|Specification Status|Legacy compatible|Latest official MCP standard|

## Client Configuration Example

### MCP Client JSON Config \(Cursor / Claude Desktop\)

```json
{
  "mcpServers": {
    "fsext": {
      "command": "fsext-mcp-server",
      "args": [],
      "env": {}
    }
  }
}
```

## Unified Global Response Specification

All MCP tools adopt a consistent top\-level response structure for both success and failure scenarios, enabling universal client parsing logic\.

### General Structure

```json
{
  "res": {
    "success": boolean,
    "info": object
  }
}
```

### Success Response

`success: true` \- The `info` field carries tool\-specific business data\.

### Error Response \(Unified Standard\)

`success: false` \- All errors \(IO failure, invalid params, path error, runtime exception\) return fixed error structure:

```json
{
  "res": {
    "success": false,
    "info": {
      "code": "ERROR_CODE",
      "message": "Human-readable detailed error message"
    }
  }
}
```

## Full MCP Tools Reference

All tools enable `additionalProperties: false` strict validation to reject illegal input parameters, ensuring invocation safety\.

### 1\. Directory Operation Tools

#### fs\_list\_directory

**Description**: Scan target directory, return filtered absolute path list, support recursive traversal, pure file filtering, and suffix filtering\.

**Parameters**:

- `source_dir` \(string, required\): Target directory path for scanning

- `recursive` \(boolean, required\): Enable recursive subdirectory scanning

- `only_files` \(boolean, required\): Return only files, exclude directories

- `file_extension` \(string, optional, default=""\): Filter files by specified suffix

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "paths": ["/absolute/path/file1.txt", "/absolute/path/file2.js"]
    }
  }
}
```

#### fs\_copy\_directory

**Description**: Recursively copy full directory tree, support overwriting existing target directories\.

**Parameters**:

- `source_dir` \(string, required\): Source directory path

- `copy_dest_dir` \(string, required\): Target directory path

- `overwrite` \(boolean, optional, default=false\): Clean and overwrite existing target directory

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {}
  }
}
```

#### fs\_move\_directory

**Description**: Move entire directory tree, fail fast if target path exists to prevent accidental overwriting\.

**Parameters**:

- `source_dir` \(string, required\): Source directory path

- `dest_dir` \(string, required\): Target directory path

- `overwrite` \(boolean, optional, default=false\): Allow overwriting conflicting directory

**Success Response**: Empty info object with success flag

### 2\. File Basic Operation Tools

#### fs\_create\_file

**Description**: Create empty or content\-filled file, auto\-create missing parent directories, support multi\-encoding\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `content` \(string, optional, default=""\): Initial text content

- `charset` \(string, optional, default=utf\-8\): Encoding enum: utf\-8, ucs\-2, utf16le, latin1, ascii, base64, hex

**Success Response**: Empty info object with success flag

#### fs\_delete\_file

**Description**: Delete single regular file only; reject directory paths to avoid batch deletion risks\.

**Parameters**:

- `file_path` \(string, required\): Target file path

**Success Response**: Empty info object with success flag

#### fs\_copy\_file

**Description**: Copy single file with complete metadata retention, support overwrite control\.

**Parameters**:

- `source_file_path` \(string, required\): Source file path

- `dest_file_path` \(string, required\): Target file path

- `overwrite` \(boolean, optional, default=false\): Overwrite existing target file

**Success Response**: Empty info object with success flag

#### fs\_move\_file

**Description**: Move single file with configurable overwrite behavior\.

**Parameters**:

- `source_file_path` \(string, required\): Source file path

- `dest_file_path` \(string, required\): Target file path

- `overwrite` \(boolean, optional, default=false\): Overwrite conflicting file

**Success Response**: Empty info object with success flag

#### fs\_get\_file\_info

**Description**: Obtain full metadata of file/directory, support optional SHA\-256 digest calculation\.

**Parameters**:

- `file_path` \(string, required\): Target entry path

- `calc_digest` \(boolean, optional, default=false\): Calculate SHA\-256 hash

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "absolute_path": "string",
      "is_readable": true,
      "is_writable": true,
      "size": 1672,
      "is_regular_file": true,
      "is_directory": false,
      "is_symbolic_link": false,
      "creation_millis": 1782288135574,
      "last_modified_millis": 1782279393020,
      "last_access_millis": 1782644004556,
      "sha256_digest": "calculated-hash-string"
    }
  }
}
```

#### fs\_is\_file\_exists

**Description**: Lightweight existence check for file or directory\.

**Parameters**:

- `file_path` \(string, required\): Target path

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "exists": true
    }
  }
}
```

### 3\. File Read \& Write Tools

#### fs\_read\_full\_text

**Description**: Read full text content of target file with specified encoding\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `charset` \(string, optional, default=utf\-8\): Multi encoding support

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "content": "full-text-file-content"
    }
  }
}
```

#### fs\_read\_text\_range

**Description**: Segmented text reading for large files, support skip leading lines and limit read lines\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `lines_to_skip` \(integer, required\): Number of leading lines to skip

- `max_lines_to_read` \(integer, required\): Maximum lines to read

- `line_separator` \(string, optional, default="\\n"\): Line break character

- `charset` \(string, optional, default=utf\-8\): File encoding

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "lines_count": 5,
      "content": "segmented-text-content"
    }
  }
}
```

#### fs\_read\_binary\_chunk

**Description**: Chunked binary file reading, return Base64 encoded data for safe network transmission, support stream end detection\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `bytes_to_skip` \(integer, required\): Leading bytes to skip

- `max_bytes_to_read` \(integer, required\): Maximum bytes to read

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "data_base64": "base64-encoded-binary",
      "raw_bytes_length": 5,
      "end_of_stream": true
    }
  }
}
```

#### fs\_write\_text

**Description**: Write text content to file, support overwrite or append mode\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `text` \(string, required, minLength=1\): Text content to write

- `append` \(boolean, optional, default=false\): Append mode switch

- `charset` \(string, optional, default=utf\-8\): File encoding

**Success Response**: Empty info object with success flag

#### fs\_write\_binary

**Description**: Write Base64 decoded binary data to file, support append operation\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `base64_data` \(string, required, minLength=1\): Base64 encoded binary data

- `append` \(boolean, optional, default=false\): Append mode switch

**Success Response**: Empty info object with success flag

### 4\. Search \& Replace Tools

#### fs\_search\_files\_by\_content

**Description**: Recursively scan directory, return all file paths containing target content, support regex, case ignore, suffix filter\.

**Parameters**:

- `dir_path` \(string, required\): Scan root directory

- `recursive` \(boolean, required\): Recursive scan enable

- `search_term` \(string, required\): Search keyword or regex pattern

- `is_regex` \(boolean, optional, default=false\): Regex matching enable

- `ignore_case` \(boolean, optional, default=true\): Case\-insensitive matching

- `file_extension` \(string, optional, default=""\): File suffix filter

- `charset` \(string, optional, default=utf\-8\): File encoding

#### fs\_search\_in\_files\_by\_content

**Description**: Multi\-file content matching, return structured results with customizable context lines and result limit\.

**Parameters**:

- `dir_path` \(string, required\): Scan root directory

- `recursive` \(boolean, required\): Recursive scan enable

- `search_term` \(string, required\): Search keyword/regex

- `limit` \(integer, required\): Max matching result count

- `is_regex` \(boolean, optional, default=false\): Regex enable

- `ignore_case` \(boolean, optional, default=true\): Case ignore

- `lines_before` \(integer, optional, default=0\): Preceding context lines

- `lines_after` \(integer, optional, default=0\): Subsequent context lines

- `file_extension` \(string, optional, default=""\): Suffix filter

- `charset` \(string, optional, default=utf\-8\): File encoding

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "results": [
        {
          "file_path": "/test/file.ts",
          "start_line": 1,
          "end_line": 1,
          "text": "matched-content-line"
        }
      ]
    }
  }
}
```

#### fs\_search\_in\_file\_by\_content

**Description**: Precise single\-file content search with line context preview\.

**Parameters**: Similar to multi\-file search, single file path input

**Success Response**: Structured single\-file matching results

#### fs\_file\_replace

**Description**: In\-place text replacement in single file, return total replaced count\.

**Parameters**:

- `file_path` \(string, required\): Target file path

- `search_term` \(string, required\): Text to replace

- `replacement` \(string, required\): New replacement text

- `line_separator` \(string, optional, default="\\n"\): Line break separator

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "count": 1
    }
  }
}
```

### 5\. Image Processing Tools

#### fs\_image\_resize

**Description**: Resize image with aspect ratio lock support, generate new output image file\.

**Parameters**:

- `source_path` \(string, required\): Source image path

- `dest_path` \(string, required\): Output image path

- `width` \(integer, required, \>0\): Target width

- `height` \(integer, required, \>0\): Target height

- `keep_aspect_ratio` \(boolean, optional, default=true\): Lock original aspect ratio

**Success Response**: Empty info object with success flag

#### fs\_image\_crop

**Description**: Crop specified rectangular region from source image and export new file\.

**Parameters**:

- `source_path` \(string, required\): Source image path

- `dest_path` \(string, required\): Output image path

- `x` \(integer, required, ≥0\): Crop start X coordinate

- `y` \(integer, required, ≥0\): Crop start Y coordinate

- `width` \(integer, required, \>0\): Crop region width

- `height` \(integer, required, \>0\): Crop region height

**Success Response**: Empty info object with success flag

#### fs\_image\_rotate

**Description**: Rotate image clockwise by arbitrary degrees, auto expand canvas to preserve full content\.

**Parameters**:

- `source_path` \(string, required\): Source image path

- `dest_path` \(string, required\): Output image path

- `degrees` \(number, required\): Clockwise rotation angle

**Success Response**: Empty info object with success flag

### 6\. OCR Tool

#### fs\_ocr\_extract\_text

**Description**: Extract text from images via Tesseract OCR, support WASM runtime \(no local engine\) and custom local binary path\.

**Parameters**:

- `image_path` \(string, required\): Target image path

- `tesseract_bin_path` \(string, optional, default=""\): Custom Tesseract executable path

- `tessdata_path` \(string, optional, default=""\): Custom tessdata language resource path

- `lang` \(string, optional, default eng\): Recognition language prefix

**Success Response**:

```json
{
  "res": {
    "success": true,
    "info": {
      "content": "extracted-ocr-text-content"
    }
  }
}
```

## Project Build \& Development

### Scripts

```bash
# Clean build artifacts
npm run clean

# Compile TypeScript source
npm run build

# Watch mode for development
npm run dev

# Full rebuild (clean + build)
npm run rebuild

# Start SSE transport server
npm run server

# FastMCP dev mode
npm run fastmcp

# MCP Inspector debugging
npm run inspect

# Build and run test cases
npm run test
```

## Dependencies

### Core Runtime Dependencies

- **fastmcp**: Official MCP server runtime framework

- **sharp**: High\-performance image processing engine

- **tesseract\.js**: WASM\-based cross\-platform OCR engine

- **winston**: Standard logging system

- **zod**: Strict schema validation for tool parameters

- **chardet / iconv\-lite**: Multi\-encoding detection and conversion

- **cors**: Cross\-origin resource sharing support for HTTP transport

- **minimist**: CLI parameter parsing

## License

This project is open\-sourced under the **Apache License 2\.0**\. See the `LICENSE` file in the project root for full license details\.

## Repository \& Issues

- **GitHub**: [https://github\.com/kurtzhi/fsext\-mcp\-server\-typescript](https://github.com/kurtzhi/fsext-mcp-server-typescript)

- **Issues**: [Report bugs or request features](https://github.com/kurtzhi/fsext-mcp-server-typescript/issues)

TDQS

B3/5.0

Scored across 22 tools

Disambiguation5/5

Every tool has a clearly distinct purpose, from file operations to image manipulation and OCR, with no ambiguity between them.

Naming Consistency5/5

All tools use the 'fs_' prefix and follow a consistent verb_noun pattern (e.g., fs_copy_directory, fs_read_text_range), making them predictable.

Tool Count4/5

22 tools cover a broad range of file system tasks, which is slightly above the typical well-scoped range but still reasonable given the scope.

Completeness3/5

The set includes many useful operations but omits fundamental ones like directory deletion and file renaming, leaving notable gaps.

Maintenance

ActivityStale
ResponsivenessNo issues