Lets an AI coding agent read .abe (CP-ABE-encrypted) documents on a
human's behalf, decrypting only the sections both the human's and
the calling agent product's attributes together satisfy. The agent never
sees raw ciphertext or performs decryption itself - direct access to an
.abe file is blocked and transparently relayed to a dedicated MCP server
instead, which does the actual decryption and re-verifies identity on
every call.
For the original use case (UC1) and the reasoning behind the architecture,
see docs/README.md. For the full build history -
every design decision, bug found, and its fix - see
docs/phase2-engineering-notes.md.
| Path | What it is |
|---|---|
server/ |
The MCP server itself: CP-ABE via OpenABE, Keycloak auth (MFA-capable browser login only), PostgreSQL agent/key registry, audit log. |
connector/ |
pabel-connector - the agent-agnostic core (Strategy pattern) plus adapters for every supported AI coding agent, Claude Code included - verified working end-to-end, no agent gets a separate or privileged install path. |
documents/ |
Test.abe, a demo encrypted fixture used throughout testing. |
docs/ |
The original use-case writeup and the full engineering log. |
cd server
cp .env.example .env # fill in real random values - see the comments in the file
python generate_realm.py
nerdctl compose up -d # Keycloak + PostgreSQL
python setup_user_profile.py
python -c "import db; db.init_schema()"
python -c "import abe; abe.setup_authority()"
python agents_admin.py add claude-code "Claude Code" agent_claude_code agent_claude_code_user
python agents_admin.py create-installation claude-code --label "alice's laptop"
nerdctl compose up -d mcp-server # one single, shared server for every agentRepeat the add/create-installation pair once per agent product
you want to support (cursor, vscode, ...) and once per employee
installing it, respectively - the server itself (compose up) is started
only once regardless of how many agents/employees end up using it.
create-installation prints a client_id/client_secret pair once, for
that one employee - hand it to them out of band, for use in step 2. Full
detail, including what each step actually does and why:
server/README.md.
One command, the same for any supported agent:
pip install -e connector
pabel-connector install <agent> --dir . --client-id CLIENT_ID --client-secret CLIENT_SECRET
Run pabel-connector list to see every valid <agent> value and its
verification status. --client-id/--client-secret are the credential
create-installation printed in step 1 for this specific employee - proof
of which installation this is, verified by the server on every call,
never just trusted because of which URL it reached.
Read the verification status before trusting anything in production -
coverage varies by agent: some adapters are confirmed against a real, live
install, others are still built strictly to that vendor's own
documentation and not yet tried live. Full detail:
connector/README.md and
connector/docs/coverage-matrix.md.
The command also prints whatever else that particular agent needs - some write a hook/config file directly and need nothing further, others point you at one more one-time step specific to that agent's own UI (e.g. installing a native plugin). Follow whatever it prints; that agent's own part of the repo has the full detail if you need it.
pabel-connector login
Opens the system browser at Keycloak's own login page (MFA included,
whatever the realm requires) - this is the human identity check every
decryption ultimately depends on, separate from the installation
credential enrolled in step 2 (both are required together - see
server/core.py's resolve_agent()).