ConduitMcp.Session.EtsStore (ConduitMCP v0.9.5)

Copy Markdown View Source

Default in-memory session store backed by a public, named ETS table.

Sessions are keyed by session_id (a random URL-safe base64 string generated by ConduitMcp.Session.generate_id/0 on first initialize) and store an arbitrary metadata map plus "created_at" (millisecond Unix timestamp). The table is lazily created on first use via ensure_table/0 so the store works without explicit application start-up wiring.

Concurrency

The table is :public, :set, read_concurrency: true. Reads do not block writes; writers serialize per key. Suitable for production single-node workloads. For multi-node deployments, implement a ConduitMcp.Session.Store against your distributed backend — see guides/multi_node_sessions.md.

TTL & cleanup

This store does not evict sessions on its own. cleanup/1 is provided so a janitor can prune expired rows; without it, the table grows unbounded as initialize requests accumulate. Wire ConduitMcp.Session.Janitor into your supervision tree:

children = [
  {ConduitMcp.Session.Janitor,
   store: ConduitMcp.Session.EtsStore,
   ttl: :timer.minutes(30),
   interval: :timer.minutes(1)}
]

Configuration

Reference the store from a transport's :session option:

{ConduitMcp.Transport.StreamableHTTP,
 server_module: MyServer,
 session: [store: ConduitMcp.Session.EtsStore, ttl: :timer.minutes(60)]}

Summary

Functions

Removes sessions older than ttl_ms milliseconds.

Ensures the ETS table exists. Called automatically on first use.

Functions

cleanup(ttl_ms)

Removes sessions older than ttl_ms milliseconds.

ensure_table()

Ensures the ETS table exists. Called automatically on first use.