Minimal MCP server for scanner capture (ADF/duplex/page-size), batching, and multipage assembly
Most file and storage access work still happens through a UI a human drives. Scan MCP server moves it into the conversation instead. Minimal MCP server for scanner capture (ADF/duplex/page-size), batching, and multipage assembly.
scan-mcp on npm is all you need. Most clients run it directly, so configuration is a few lines and a restart.
The server publishes 10 tools. What each one is for:
list_devices — Discover connected scanners with backend detailsInputs — noneget_device_options — Get SANE options for a specific devicestart_scan_job — Begin a scanning job; omitting device_id triggers auto-selection and default optionsget_job_status — Inspect job state and artifact countscancel_job — Request job cancellation; best effort during scan loopslist_jobs — List recent jobs from the inbox directoryget_manifest — Fetch a job's manifest.jsonget_events — Retrieve a job's events.jsonl logTools — See JSON Schemas in schemas/ for input shapes. Tests assert against these contractsConfiguration is passed through the environment: INBOX_DIR, MCP_HTTP_HOST. Treat anything key-shaped as a real credential — scope it to the minimum the server needs, and rotate it if it ever lands in a shared config.
Plenty of file and storage access servers cover similar ground. The differences that matter in practice are scope of access and how much setup stands between you and a working tool call. Scan's toolset — list_devices, Inputs, get_device_options and 7 more — is a fair guide to whether it matches your workflow.
SyncDev reviews every entry in this directory against the project's own documentation before publishing, and revisits them as servers change.
| Tool | What it does |
|---|---|
| list_devices | Discover connected scanners with backend details. |
| Inputs | none. |
| get_device_options | Get SANE options for a specific device. |
| start_scan_job | Begin a scanning job; omitting device_id triggers auto-selection and default options. |
| get_job_status | Inspect job state and artifact counts. |
| cancel_job | Request job cancellation; best effort during scan loops. |
| list_jobs | List recent jobs from the inbox directory. |
| get_manifest | Fetch a job's manifest.json. |
| get_events | Retrieve a job's events.jsonl log. |
| Tools | See JSON Schemas in schemas/ for input shapes. Tests assert against these contracts. |
{
"mcpServers": {
"scan": {
"command": "npx",
"args": [
"-y",
"scan-mcp"
],
"env": {
"INBOX_DIR": "~/Documents/scanned_documents/inbox"
}
}
}
}Configuration as documented by the project. Restart the client after saving.
| Variable | Description | Required |
|---|---|---|
| INBOX_DIR | Filesystem location the server is allowed to use. | Optional |
| MCP_HTTP_HOST | Endpoint or connection string the server talks to. | Optional |
Scoped local file access — read, write, search and reorganise files in directories you explicitly allow.
Search and read your Drive — Docs, Sheets and files become context your assistant can actually use.
Query, modify and analyse local SQLite databases in conversation — the fastest way to chat with a data file.
Build a programmable telecommunications stack for connecting telephony services with the Internet via a cloud-based utility.
Chat with your second brain — search, read and write vault notes through the Local REST API.
Connects AI models to an Obsidian knowledge base for direct access and manipulation of notes and folders.