A typed knowledge graph for AI agents.

Read-only for humans. Write-only for agents. Spoken over the Model Context Protocol. Plexus runs on your hardware in a single docker compose stack — no cloud, no lock-in, Apache-2.0.

Apache-2.0Self-hostedMCP native
graph — live preview
0 nodes · 0 edges
01 / The inversion

Wikis were built for humans. Plexus flips that.

Traditional wikis rot the moment you stop grooming them — and your LLM asks you for a summary anyway. Plexus inverts the audience: the agent is the writer, you are the reader. Everything lands as typed entities with named, temporally valid edges.

Classic wiki

  • Humans write free-form prose with ad-hoc links.
  • Tags get forgotten, pages rot from day one.
  • The LLM asks you for a summary before it can help.
  • Every agent is an island; no session remembers the next.

Plexus

  • Agents write typed entities via MCP. Named relations, no prose.
  • Temporally valid edges; lint_graph, supersedes, provenance.
  • Every session opens with context_load.
  • One graph. Claude web, Claude Code, Gemini — all speak the same one.
01 — Agent

Reads a source

The agent fetches a paper, a Slack thread, a commit. Raw source, untouched.

web_fetch · file I/O · git log
02 — Agent

Writes typed

Extracts facts, concepts, decisions. Linked via named edges — not free-form prose.

search_entitiessave_entitylink_entities
03 — You

Read the graph

The dashboard shows the same entities your agent sees. No edit buttons. Nothing to groom.

dashboard · share links · lint_graph
15
MCP tools
14
entity kinds
17
typed relations
0
cloud dependencies
02 / Use cases

What you use plexus for.

Concrete scenarios plexus was built for — no generic claims.

01

Persistent agent memory

Every session opens with context_load. Your assistant remembers the ADRs you've made, the projects that are live, the tasks you shipped yesterday.

context_load
02

Cross-agent handoff

Claude Code writes a handoff fact after shipping. Next morning Claude web reads the same context. Zero re-briefing.

save_entity · session handoff
03

Team memory for small groups

One instance, scoped tokens per person, shared project containers. Read-only dashboard for humans, agents write for all.

multi-user · scoped tokens
04

Decision archaeology

Every ADR is a first-class decision entity with supersedes and derived_from edges. Time-travel queries a year later.

get_related · as_of
05

Incident → fix loop

An incident becomes a fact. The mitigation ADR triggered_by it. The runbook documents the ADR. One graph walk replaces twelve Slack threads.

link_entities · triggered_by
06

Research digest

The agent ingests a paper, creates a note for the source, extracts concept and fact entities. Every claim has provenance.

derived_from · mentions
07

Second brain

Capture with inbox_item, triage in a weekly review, archive with supersedes. Notes get structured without you touching a form.

inbox_item · weekly review

What you don't do.

No frontend build. No migration from Notion. You start a container, give your agent a bearer token, and the graph grows from there.

docker compose up -d
03 / Connect

Any MCP client works.

Bearer tokens for CLI agents, full OAuth 2.1 with PKCE for third-party clients. Three lines of config; your agent sees the graph.

Plexus speaks Model Context Protocol over POST /mcp. Personal tokens are scoped per permission × contexts × kinds × expires, so a writer agent doesn't get more access than it needs.

Admin tokens are rejected on /mcp with a hard 403. There is no "just use the admin token" escape hatch.

Claude Code (CLI)tested
Claude.ai (web, OAuth)tested
Claude Desktoptested
Le Chat, Gemini, custom SDKMCP compliant
~ / plexus-setup
# 1. clone + configure
$ git clone github.com/pcas-io/plexus && cd plexus
$ scripts/bootstrap_env.sh
  → generates four 32-byte secrets into .env

# 2. boot
$ docker compose up -d
 surrealdb ready
 plexus on http://localhost:8787

# 3. grab the admin token (one-shot)
$ grep '^PLEXUS_ADMIN_TOKEN=' .env
# Claude Code CLI
$ claude mcp add plexus \
    --transport http \
    --header "Authorization: Bearer pt_..." \
    https://plexus.internal/mcp

 15 tools loaded
     save_entity · link_entities · search_entities
     get_related · context_load · lint_graph

# Claude.ai (web) — OAuth, no token needed
Settings → Integrations → Add Custom
  https://plexus.internal/mcp
# Agent ingests an article, one turn:

> search_entities({ query: "feature flag rollout" })
 2 concepts · 1 decision · 1 fact

> save_entity({
    kind: "concept",
    title: "Shadow-flag pre-rollout",
    body: "# ..."
  })
 entities:ab12

> link_entities({
    from_id: "entities:ab12",
    to_id:   "entities:ef56",
    relation: "derived_from"
  })
 edge valid_from: 2026-04-17
04 / Architecture

Boring technology, on purpose.

Hono + Node 22 + SurrealDB. One compose file. No Kubernetes, no service mesh, no queues.

Agents — Claude web, Code, Desktop, Geminiclient
↓ MCP over HTTPS · Bearer or OAuth 2.1
plexus worker — Hono · TypeScript · Node 22app
↓ SurrealQL
SurrealDB v2 — RocksDB, persistent volumedb

What's underneath.

Two containers. One SurrealDB volume. A Caddy in front for TLS. That's the whole stack. Backups are portable JSON; migrating to another host is docker cp.

BM25 full-text, temporal edges, optimistic locking with expected_version, passkey-only for humans, 32-byte share tokens that burn on first click.

05 / Start

Two minutes to your first entity.

Clone, boot, open the dashboard at localhost:8787. The admin token lives in your .env; you need it exactly once — after enrollment, plexus rotates it out.