Runs on your machine from its package; the steps are below.
At most: moves money, runs code or commands, deletes data, or sends messages for you.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_windows_amd64.mcpb`) — download it and import the bundle in your MCP client.
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_windows_arm64.mcpb`) — download it and import the bundle in your MCP client.
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_linux_amd64.mcpb`) — download it and import the bundle in your MCP client.
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_linux_arm64.mcpb`) — download it and import the bundle in your MCP client.
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_darwin_amd64.mcpb`) — download it and import the bundle in your MCP client.
Distributed as an MCP bundle (`https://github.com/zoster81/scripthold/releases/download/v3.3.5/scripthold_darwin_arm64.mcpb`) — download it and import the bundle in your MCP client.
Code from the web. Work locally. Recover safely.
Scripthold is a Model Context Protocol (MCP) server that gives web, desktop, and CLI agents controlled access to explicitly authorized local workspaces. It safely handles legacy text encodings, deterministic file changes, source navigation, backups, and optional durable local execution over stdio or authenticated Streamable HTTP.
AI clients see Настройки — not ???? or Íàñòðîéêè.
Start here: Quick start · Find a tool · All documentation · Security policy.
The current public release is Scripthold 3.3.3 with 43 tools and 3 guided prompts.
Scripthold originated from the original mcp-file-tools project, created by Dimitar Grigorov, and retains its GPL-3.0 lineage. See Project Direction.
Choose a published binary or build from source, then configure your MCP client to grant access only to the directories you intend to share. HTTP and container deployments have additional setup below.
Download the asset for your platform from the latest release and verify it against checksums.txt. Releases also attach a signed Sigstore build-provenance bundle for the normal GoReleaser assets.
git clone https://github.com/zoster81/scripthold.git
cd scripthold
go test ./...
go build -o scripthold ./cmd/scripthold
The module path is github.com/zoster81/scripthold.
Pass each authorized directory as a startup argument:
{
"mcpServers": {
"scripthold": {
"type": "stdio",
"command": "C:\\Tools\\scripthold_windows_amd64.exe",
"args": ["D:\\Projects"]
}
}
}
Startup roots are authoritative. A roots-capable stdio client may supply dynamic roots only when the process starts without directory arguments.
Supported standalone installations can opt in to self-update. Stop other Scripthold processes using the same binary before running scripthold update --adopt. Adoption prepares local state without downloading or replacing the executable.
After adoption, run scripthold update to verify and dispatch an available release. Use scripthold update status to confirm completion; only run scripthold update recover when status offers recovery. These actions have different safety and verification requirements.
See the Verified Self-update Guide for supported installations, exact commands, failure handling, and recovery rules.
HTTP requires exactly one bearer-token source. A minimal loopback PowerShell launch is:
$tokenPath = Join-Path $env:TEMP "scripthold.token"
$bytes = New-Object byte[] 32
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
try { $rng.GetBytes($bytes) } finally { $rng.Dispose() }
[System.IO.File]::WriteAllText($tokenPath, [Convert]::ToBase64String($bytes), [System.Text.UTF8Encoding]::new($false))
$env:MCP_HTTP_TOKEN_FILE = $tokenPath
$env:MCP_HTTP_ADDR = "127.0.0.1:8765"
.\scripthold_windows_amd64.exe --transport=streamable-http D:\Projects
The MCP endpoint is http://127.0.0.1:8765/mcp; /healthz and /readyz expose liveness/readiness. Send the token as Authorization: Bearer <token> on every MCP request.
Do not expose HTTP beyond loopback without reading HTTP Security. Non-loopback use requires explicit opt-in and TLS or a trusted proxy boundary.
Sanitized PowerShell examples are available under examples/:
start-local-stdio.ps1start-local-http.ps1start-openai-tunnel-stdio-plus-local-http.ps1start-openai-tunnel-http-plus-local-stdio.ps1Copy an example outside the checkout before replacing placeholders. Never commit Runtime API keys, Tunnel IDs, bearer tokens, or private state paths.
docker build --build-arg VERSION=dev -t scripthold:dev .
docker run --rm -i \
--read-only \
--cap-drop=ALL \
--security-opt=no-new-privileges \
--tmpfs /tmp:rw,noexec,nosuid,size=64m \
--mount type=bind,source=/absolute/project,target=/data \
scripthold:dev --transport=stdio /data
The image runs as unprivileged UID/GID 10001.
TOOLS.md is the detailed public reference for schemas, parameters, examples, limits, and error behavior. The table below reflects the Scripthold 3.3.3 public catalog.
| Area | Main tools |
|---|---|
| Text/files | read_text_file, read_multiple_files, write_whole_file, edit_file, edit_file_apply, grep_text_files |
| Multi-file changes | patch_package, patch_package_apply, filesystem_package, filesystem_package_apply |
| Directory/state | list_directory, tree, search_files, get_file_info, fingerprint_paths, verify_state |
| Encoding | detect_encoding, convert_encoding, convert_encoding_apply, detect_line_endings, change_line_endings, manage_bom, manage_bom_apply, list_encodings |
| Backups | backup_store, backup_restore_apply, backup_gc_apply, backup_delete |
| Source Intelligence | source_symbols, source_query |
| Markdown intelligence | markdown_read, markdown_workspace, markdown_create, markdown_edit, markdown_apply |
| Durable work | task_run, task_list, task_get, task_logs, task_cancel, deferred_operation |
| Service | list_allowed_directories, check_for_updates |
Source Intelligence helps agents navigate source code without running it or requiring an external compiler, parser, or language server. Use source_symbols to find and inspect declarations; use source_query for structural search, supported project relationships, dependency graphs, and verified context.
Unsupported or ambiguous relationships are rejected rather than guessed. Markdown files have their own document tools. Check the generated Language Capabilities matrix for available source providers and analysis coverage.
Markdown files use dedicated tools rather than Source Intelligence providers. Read a document with markdown_read, or inspect links and relationships across files with the read-only markdown_workspace tool.
To change a document, prepare a preview with markdown_edit (or markdown_create for a new file), review the proposed content, and pass only its previewId to markdown_apply. Unsafe, conflicting, or stale changes are rejected instead of being silently rewritten.
For examples and the exact operation forms, see the Markdown tool reference. For Markdown semantics, supported encodings, and the Marksplice integration boundary, see Markdown Intelligence.
task_run execution is disabled by default. Shell and script execution require explicit authorization; HTTP requires an additional HTTP execution opt-in.Current architectural boundaries are summarized in Architecture.
Most installations need only a small subset of environment variables:
| Variable | Purpose | Default |
|---|---|---|
MCP_TRANSPORT | stdio or streamable-http | stdio |
MCP_DEFAULT_ENCODING | Encoding for new text files | utf-8 |
MCP_HTTP_ADDR | HTTP listen address | 127.0.0.1:8765 |
MCP_HTTP_TOKEN_FILE / MCP_HTTP_TOKEN | Mutually exclusive bearer-token sources | unset |
MCP_HTTP_ALLOW_NON_LOOPBACK | Permit non-loopback binding when other security requirements are met | disabled |
MCP_BACKUP_STORE_DIR | Enable the persistent backup store | unset |
MCP_BACKUP_DEFAULT_POLICY | Default persistent backup policy for eligible approval-bound mutations | disabled |
MCP_TASK_STORE_DIR | Enable durable task persistence | unset |
MCP_DEFERRED_STORE_DIR | Enable durable ownership for eligible long-running read-only calls | unset |
MCP_ENABLE_RUN_SCRIPT | Allow task_run kind=script | disabled |
MCP_ENABLE_SHELL | Allow task_run kind=shell | disabled |
MCP_ENABLE_EXECUTION | Allow both task kinds | disabled |
MCP_HTTP_ENABLE_EXECUTION | Additional HTTP execution gate | disabled |
Detailed limits and subsystem-specific options are documented where they are used: TOOLS.md, Durable Tasks, and HTTP Security.
Use the Documentation Guide to find instructions by task, whether you are configuring a client, choosing a tool, securing a deployment, or contributing to the project.
The required Go version is declared by go.mod.
go mod verify
go test ./...
golangci-lint run ./...
go build -o scripthold ./cmd/scripthold
See CONTRIBUTING.md before proposing changes.
GPL-3.0 — see LICENSE.