Solves the legacy encoding problem that breaks most AI file operations. Exposes 21 tools including read_text_file, write_file, edit_file, and grep_text_files, all with automatic detection and conversion across 22 encodings: Windows-125x, ISO-8859, KOI8-R, CP866, and UTF variants with BOM handling. Built in Go, runs as a stdio transport with directory-based access control. You'll want this when working with Delphi projects, old VB6 codebases, or any PHP/HTML sites that predate UTF-8. Instead of seeing corrupted Cyrillic or Western European characters, Claude reads the actual text. Also includes tree views, regex search, line ending conversion, and encoding detection with confidence scores.
Claude sees Настройки — not ???? or Íàñòðîéêè.
MCP server for file operations with non-UTF-8 encoding support. Auto-detects and converts 22 encodings (Cyrillic, Windows-125x, ISO-8859, KOI8, UTF-16) so AI assistants can read and write legacy files without corrupting data.
Perfect for: Delphi/Pascal projects, legacy VB6 apps, old PHP/HTML sites, config files with non-UTF-8 text.
Provides 21 tools for file operations with automatic encoding conversion:
read_text_file - Read files with encoding auto-detection and conversionread_multiple_files - Read multiple files concurrently with encoding supportwrite_file - Write files in specific encodingsedit_file - Line-based edits with diff preview and whitespace-flexible matchingcopy_file - Copy a file to a new locationdelete_file - Delete a filelist_directory - Browse directories with pattern filteringtree - Compact indented tree view (85% fewer tokens than JSON)directory_tree - Get recursive tree view as JSON (deprecated, use tree)search_files - Recursively search for files matching glob patternsgrep_text_files - Regex search in file contents with encoding supportdetect_encoding - Auto-detect file encoding with confidence scoreconvert_encoding - Convert file between encodingsdetect_line_endings - Detect line ending style (CRLF/LF/mixed)change_line_endings - Convert line endings to LF or CRLFmanage_bom - Detect, strip, or add Unicode BOMlist_encodings - Show all supported encodingsget_file_info - Get file/directory metadatacreate_directory - Create directories recursively (mkdir -p)move_file - Move or rename files and directorieslist_allowed_directories - Show accessible directoriesSupported encodings (22 total):
See TOOLS.md for detailed parameters and examples.
Security: All operations restricted to allowed directories only.
This server is listed in the Official MCP Registry for discovery.
Note: Run these commands in PowerShell, not in CMD.
# Download
mkdir -Force "$env:LOCALAPPDATA\Programs\mcp-file-tools"
iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" -OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
# Install with Claude Code + VSCode (allows access to D:\Projects)
claude mcp add --scope user file-tools -- "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe" "D:\Projects"
# Download
mkdir -p ~/.local/bin
curl -L "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_linux_amd64" -o ~/.local/bin/mcp-file-tools
chmod +x ~/.local/bin/mcp-file-tools
# Install with Claude Code + VSCode (allows access to ~/Projects)
claude mcp add --scope user file-tools -- ~/.local/bin/mcp-file-tools ~/Projects
# Download
mkdir -p ~/.local/bin
curl -L "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_darwin_arm64" -o ~/.local/bin/mcp-file-tools
chmod +x ~/.local/bin/mcp-file-tools
# Install with Claude Code + VSCode (allows access to ~/Projects)
claude mcp add --scope user file-tools -- ~/.local/bin/mcp-file-tools ~/Projects
# Install with Go (requires Go 1.23+)
go install github.com/dimitar-grigorov/mcp-file-tools/cmd/mcp-file-tools@latest
# Add to Claude Code + VSCode (Linux/macOS)
claude mcp add --scope user file-tools -- $(go env GOPATH)/bin/mcp-file-tools ~/Projects
# Add to Claude Code + VSCode (Windows PowerShell)
claude mcp add --scope user file-tools -- "$(go env GOPATH)\bin\mcp-file-tools.exe" "D:\Projects"
For Claude Desktop, VSCode, or Cursor, use the downloaded binary path in your config:
Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json on Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
Windows:
{
"mcpServers": {
"file-tools": {
"command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
"args": ["D:\\Projects", "C:\\Users\\YOUR_NAME\\Documents"]
}
}
}
macOS / Linux:
{
"mcpServers": {
"file-tools": {
"command": "/Users/YOUR_NAME/.local/bin/mcp-file-tools",
"args": ["/Users/YOUR_NAME/Projects", "/Users/YOUR_NAME/Documents"]
}
}
}
The args array specifies allowed directories the server can access. Add as many directories as you need.
VSCode / Cursor (Claude Code extension)
If you already ran claude mcp add --scope user from the installation steps above, the server is already available in VSCode — no extra config needed.
To configure separately for VSCode only:
claude mcp add --scope user file-tools -- "%LOCALAPPDATA%\Programs\mcp-file-tools\mcp-file-tools.exe" "D:\Projects"
Alternatively, create a per-project config by adding .mcp.json to your project root:
{
"mcpServers": {
"file-tools": {
"type": "stdio",
"command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
"args": ["D:\\Projects", "D:\\Other\\Directory"]
}
}
}
Note: The type: "stdio" field is required. The args array specifies allowed directories — the VSCode extension does not automatically add the workspace directory, so you must list all directories you want to access. To add more directories later, re-run the claude mcp add command with all directories listed (it overwrites the previous config).
OpenAI Codex CLI
Codex does not have an mcp add command -- you need to edit ~/.codex/config.toml manually.
Windows (PowerShell):
# Download
mkdir -Force "$env:LOCALAPPDATA\Programs\mcp-file-tools"
iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" -OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
Then add to ~/.codex/config.toml:
[mcp_servers.file-tools]
command = "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe"
args = ["D:\\Projects"]
To skip permission prompts for all file-tools commands, create .claude/settings.local.json in your project root:
{
"permissions": {
"allow": [
"Bash(ls *)",
"Bash(grep *)",
"Bash(sort *)",
"Bash(wc *)",
"Bash(find *)",
"Bash(echo *)",
"Grep",
"Glob",
"WebSearch",
"mcp__file-tools__read_text_file",
"mcp__file-tools__read_multiple_files",
"mcp__file-tools__write_file",
"mcp__file-tools__edit_file",
"mcp__file-tools__copy_file",
"mcp__file-tools__list_directory",
"mcp__file-tools__tree",
"mcp__file-tools__directory_tree",
"mcp__file-tools__search_files",
"mcp__file-tools__grep_text_files",
"mcp__file-tools__detect_encoding",
"mcp__file-tools__convert_encoding",
"mcp__file-tools__detect_line_endings",
"mcp__file-tools__change_line_endings",
"mcp__file-tools__manage_bom",
"mcp__file-tools__list_encodings",
"mcp__file-tools__get_file_info",
"mcp__file-tools__create_directory",
"mcp__file-tools__list_allowed_directories",
"mcp__file-tools__check_for_updates"
]
}
}
This auto-approves safe read-only and editing file-tools operations plus common shell commands and web search. Destructive operations (delete_file, move_file) and WebFetch are intentionally excluded — Claude will ask before using them. Adjust to your needs.
The server checks for updates automatically and notifies you through tool responses when a newer version is available. To update:
iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" `
-OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
To disable update checks, set the environment variable MCP_NO_UPDATE_CHECK=1.
# Check if the server is configured
claude mcp list
# Remove the server
claude mcp remove file-tools
Once installed, just ask Claude:
Security: The server only accesses directories you explicitly allow:
args: ["/path/to/project"]The server can be configured via environment variables:
| Variable | Description | Default |
|---|---|---|
MCP_DEFAULT_ENCODING | Default encoding for write_file when none specified | cp1251 |
MCP_MEMORY_THRESHOLD | Memory threshold in bytes. Files smaller are loaded into memory for faster I/O; larger files use streaming. Also affects encoding detection mode. | 67108864 (64MB) |
To override, set environment variables in your config (Claude Desktop example):
{
"mcpServers": {
"file-tools": {
"command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
"args": ["D:\\Projects"],
"env": {
"MCP_DEFAULT_ENCODING": "utf-8"
}
}
}
}
Many legacy projects use non-UTF-8 encodings that AI assistants can't handle natively:
How it works:
User: Read config.ini and change the title to "Настройки"
Assistant: [read_text_file with cp1251] → [modify UTF-8] → [write_file with cp1251]
The original encoding is preserved - files remain compatible with legacy tools.
Prerequisites: Go 1.23+
# Run tests
go test ./...
# Build
go build -o mcp-file-tools ./cmd/mcp-file-tools
MCP Inspector provides a web UI for testing MCP servers.
Prerequisites: Node.js v18+
# Run with allowed directory (required)
npx @modelcontextprotocol/inspector go run ./cmd/mcp-file-tools -- /path/to/allowed/dir
# Or with built binary
npx @modelcontextprotocol/inspector ./mcp-file-tools.exe C:\Projects
Opens a browser where you can view tools, call them with custom arguments, and inspect responses.
Run the server with an allowed directory and send JSON-RPC commands via stdin:
# Specify allowed directory
go run ./cmd/mcp-file-tools /path/to/project
Example commands (paste into terminal):
{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_directory","arguments":{"path":"/path/to/project","pattern":"*.go"}}}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"read_text_file","arguments":{"path":"/path/to/project/main.pas","encoding":"cp1251"}}}
{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"detect_encoding","arguments":{"path":"/path/to/project/file.txt"}}}
GPL-3.0 - see LICENSE