- ✓Actively maintained (<30d)
- ✓Topics declared
- ✓Documented (README)
- !Licence file present but not machine-readable
- !No description
claude mcp add transkribus -- npx -y @lazyants/transkribus-mcp-server{
"mcpServers": {
"transkribus": {
"command": "npx",
"args": ["-y", "@lazyants/transkribus-mcp-server"],
"env": {
"TRANSKRIBUS_PASSWORD": "<transkribus_password>",
"TRANSKRIBUS_ACCESS_TOKEN": "<transkribus_access_token>"
}
}
}
}TRANSKRIBUS_PASSWORDTRANSKRIBUS_ACCESS_TOKENResumen de MCP Servers
# transkribus-mcp-server
[](https://github.com/lazyants/transkribus-mcp-server/actions/workflows/test.yml)
MCP server for the [Transkribus REST API](https://transkribus.eu/). Manage collections, documents, HTR/OCR recognition, models, and more through the Model Context Protocol.
**304 tools by default**, or **306 with Processing v2**, across 23 resource domains, with 9 entry points so you can pick the right server for your MCP client's tool limit.
> **API scope:** This server covers **two** Transkribus APIs:
>
> - the **legacy TrpServer REST API** (`https://transkribus.eu/TrpServer/rest`), session-based — 300 tools;
> - the **Processing API**, OIDC bearer auth via `account.readcoop.eu` — 4 `transkribus_processing_*` tools with the default Metagrapho v1 backend (`https://transkribus.eu/processing/v1`), or 6 with the optional Developer Platform v2 beta (`https://api-staging.transkribus.org/v2`).
>
> v2 requires explicit selection. Its [published OpenAPI](https://api-staging.transkribus.org/v2/openapi.json) names a staging server; production v2 availability has not been confirmed. Both backends take `config.textRecognition.htrId`.
## Installation
```bash
npm install -g @lazyants/transkribus-mcp-server
```
Or run directly:
```bash
npx @lazyants/transkribus-mcp-server
```
## Configuration
Transkribus uses session-based authentication. Credentials are resolved in this
order, per value:
1. **OS keyring** (recommended — nothing is written to a config file in clear text)
2. **Environment variable** (`TRANSKRIBUS_USER` + `TRANSKRIBUS_PASSWORD`, or `TRANSKRIBUS_SESSION_ID`)
Either a user name and password (the server logs in and manages the session) or
a session id you already hold. A session id takes precedence when both are
available; it expires, so a user name and password is the better choice for a
long-running setup — and is what lets the server re-authenticate after a 401.
The keyring is never required: if it is unavailable — a headless Linux box with
no Secret Service, an unsupported platform, an install with `--omit=optional` —
or if it does not answer within 5 seconds, the server falls back to the
environment.
### Store the credentials in the OS keyring
Three entries under one service name, `transkribus-mcp` by default:
`user`, `password` and `session-id` (store only what you use).
> [!IMPORTANT]
> The commands below read the value from an interactive prompt rather than
> taking it as an argument, so it never lands in your shell history, in a
> command line, or in the launch environment of another process. Avoid pasting a
> password directly onto the command line.
#### macOS
Omitting the value after `-w` makes `security` prompt for it:
```bash
security add-generic-password -s "transkribus-mcp" -a "user" -w
security add-generic-password -s "transkribus-mcp" -a "password" -w
```
> [!NOTE]
> A login-keychain item belongs to the program that created it. The first time
> the server reads an item created by `security`, macOS shows a "…wants to use
> your confidential information stored in transkribus-mcp" dialog — choose
> **Always Allow** and it will not ask again. Until that is granted the read
> cannot complete: the server waits 5 seconds, then falls back to the
> environment variables, so a server started where nobody can answer the dialog
> behaves as if the keyring were empty rather than hanging.
>
> To avoid the dialog entirely, write the entry from the same Node.js runtime
> that will read it. The value is piped in on standard input, so it appears
> neither in a command line nor in a process environment (`ps -E` shows those).
> The prompt below is plain POSIX, so it behaves the same in `zsh` and `bash`:
>
> ```bash
> npm install -g @lazyants/transkribus-mcp-server # the keyring module ships with it
> cd "$(npm root -g)/@lazyants/transkribus-mcp-server"
> printf 'Transkribus password: ' >&2; stty -echo; IFS= read -r TK_SECRET; stty echo; printf '\n' >&2
> printf '%s' "$TK_SECRET" | node -e '
> const { Entry } = require("@napi-rs/keyring");
> let value = "";
> process.stdin.setEncoding("utf8");
> process.stdin.on("data", (chunk) => { value += chunk; });
> process.stdin.on("end", () => {
> new Entry("transkribus-mcp", "password").setPassword(value);
> console.log("stored");
> });
> '
> unset TK_SECRET
> ```
>
> Repeat with `"user"` in place of `"password"`. A different Node.js
> installation later (a `nvm` switch, say) is a different program to the
> keychain, so the dialog can appear once more for it.
#### Windows (PowerShell)
`cmdkey` can only take the value as a command-line argument, which exposes it in
the process list. Read it from a hidden prompt instead and write it straight into
Windows Credential Manager via `CredWrite`. The credential's target name is
`<account>.<service>` — `user.transkribus-mcp` and `password.transkribus-mcp`
for the default service — which is exactly what the server reads back:
```powershell
Add-Type -Namespace TranskribusKeyring -Name Native -MemberDefinition @'
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CREDENTIAL {
public uint Flags;
public uint Type;
[MarshalAs(UnmanagedType.LPWStr)] public string TargetName;
[MarshalAs(UnmanagedType.LPWStr)] public string Comment;
public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
public uint CredentialBlobSize;
public IntPtr CredentialBlob;
public uint Persist;
public uint AttributeCount;
public IntPtr Attributes;
[MarshalAs(UnmanagedType.LPWStr)] public string TargetAlias;
[MarshalAs(UnmanagedType.LPWStr)] public string UserName;
}
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CredWriteW(ref CREDENTIAL credential, uint flags);
'@
function Set-TranskribusCredential {
param([Parameter(Mandatory)][string]$Account, [Parameter(Mandatory)][string]$Prompt)
$secure = Read-Host -AsSecureString $Prompt
$blob = [Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($secure)
try {
$cred = New-Object TranskribusKeyring.Native+CREDENTIAL
$cred.Type = 1 # CRED_TYPE_GENERIC
$cred.Persist = 2 # CRED_PERSIST_LOCAL_MACHINE
$cred.TargetName = "$Account.transkribus-mcp" # "<account>.<service>"
$cred.UserName = $Account
$cred.CredentialBlob = $blob
$cred.CredentialBlobSize = $secure.Length * 2 # UTF-16 bytes, no terminator
if (-not [TranskribusKeyring.Native]::CredWriteW([ref]$cred, 0)) {
throw "CredWrite failed (Win32 error $([Runtime.InteropServices.Marshal]::GetLastWin32Error()))"
}
Write-Host "Stored '$Account' in Windows Credential Manager."
} finally {
[Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($blob)
$secure.Dispose()
Remove-Variable secure, blob
}
}
Set-TranskribusCredential -Account 'user' -Prompt 'Transkribus user (e-mail)'
Set-TranskribusCredential -Account 'password' -Prompt 'Transkribus password'
```
> Using a custom `TRANSKRIBUS_KEYRING_SERVICE` (e.g. `acme`)? Set `TargetName` to
> `user.acme` / `password.acme` to match — the server looks each value up under
> `<account>.<service>`.
#### Linux
```bash
secret-tool store --label="Transkribus user" service transkribus-mcp username user
secret-tool store --label="Transkribus password" service transkribus-mcp username password
# (each prompts for the value)
```
Once stored, MCP config files need no credentials at all.
### Use environment variables instead
```bash
export TRANSKRIBUS_USER=your-email@example.com
export TRANSKRIBUS_PASSWORD=your-password
```
Or, with a session you already hold:
```bash
export TRANSKRIBUS_SESSION_ID=your-session-id
```
### Environment variables
| Variable | Default | Description |
| --- | --- | --- |
| `TRANSKRIBUS_USER` | — | Account e-mail; used when the keyring has no `user` entry for the configured service |
| `TRANSKRIBUS_PASSWORD` | — | Account password; used when the keyring has no `password` entry |
| `TRANSKRIBUS_SESSION_ID` | — | An existing session id; used when the keyring has no `session-id` entry |
| `TRANSKRIBUS_KEYRING_SERVICE` | `transkribus-mcp` | Keyring service name. Override to connect to several Transkribus accounts at once — run one server instance per account, each with its own service name |
### Processing API credentials
The `transkribus_processing_*` tools talk to a different service with a different
auth scheme, but they need **no extra configuration**: the same
`TRANSKRIBUS_USER` + `TRANSKRIBUS_PASSWORD` are exchanged for an OIDC bearer token
(READCOOP SSO password grant, client `processing-api-client`) and refreshed
automatically. `TRANSKRIBUS_SESSION_ID` does not apply to them.
Two optional overrides:
```bash
export TRANSKRIBUS_ACCESS_TOKEN=your-bearer-token # skip the token exchange entirely
export TRANSKRIBUS_PROCESSING_CLIENT_ID=custom-client # non-default OIDC client
```
### Optional Processing v2 beta
Set `TRANSKRIBUS_PROCESSING_BACKEND=v2` in the MCP server's environment before
starting it. The default is `v1`; invalid values fail configuration. v2 uses
the documented staging host `https://api-staging.transkribus.org/v2`, with the
same OIDC credentials and PAGE/ALTO XML operations as v1. This selection affects
the Processing tools in both the full server and `transkribus-mcp-processing`.
| Backend | Job identifiers | Terminal statuses | Result retention | Tools |
|---|---|---|---|---|
| `v1` (default) | Positive integers, including numeric strings | `FINISHED`, `FAILED` | Two days | Submit, status, PAGE XML, ALTO XML |
| `v2` (beta, staging) | Positive integers, numeric strings, UUIDs | `FINISHED`, `FAILED`, `CANCELLED` | 24 hours after completion | The same four tools, plus longpoll and Lo que la gente pregunta sobre transkribus-mcp-server
¿Qué es lazyants/transkribus-mcp-server?
+
lazyants/transkribus-mcp-server es mcp servers para el ecosistema de Claude AI con 2 estrellas en GitHub.
¿Cómo se instala transkribus-mcp-server?
+
Puedes instalar transkribus-mcp-server clonando el repositorio (https://github.com/lazyants/transkribus-mcp-server) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar lazyants/transkribus-mcp-server?
+
Nuestro agente de seguridad ha analizado lazyants/transkribus-mcp-server y le ha asignado un Trust Score de 70/100 (tier: OK). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene lazyants/transkribus-mcp-server?
+
lazyants/transkribus-mcp-server es mantenido por lazyants. La última actividad registrada en GitHub es del 2026-10-03, con 2 issues abiertos.
¿Hay alternativas a transkribus-mcp-server?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega transkribus-mcp-server en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/lazyants-transkribus-mcp-server)<a href="https://claudewave.com/repo/lazyants-transkribus-mcp-server"><img src="https://claudewave.com/api/badge/lazyants-transkribus-mcp-server" alt="Featured on ClaudeWave: lazyants/transkribus-mcp-server" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
The fastest path to AI-powered full stack observability, even for lean teams.