Prototyp · Vorschau: alle Server aus der offiziellen Registry, alle 30 Minuten synchronisiert. Bewertungen und Benutzerkonten folgen in einem späteren Schritt.
PopNx MCPMCP-Server für alle, die KI nutzen · in einfachen Worten erklärt

Airlock

von adamoradVersion 2.0.0i★ –iLäuft auf deinem Computer
Name in der Registryio.github.adamorad/airlock

Installieren

Überblick

Beschreibung vom Entwickler (englisches Original)

Local daemon giving AI agents named locks, shared state, events, and a task queue over MCP.

Die drei Säulen von PopNx MCP

Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.

Was du damit machen kannst

Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.

  • Verbindung: Läuft auf deinem Computer
  • Transport: Streamable HTTP
  • Kategorie: Dokumente, Tabellen & Büroarbeit

Installation

Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.

Bevor du installierst

  • Basischecks: 1 von 1 bestanden
  • Läuft auf deinem Computer mit den Rechten deines Benutzerkontos (Dateien, Netzwerk, Apps).
  • Die Registry nennt keinen Schlüssel zum Eintragen.

Du brauchst

Welche App nutzt du?

Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.

Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein

{
  "mcpServers": {
    "airlock": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/adamorad/airlock:2.0.0"
      ]
    }
  }
}

Führe das in deinem Terminal aus

claude mcp add airlock -- docker run -i --rm ghcr.io/adamorad/airlock:2.0.0

In Cursor öffnen

Oder kopier die Einstellungen selbst

In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen

{
  "mcpServers": {
    "airlock": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/adamorad/airlock:2.0.0"
      ]
    }
  }
}

Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.

In VS Code öffnen

Oder kopier die Einstellungen selbst

In .vscode/mcp.json in deinem Projekt einfügen

{
  "servers": {
    "airlock": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/adamorad/airlock:2.0.0"
      ]
    }
  }
}

Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.

Dieser Server läuft auf deinem Computer, und ChatGPT kann sich nur mit Servern im Internet verbinden. Wähle eine andere App.

Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.

Diese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.

Was er kann

Läuft auf deinem Computer; die Tool-Liste erscheint nach der Installation in deiner KI-App.

Basischecksi

Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 7. Nov. 2026

  • ✓ Bestanden

    Entwickler passt zum Repo

    Der Registry-Name wurde mit dem GitHub-Konto adamorad bestätigt, dem das Repo gehört

  • … Noch nicht geprüft

    Wird noch gepflegt

    Dieses Repo haben wir noch nicht von GitHub gelesen

  • … Noch nicht geprüft

    Hat eine Lizenz

    Dieses Repo haben wir noch nicht von GitHub gelesen

  • – Nicht zutreffend

    Endpunkt antwortet

    Dieser Server läuft auf deinem Computer; es gibt keinen Endpunkt im Internet

  • – Nicht zutreffend

    Anmeldung mit OAuth

    Läuft auf deinem Computer und nutzt stattdessen lokale Einstellungen

  • … Noch nicht geprüft

    Keine versteckten Anweisungen in Tool-Beschreibungen

    Läuft auf deinem Computer; Tool-Listen können wir nur von Endpunkten im Internet lesen

Im Vergleich mit anderen in Dokumente, Tabellen & Büroarbeiti

  • Mehr Sterne als 0 % der anderen 2193 Server in dieser Kategorie
  • Neuer in der Registry veröffentlicht als 14 % der anderen 2193 Server in dieser Kategorie
  • Basischecks gleich gut wie oder besser als bei 100 % der anderen 2193 Server in dieser Kategorie

Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.

Häufige Fragen

Ist Airlock sicher?

Er hat 1 von 1 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.

Welche Schlüssel oder Codes braucht er?

Die Registry nennt keinen erforderlichen Schlüssel, manche Server bitten dich aber bei der ersten Nutzung, dich anzumelden.

Läuft er auf meinem Computer oder in der Cloud?

Er läuft auf deinem Computer. Deine KI-App startet ihn bei Bedarf, und die Daten laufen nicht über die Server des Entwicklers (außer der Server ruft selbst einen Onlinedienst auf).

Wird er noch gepflegt?

Das GitHub-Repo wurde zuletzt – geändert, und die neueste Version (2.0.0) kam vor 5 Monaten in die Registry.

Welche Apps können ihn nutzen?

Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Außerdem brauchst du Docker auf deinem Computer.

Was kann ich stattdessen nutzen?

In derselben Kategorie: Agent-Native Calendar, Excel MCP Server, MCP Server for Excel

Alternativen

Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.

So liest du eine Karte:★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti

Agent-Native Google Calendar - manage events, sync, and public booking

Läuft in der Cloud★ 7.620MITAktualisiert vor 2 Monaten
Installieren

Excel MCP Server

von haris-musa

Create and edit Excel files with AI: charts, PivotTables, formulas. No Excel needed.

Läuft auf deinem Computer★ 4.276MITAktualisiert vor 6 Tagen
Installieren

Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.

Läuft auf deinem Computer★ 847MITAktualisiert vor 4 Tagen
Installieren

README vom Entwickler

README öffnen

Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.

Airlock

Run five agents on one repo without them stomping on each other.

Named resource locks, atomic shared state, presence, events, and a task queue for AI agents — exposed over a local HTTP MCP server that's always running, so any session, terminal, or CI job can coordinate with any other. Cross-platform Go daemon, SQLite-backed, with real blocking waits — no more poll loops.

*Two agents reach for the same npm-install lock — one wins, the other blocks on a server-side wait and acquires the instant the first releases.*

Agent A                          Agent B

────── ────── lock_resource("npm-install") lock_resource("npm-install", wait_seconds=50) → { locked: true, lock_token } (parked — the daemon holds the connection open) npm install ... unlock_resource(lock_token) → { locked: true, lock_token } ← wakes instantly npm install ...

The problem

Open two Claude Code sessions on the same repo — one adding auth, one adding notifications. Both reach for npm install at the same time. Both pick 003_ as the next migration filename. Neither knows the other exists.

There's no shared state. No handoff. No way for one agent to know what another is doing. Coordination lives in fragile prompt instructions ("please wait until migrations finish") that nothing enforces.

How it works

Airlock is a single Go daemon that runs as a background service — always on, surviving IDE and terminal restarts. It listens on 127.0.0.1:27183 and speaks MCP over HTTP. Any agent that has it configured can:

  • acquire locks — and *block* on a contended one (wait_seconds, up to 50s), so the daemon parks the caller and wakes it the instant the lock frees. No agent-authored retry loops.
  • share atomic state — increment_counter for collision-free unique numbers, set_note_if for compare-and-swap. Read-modify-write is race-free, not best-effort.
  • announce presence — register_agent heartbeats; when an agent dies, its locks release and its waiters wake immediately.
  • signal events — generation-counted signal_event / wait_for_event for handoffs without polling.
  • queue work — a small task queue with presence-bound leases that auto-requeue on crash.

State lives in SQLite (WAL mode) at ~/.airlock/state.db — transactional, crash-safe, with concurrent readers and a single writer. The store is pure-Go (modernc.org/sqlite, no cgo), which is what makes the Linux build a trivial cross-compile. One binary, no language runtime, no external database.

Install

(a) go install
go install github.com/adamorad/airlock/v2@latest   # builds the `airlock` binary

airlock install-service # launchd (macOS) / systemd user unit (Linux)

(b) Homebrew
brew install adamorad/tap/airlock

airlock install-service

(c) Build from source
git clone https://github.com/adamorad/airlock.git

cd airlock go build -o airlock . sudo install airlock /usr/local/bin/airlock # or anywhere on your PATH airlock install-service

install-service registers an always-on background service (and unloads the old v1 LaunchAgent if present, so the v2 daemon takes port 27183 cleanly).

Verify
airlock status

Airlock — 127.0.0.1:27183

#

LOCKS (0)

(none)

...

Configure your agent

Claude Code — one command:

claude mcp add --transport http airlock http://localhost:27183

Cursor / Windsurf / any MCP client — add this to your MCP config:

{

"mcpServers": { "airlock": { "type": "http", "url": "http://127.0.0.1:27183" } } }

On Linux (and any multi-user host) a bearer token is required — loopback is shared across all users there, so it isn't an authorization boundary on its own. The daemon writes a 0600 token to ~/.airlock/token on first run; send it as an Authorization: Bearer header:

{

"mcpServers": { "airlock": { "type": "http", "url": "http://127.0.0.1:27183", "headers": { "Authorization": "Bearer " } } } }

On macOS the daemon is loopback-only by default and the token is optional. AIRLOCK_TOKEN overrides the file on any OS.

Tools

Airlock exposes 22 tools over MCP. Every tool result is a JSON object (the list_* tools return a JSON array). TTLs are in ttl_seconds; ttl_minutes is accepted as a deprecated alias.

Locks
ToolArgsReturns
lock_resourcename, agent_id, ttl_seconds?=900, wait_seconds?=0 (cap 50), wake_token?{locked:true, lock_token, expires_in_seconds} — or, if contended, {locked:false, held_by, expires_in_seconds} plus {wake_token, queue_position, retry_with} when you were queued
unlock_resourcename, lock_token (preferred) or agent_id{released: bool}
renew_lockname, lock_token (preferred) or agent_id, ttl_seconds?=900{renewed:true, expires_in_seconds} or {renewed:false, error}
list_locks—[{name, agent_id, expires_in_seconds}]
lock_resourcesnames:[string], agent_id, ttl_seconds?=900all-or-nothing: {locked:true, tokens:{name:token}} or {locked:false, held_by}

wait_seconds is the coordination-by-default knob: pass it (up to 50) and lock_resource blocks server-side until the lock frees, instead of returning locked:false immediately. The cap stays under Claude Code's 60s default per-tool-call timeout. The returned `lock_token` is a capability — unlock_resource/renew_lock require it (the agent_id path is kept for v1 compatibility). lock_resources acquires in a documented lock-ordering (lexicographic by name) so two callers can't deadlock.

Notes & State
ToolArgsReturns
set_notekey, value, author?, ttl_seconds?{saved:true}
get_notekey{key, value, author?, expires_in_seconds?} or {found:false}
list_notes—[{key, value, author?, expires_in_seconds?}]
delete_note *(v2)*key{deleted: bool}
set_note_if *(v2)*key, expected_value, new_value, author?, ttl_seconds?{swapped: bool} (true only if the stored value equaled expected_value; an absent/expired note counts as "")
increment_counter *(v2)*name, by?=1{value} (post-increment; collision-free under concurrency)
Presence
ToolArgsReturns
register_agent *(v2)*agent_id, ttl_seconds?=60{registered:true, expires_in_seconds} — re-call to stay alive; when it lapses the agent's locks auto-release
unregister_agent *(v2)*agent_id{unregistered:true} — also releases held locks
list_agents *(v2)*—[{agent_id, expires_in_seconds}]
Events
ToolArgsReturns
signal_event *(v2)*name{generation} (the new, bumped generation; wakes all waiters)
wait_for_event *(v2)*name, last_seen_generation?=0, wait_seconds?=25 (cap 50){generation, fired} — blocks until the generation advances past last_seen_generation, or the window expires (fired:false)
clear_event *(v2)*name{cleared:true}

Events are generation-counted, not latched: pass back the generation you last saw and a signal that fired between calls is never missed.

Tasks
ToolArgsReturns
push_task *(v2)*queue, payload, author?, priority?=0{id} (higher priority / older claimed first)
claim_next_task *(v2)*queue, agent_id, lease_seconds?=120{claimed:true, id, payload, lease_token} or {claimed:false}
complete_task *(v2)*id, lease_token{completed: bool}
fail_task *(v2)*id, lease_token, requeue?=true{failed: bool} (requeue=true returns it to pending; false gives up)
list_tasks *(v2)*queue[{id, queue, payload, priority, state, author?, lease_agent?, lease_expires_in_seconds?}]

A claim is a lease: if the claimant doesn't complete_task/fail_task within lease_seconds, the task auto-requeues for another consumer — no work is lost to a crashed worker. The lease_token from claim_next_task is the capability complete_task/fail_task require.

Naming conventions

Use consistent names so agents understand each other:

  • Files: file:/abs/path/to/package.json
  • Processes: npm-install, db-migrations, tests:unit
  • Agent identity: agent:claude-session-abc

Recipes

(a) Serialize edits to one file with a blocking lock

Two subagents both need to edit package.json. They serialize on a single lock — the second one *blocks* (no retry loop) and wakes the instant the first releases.

# Subagent A — block up to 50s to acquire, edit, release.

A=$(curl -s -X POST localhost:27183 -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"lock_resource","arguments":{"name":"file:/repo/package.json","agent_id":"sub-A","wait_seconds":50}}}' \ | jq -r '.result.content[0].text | fromjson | .lock_token')

...edit the file...

curl -s -X POST localhost:27183 -H 'Content-Type: application/json' \ -d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"unlock_resource\",\"arguments\":{\"name\":\"file:/repo/package.json\",\"lock_token\":\"$A\"}}}" \ | jq -c '.result.content[0].text | fromjson' # → {"released":true}

Subagent B — the same call with wait_seconds=50 parks until A releases, then

returns {locked:true, lock_token} the moment the lock frees. No polling.

(b) Unique migration filenames — race-free

The classic v1 hazard: two agents get_note the counter at the same instant, both read 003, both write 004. In v2 there is no read-modify-write to lose — increment_counter is atomic, so 100 concurrent callers get 100 distinct numbers.

curl -s -X POST localhost:27183 -H 'Content-Type: application/json' \

-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"increment_counter","arguments":{"name":"migration-seq"}}}' \ | jq -c '.result.content[0].text | fromjson' # → {"value":4}

Use the returned value: create 0004_*.sql. The next caller gets 5, never a collision.

(c) Producer/consumer handoff via the task queue

A planner agent pushes work; one or more worker agents claim it. A lease means a crashed worker's task auto-requeues instead of vanishing.

# Producer — enqueue a unit of work.

curl -s -X POST localhost:27183 -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"push_task","arguments":{"queue":"build","payload":"compile module X","author":"planner"}}}' \ | jq -c '.result.content[0].text | fromjson' # → {"id":1}

Consumer — claim the next task, do the work, complete it with the lease token.

CLAIM=$(curl -s -X POST localhost:27183 -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"claim_next_task","arguments":{"queue":"build","agent_id":"worker-1"}}}' \ | jq -c '.result.content[0].text | fromjson') # → {"claimed":true,"id":1,"payload":"compile module X","lease_token":"..."} ID=$(echo "$CLAIM" | jq -r .id); TOK=$(echo "$CLAIM" | jq -r .lease_token)

...do the work...

curl -s -X POST localhost:27183 -H 'Content-Type: applicatio

Nur der Anfang wird gezeigt; den Rest findest du im Repo

PopNx fragen