An MCP (Model Context Protocol) server for Syncthing — the open-source continuous file synchronisation tool.
Built to give AI assistants (Claude, etc.) read and control access to Syncthing's REST API, with a focus on replication awareness: understanding which folders are fully replicated across devices so you can confidently reclaim local disk space.
- Token-efficient output — compact JSON by default;
concise=falsefor full details - Multi-instance — manage multiple Syncthing nodes from a single server
- Replication analysis — safe-to-remove flags and reclaimable space calculation
- Syncthing v2.x compatible — tested against v2.0.x REST API
- HTTP transport — Streamable HTTP with bearer-token auth, Cloudflare Tunnel support
- SKILL.md — LLM skill guide for optimal tool usage
| Tool | Description | Mutating |
|---|---|---|
syncthing_list_instances |
List all configured instances, probe availability | No |
| Tool | Description | Mutating |
|---|---|---|
syncthing_system_status |
Device ID, name, uptime, version | No |
syncthing_list_folders |
All folders with types and device counts | No |
syncthing_list_devices |
All devices with connection status | No |
syncthing_connections |
Active connection details | No |
syncthing_device_stats |
Per-device statistics (last seen, duration) | No |
syncthing_system_errors |
Recent system errors and warnings | No |
syncthing_clear_errors |
Clear the system error log | Yes |
syncthing_system_log |
Recent log entries | No |
syncthing_recent_changes |
Recent file change events (local + remote) | No |
syncthing_health_summary |
Single-call health overview with alerts | No |
syncthing_check_upgrade |
Check for newer Syncthing version | No |
| Tool | Description | Mutating |
|---|---|---|
syncthing_folder_status |
Detailed folder metrics (expensive call) | No |
syncthing_folder_completion |
Per-device completion % for a folder | No |
syncthing_replication_report |
All folders: safe-to-remove + reclaimable space | No |
syncthing_folder_errors |
Current sync errors for a folder | No |
| Tool | Description | Mutating |
|---|---|---|
syncthing_device_completion |
Aggregated completion for a device | No |
| Tool | Description | Mutating |
|---|---|---|
syncthing_scan_folder |
Trigger an immediate rescan | Yes |
syncthing_pause_folder |
Pause a folder (prevents deletion propagation) | Yes |
syncthing_resume_folder |
Resume a paused folder | Yes |
| Tool | Description | Mutating |
|---|---|---|
syncthing_browse_folder |
Browse folder contents (directory listing from DB) | No |
syncthing_file_info |
Detailed info about a specific file | No |
syncthing_folder_need |
Out-of-sync files this folder needs (paginated) | No |
syncthing_remote_need |
Files a remote device needs from us (paginated) | No |
| Tool | Description | Mutating |
|---|---|---|
syncthing_override_folder |
Override remote changes (send-only folder) | Yes |
syncthing_revert_folder |
Revert local changes (receive-only folder) | Yes |
| Tool | Description | Mutating |
|---|---|---|
syncthing_pending_devices |
List pending device connection requests | No |
syncthing_pending_folders |
List pending folder share offers | No |
syncthing_accept_device |
Accept a pending device | Yes |
syncthing_reject_device |
Dismiss a pending device request | Yes |
syncthing_accept_folder |
Accept a pending folder offer | Yes |
syncthing_reject_folder |
Dismiss a pending folder offer | Yes |
| Tool | Description | Mutating |
|---|---|---|
syncthing_restart_required |
Check if config changes require a restart | No |
syncthing_restart |
Restart the Syncthing service | Yes |
syncthing_get_ignores |
Get .stignore patterns for a folder | No |
syncthing_set_ignores |
Set .stignore patterns for a folder | Yes |
syncthing_get_default_ignores |
Get default ignore patterns | No |
syncthing_set_default_ignores |
Set default ignore patterns | Yes |
All read tools default to concise=true, producing compact JSON with minimal fields and
short device IDs. Set concise=false for full details when debugging.
| Mode | Output style | Use case |
|---|---|---|
concise=true (default) |
Compact JSON, short IDs, essential fields | Normal operation |
concise=false |
Pretty JSON, full device IDs, all fields | Debugging, raw data |
Large responses are automatically truncated at 25,000 characters with guidance to use pagination or filters.
See SKILL.md for the complete LLM skill guide.
syncthing-mcp/
├── src/syncthing_mcp/
│ ├── __init__.py # Package version
│ ├── __main__.py # Entry point (stdio + HTTP transport)
│ ├── auth.py # Bearer token middleware
│ ├── client.py # SyncthingClient (HTTP methods + error handling)
│ ├── formatters.py # Token-efficient formatting layer
│ ├── models.py # Pydantic input models (ReadParams / WriteParams)
│ ├── registry.py # Multi-instance registry from env vars
│ ├── server.py # FastMCP server + lifespan
│ └── tools/
│ ├── system.py # System status, health, errors, log, restart, upgrade
│ ├── folders.py # Folder status, completion, replication, file queries
│ ├── devices.py # Device listing, completion, connections, stats
│ ├── config.py # Pending accept/reject, ignore patterns
│ └── instances.py # Instance listing, folder listing
├── tests/ # Tests with respx HTTP mocking
├── SKILL.md # LLM skill guide
├── pyproject.toml
├── Dockerfile
├── docker-compose.yml # Traefik reverse proxy (HTTPS/ACME)
└── docker-compose.tunnel.yml # Cloudflare Tunnel (zero-trust)
Connect to multiple Syncthing nodes simultaneously by setting the SYNCTHING_INSTANCES environment variable with a JSON object:
{
"mini": {"url": "http://mini.local:8384", "api_key": "abc123"},
"tn-sb": {"url": "http://tn-sb.local:8384", "api_key": "def456"},
"tn-mr2": {"url": "http://tn-mr2.local:8384", "api_key": "ghi789"}
}Every tool accepts an optional instance parameter to target a specific node. When only one instance is configured, the parameter can be omitted.
{
"mcpServers": {
"syncthing": {
"command": "uv",
"args": [
"--directory", "/path/to/syncthing-mcp",
"run", "python", "-m", "syncthing_mcp"
],
"env": {
"SYNCTHING_INSTANCES": "{\"mini\":{\"url\":\"http://mini.local:8384\",\"api_key\":\"abc123\"},\"tn-sb\":{\"url\":\"http://tn-sb.local:8384\",\"api_key\":\"def456\"}}"
}
}
}
}- Run
syncthing_replication_report— review which folders showsafe: true - Confirm the fully-replicated remote device(s) are the ones you expect
syncthing_pause_folder— stops Syncthing from propagating local changes- Delete the local data outside of Syncthing
- Optionally remove the folder from this device's config via the Syncthing web UI
Important: Always pause before deleting. In a
sendreceivefolder, deleting files without pausing will propagate the deletion to all connected devices.
The safe flag requires: at least one remote device at 100% completion with remoteState: valid, the folder in idle state, and the folder not paused. This is deliberately conservative.
- Python 3.11+
- uv (recommended) or pip
- A running Syncthing instance with API access
git clone https://github.com/piersdd/syncthing-mcp.git
cd syncthing-mcp
uv syncOpen the Syncthing web UI → Actions → Settings → API Key.
{
"mcpServers": {
"syncthing": {
"command": "uv",
"args": [
"--directory", "/path/to/syncthing-mcp",
"run", "python", "-m", "syncthing_mcp"
],
"env": {
"SYNCTHING_API_KEY": "your-api-key-here",
"SYNCTHING_URL": "http://localhost:8384"
}
}
}
}MCP_TRANSPORT=streamable-http MCP_AUTH_TOKEN=secret MCP_PORT=8000 syncthing-mcpcp .env.example .env # edit API keys and DOMAIN
docker compose up -dThis deploys behind Traefik with automatic Let's Encrypt TLS certificates.
The MCP endpoint is available at https://syncthing-mcp.<DOMAIN>/mcp.
cp .env.example .env # edit API keys and CLOUDFLARE_TUNNEL_TOKEN
docker compose -f docker-compose.tunnel.yml up -dCreate a tunnel at Cloudflare Zero Trust → Networks → Tunnels.
Point the tunnel's public hostname to http://syncthing-mcp:8000.
Bearer token auth (MCP_AUTH_TOKEN) secures the endpoint; /health is unauthenticated for probes.
{
"mcpServers": {
"syncthing": {
"type": "streamable-http",
"url": "https://syncthing-mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_AUTH_TOKEN"
}
}
}
}uv sync
uv run pytest -v| Variable | Required | Default | Description |
|---|---|---|---|
SYNCTHING_API_KEY |
Yes* | — | API key (single-instance mode) |
SYNCTHING_URL |
No | http://localhost:8384 |
Base URL (single-instance mode) |
SYNCTHING_INSTANCES |
No | — | JSON object for multi-instance mode |
MCP_TRANSPORT |
No | stdio |
Transport: stdio or streamable-http |
MCP_HOST |
No | 0.0.0.0 |
HTTP listen host |
MCP_PORT |
No | 8000 |
HTTP listen port |
MCP_AUTH_TOKEN |
No | — | Bearer token for HTTP transport |
DOMAIN |
No | — | FQDN for Traefik TLS (docker-compose.yml) |
CLOUDFLARE_TUNNEL_TOKEN |
No | — | Tunnel token (docker-compose.tunnel.yml) |
* Required unless SYNCTHING_INSTANCES is set.
syncthing_folder_statusandsyncthing_replication_reportcall Syncthing's/rest/db/statusendpoint, which is expensive (high CPU/RAM on the Syncthing side). Use judiciously on low-power hardware.- The replication report makes one
/rest/db/completioncall per remote device per folder. syncthing_health_summarycalls/rest/db/statusfor each folder — equivalent cost.- Syncthing v2.x uses SQLite (replacing LevelDB). First launch after v1→v2 migration can be lengthy.
MIT