JamJet
The JamJet server provides a comprehensive management interface for agent-native workflow runtimes, enabling you to run, monitor, and control durable AI agent workflows and multi-agent systems.
Run Workflows (
jamjet_run_workflow): Start a workflow execution with input data, workflow ID, and optional version parametersMonitor Executions (
jamjet_get_execution,jamjet_list_executions): Retrieve execution status/details and browse paginated execution history with filtering by status (running, paused, completed, failed)Get Event Logs (
jamjet_get_events): Retrieve the full event timeline/audit log for any execution, supporting observability and replayCancel Executions (
jamjet_cancel_execution): Terminate running workflow executionsHuman-in-the-Loop (
jamjet_approve): Approve or reject paused executions waiting for human intervention, with an optional commentList Agents (
jamjet_list_agents): Browse registered agents with filtering by skill, status, or protocolDiscover Remote Agents (
jamjet_discover_agent): Register new remote agents into the JamJet registry by URL, enabling dynamic agent discovery and routingMulti-tenancy: All operations support tenant isolation via
tenant_idparameters
Enables integrating Brave Search as an MCP tool within agent workflows to provide web search and information retrieval capabilities.
The agent-native runtime — durable, composable, built for production.
jamjet.dev · Quickstart · Docs · Examples · Blog · Discord
JamJet is a performance-first, agent-native runtime for AI agents. Not another prompt wrapper — a production-grade orchestration substrate. Rust + Tokio core for scheduling, state, and concurrency. Author in Python, Java, or YAML — all compile to the same IR graph and run on the same durable engine.
Quickstart
pip install jamjetfrom jamjet import task, tool
@tool
async def web_search(query: str) -> str:
return f"Search results for: {query}"
@task(model="claude-haiku-4-5-20251001", tools=[web_search])
async def research(question: str) -> str:
"""You are a research assistant. Search first, then summarize clearly."""
result = await research("What is JamJet?")No server. No config. No YAML. Just pip install and run. → Full quickstart
Why JamJet?
Problem | JamJet's answer |
Agent runs lose state on crash | Durable graph execution — event-sourced, crash-safe resume |
No way to pause for human approval | Human-in-the-loop as a first-class workflow primitive |
Agents siloed in their own framework | Native MCP + A2A — interoperate with any agent, any framework |
Slow Python orchestration at scale | Rust core — no GIL, real async parallelism, 88× faster IR compilation than LangGraph |
Hard-coded agent routing | Coordinator Node — dynamic routing with structured scoring + LLM tiebreaker |
Can't use agents as tools | Agent-as-Tool — sync, streaming, or conversational invocation modes |
No governance or guardrails | Policy engine — tool blocking, approvals, audit log, PII redaction, OAuth delegation |
Locked into one language | Polyglot SDKs — Python, Java (JDK 21), Go (planned) — same IR, same runtime |
Progressive Complexity
Three levels of abstraction — all compile to the same IR and run on the same engine.
@task — one function, zero boilerplate
@task(model="claude-haiku-4-5-20251001", tools=[web_search])
async def research(question: str) -> str:
"""You are a research assistant."""Agent — explicit configuration
agent = Agent("researcher", model="claude-haiku-4-5-20251001",
tools=[web_search], instructions="Search first, then summarize.")
result = await agent.run("What is JamJet?")Workflow — full graph control
workflow = Workflow("research")
@workflow.step
async def search(state: State) -> State:
result = await web_search(query=state.query)
return state.model_copy(update={"answer": result})YAML — declarative workflows
nodes:
think:
type: model
model: claude-haiku-4-5-20251001
prompt: "Answer clearly: {{ state.query }}"
output_key: answer
next: endKey Capabilities
Coordinator — dynamic agent routing. Discover agents by skill, score them, route to the best fit at runtime. Structured scoring with optional LLM tiebreaker, full scoring breakdown in event logs. Example →
Agent-as-Tool. Wrap any agent as a callable tool — sync (quick, stateless), streaming (long-running with budget limits), or conversational (multi-turn with turn limits). Example →
MCP — client + server. Connect to external MCP tool servers in workflows, or expose JamJet tools as an MCP server for Claude Desktop, Cursor, and other clients. Example →
A2A protocol — client + server. Delegate tasks to external agents or serve tasks from other frameworks via Agent-to-Agent protocol. Example →
Eval harness. Built-in LLM judge, assertions, cost scoring. Self-improvement loop with on_fail: retry_with_feedback. Example →
Human-in-the-loop. First-class approval primitive — pause execution, collect human input, resume. Example →
Memory — Engram
Engram is JamJet's durable memory layer — temporal knowledge graph, hybrid retrieval, fact extraction, conflict detection, and consolidation. Backed by SQLite (zero-infra) or PostgreSQL (production). Ships with a built-in message store for conversation history.
Provider-agnostic. One binary speaks to Ollama (local, free), any OpenAI-compatible endpoint (OpenAI, Azure, Groq, Together, DeepSeek, …), Anthropic Claude, Google Gemini, or a shell-out command — set ENGRAM_LLM_PROVIDER=… and go.
Package | Install from | Use case |
| Embed in Rust apps | |
| MCP + REST server | |
| Python client | |
| Java client | |
| Spring AI |
# Try with Claude Desktop — uses local Ollama by default
docker run --rm -i -v engram-data:/data ghcr.io/jamjet-labs/engram-server:0.5.011 MCP tools: memory_add, memory_recall, memory_context, memory_search, memory_forget, memory_stats, memory_consolidate, messages_save, messages_get, messages_list, messages_delete.
Full docs → runtime/engram-server/README.md · Comparison with Mem0, Zep, and others → java-ai-memory.dev
How JamJet Compares
As of April 2026. All frameworks evolve — check their docs for the latest.
Capability | JamJet | Google ADK | LangChain | AutoGen | CrewAI |
Durable execution | ✅ event-sourced, crash-safe | ❌ | ❌ | ❌ | ❌ |
Dynamic agent routing | ✅ Coordinator with scoring | ✅ | ❌ | ❌ | ❌ |
Agent-as-Tool | ✅ sync, streaming, conversational | ✅ sync only | ❌ | ❌ | ❌ |
MCP support | ✅ client + server | ✅ client + server | 🟡 client only | 🟡 client only | 🟡 client only |
A2A protocol | ✅ client + server | 🟡 client only | ❌ | ❌ | ❌ |
Human-in-the-loop | ✅ first-class primitive | 🟡 callbacks | 🟡 callbacks | 🟡 conversational | 🟡 manual |
Built-in eval | ✅ LLM judge, assertions, cost | ✅ 8 built-in criteria | ❌ | ❌ | ❌ |
Agent memory | ✅ Engram (SQLite/Postgres) | 🟡 Memory Bank | ❌ | ❌ | ❌ |
Policy & governance | ✅ policy engine, audit log | 🟡 plugin | ❌ | ❌ | ❌ |
Multi-tenant isolation | ✅ row-level partitioning | ❌ | ❌ | ❌ | ❌ |
Model independence | ✅ any provider | 🟡 Gemini-first | ✅ any | ✅ any | ✅ any |
Runtime language | Rust + Python/Java | Python/TS/Go/Java | Python | Python | Python |
Architecture
┌──────────────────────────────────────────────────────────┐
│ Authoring Layer │
│ Python SDK | Java SDK | Go SDK (planned) | YAML │
├──────────────────────────────────────────────────────────┤
│ Compilation / Validation │
│ Graph IR | Schema | Policy lint │
├────────────────────────────┬─────────────────────────────┤
│ Rust Runtime Core │ Protocol Layer │
│ Scheduler | State SM │ MCP Client | MCP Server │
│ Event log | Snapshots │ A2A Client | A2A Server │
│ Workers | Timers │ │
├────────────────────────────┴─────────────────────────────┤
│ Enterprise Services │
│ Policy | Audit | PII Redaction | OAuth | mTLS │
├──────────────────────────────────────────────────────────┤
│ Runtime Services │
│ Model Adapters | Tool Execution | Engram Memory │
├──────────────────────────────────────────────────────────┤
│ Storage │
│ Postgres (production) | SQLite (local) │
└──────────────────────────────────────────────────────────┘Examples
Example | Description |
| |
Insurance pipeline — 4 specialist agents, HITL, audit trails | |
Dynamic agent routing for support tickets | |
Custom scoring strategy for healthcare routing | |
Sync, streaming, and conversational agent invocation | |
Deliberative collective intelligence with 4 reasoning archetypes | |
Multi-agent wealth advisory for HNW clients | |
Batch evaluation with LLM judge scoring | |
Connect to external MCP servers | |
Expose JamJet tools as MCP server | |
Human-in-the-loop approval workflow | |
Google Gemini via Vertex AI | |
A2A agent delegation | |
Identity-aware routing with provenance | |
Complexity-based agent routing | |
ReAct reasoning + acting pattern | |
Multi-agent review pipeline | |
Plan-then-execute agent | |
RAG assistant |
Roadmap
Phase | Status | Goal |
0 — Architecture & RFCs | ✅ Complete | Design docs, RFCs, repo scaffolding |
1 — Minimal Viable Runtime | ✅ Complete | Local durable execution, MCP client, agent cards |
2 — Production Core | ✅ Complete | Distributed workers, MCP server, A2A client + server |
3 — Developer Delight | 🔄 In Progress | Eval harness, Java SDK, trace debugging, templates |
4 — Enterprise | 🔄 In Progress | Policy engine, tenant isolation, PII redaction, OAuth, mTLS |
5 — Scale & Ecosystem | 📋 Planned | Go SDK, TypeScript SDK, hosted plane, marketplace |
Documentation
Full docs at jamjet.dev
Quickstart · Concepts · Python SDK · Java SDK · YAML Workflows · REST API · MCP · A2A · Eval · Enterprise · Observability · CLI · Deployment
Repository Structure
jamjet/
├── runtime/ # Rust workspace
│ ├── core/ # Graph IR, node types, state machine
│ ├── scheduler/ # Durable task scheduler
│ ├── state/ # Event-sourced state, snapshots
│ ├── workers/ # Node executors (model, tool, eval, …)
│ ├── api/ # REST API, OAuth delegation
│ ├── engram/ # Durable memory library (crates.io)
│ ├── engram-server/ # MCP + REST memory server
│ ├── protocols/ # MCP + A2A client/server
│ └── ... # agents, models, timers, policy, audit, telemetry
├── sdk/
│ ├── python/ # Python SDK + CLI (PyPI)
│ ├── java/ # Java SDK (Maven Central)
│ └── go/ # Go SDK (planned)
└── examples/ # 20 runnable examplesContributing
Contributions welcome — see CONTRIBUTING.md.
Community
GitHub Discussions · Issues · Discord
License
Apache 2.0 — see LICENSE.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jamjet-labs/jamjet'
If you have feedback or need assistance with the MCP directory API, please join our Discord server