Skip to main content
Glama

エージェントネイティブなランタイム — 耐久性、構成可能性、本番環境向け。

jamjet MCP server CI PyPI License Rust Python Java Go Docs Discord

jamjet.dev · クイックスタート · コンセプト · APIリファレンス · · ブログ · Discord

Open in GitHub Codespaces Open in Gitpod

jamjet MCP server

JamJet demo


JamJetは、AIエージェントのためのパフォーマンス重視のエージェントネイティブなランタイムです。単なるプロンプトのラッパーや軽量なエージェントSDKではなく、デモだけでなく実務で機能する必要があるエージェントのための本番グレードのオーケストレーション基盤です。

ランタイムのコアは、スケジューリング、状態管理、並行処理のためにRust + Tokioで構築されています。作成インターフェースはPythonJavaGo(計画中)、またはYAMLです。すべて同じIRグラフにコンパイルされ、同じエンジン上で実行されます。

なぜJamJetなのか?

課題

JamJetの回答

エージェント実行がクラッシュ時に状態を失う

耐久性のあるグラフ実行 — イベントソーシング、クラッシュセーフな再開

人間の承認のために一時停止する方法がない

Human-in-the-loop — ファーストクラスのワークフロープリミティブ

エージェントが独自のフレームワークに孤立している

ネイティブMCP + A2A — あらゆるエージェント、あらゆるフレームワークと相互運用

大規模なPythonオーケストレーションが遅い

Rustコア — GILなし、真の非同期並列処理

可観測性が弱い、リプレイ不可

完全なイベントタイムライン、OTel GenAIトレース、任意のチェックポイントからのリプレイ

標準的なエージェントIDがない

エージェントカード — すべてのエージェントがアドレス指定可能で発見可能

ハードコードされたエージェントルーティング

コーディネーターノード — 構造化スコアリング + LLMタイブレーカーによる動的ルーティング

エージェントをツールとして使用できない

Agent-as-Tool — あらゆるエージェントを呼び出し可能なツールとしてラップ(同期、ストリーミング、会話型)

ガバナンスやガードレールがない

ポリシーエンジン — ツールブロッキング、承認、自律性強制、監査ログ

チェックされていないアクセス権を持つエージェント

OAuth委任 — RFC 8693トークン交換、スコープの絞り込み、ステップごとのスコープ設定

ログへのPII漏洩

データガバナンス — PIIの編集(マスク/ハッシュ/削除)、保持ポリシー、自動パージ

テナント分離がない

マルチテナント — 行レベルのパーティショニング、テナントスコープの状態、分離された監査ログ

一つの言語にロックインされる

ポリグロットSDK — Python、Java (JDK 21)、Go (計画中)、YAML — 同じIR、同じランタイム

サーバーなしで実行できない

インプロセス実行pip install jamjet で即座に実行


クイックスタート

要件: Python 3.11+

最速パス — 純粋なPython、サーバーなし

pip install jamjet
from 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?")
print(result)

サーバーなし。設定なし。YAMLなし。pip install して実行するだけ。

フルランタイムパス — 耐久性のある実行

pip install jamjet
jamjet init my-first-agent
cd my-first-agent
jamjet dev

別のターミナルで:

jamjet run workflow.yaml --input '{"query": "What is JamJet?"}'

完全なクイックスタートガイド


Hello World

YAML

# workflow.yaml
workflow:
  id: hello-agent
  version: 0.1.0
  state_schema:
    query: str
    answer: str
  start: think

nodes:
  think:
    type: model
    model: claude-haiku-4-5-20251001
    prompt: "Answer clearly and concisely: {{ state.query }}"
    output_key: answer
    next: end

  end:
    type: end
jamjet validate workflow.yaml
jamjet run workflow.yaml --input '{"query": "What is JamJet?"}'

Python — @task (最もシンプル)

from 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?")

ドキュメント文字列が指示になります。関数シグネチャが契約になります。それだけです。

Python — Agent

from jamjet import Agent, tool

@tool
async def web_search(query: str) -> str:
    return f"Search results for: {query}"

agent = Agent(
    "researcher",
    model="claude-haiku-4-5-20251001",
    tools=[web_search],
    instructions="You are a research assistant. Search first, then summarize.",
)

result = await agent.run("What is JamJet?")
print(result)

Python — Workflow (完全な制御)

from jamjet import Workflow, tool
from pydantic import BaseModel

@tool
async def web_search(query: str) -> str:
    return f"Search results for: {query}"

workflow = Workflow("research")

@workflow.state
class State(BaseModel):
    query: str
    answer: str | None = None

@workflow.step
async def search(state: State) -> State:
    result = await web_search(query=state.query)
    return state.model_copy(update={"answer": result})

これら3つのレベルはすべて同じIRにコンパイルされ、同じ耐久性のあるRustランタイム上で実行されます。

パフォーマンス

JamJetのIRコンパイルは、LangGraphのグラフコンパイルよりも88倍高速です:

操作

JamJet

LangGraph

コンパイル / グラフ構築

~0.006 ms

~0.529 ms

インプロセス呼び出し

~0.015 ms

~1.458 ms

Python 3.11、単一ツールワークフローで測定。JamJetは軽量なIR辞書をコンパイルし、LangGraphはNetworkXグラフを構築します。

MCPツール呼び出し

nodes:
  search:
    type: tool
    server: brave-search        # configured in jamjet.toml
    tool: web_search
    arguments:
      query: "{{ state.query }}"
      count: 10
    output_key: results
    next: summarize

A2A委任

nodes:
  delegate:
    type: a2a_task
    agent_url: "https://agents.example.com/research-agent"
    input:
      query: "{{ state.query }}"
    output_key: research
    next: end

自己改善による評価

nodes:
  check:
    type: eval
    scorers:
      - type: llm_judge
        rubric: "Is the answer accurate and complete?"
        min_score: 4
    on_fail: retry_with_feedback   # injects feedback into next model call
    max_retries: 2
    next: end

コーディネーター — 動的エージェントルーティング

from jamjet.coordinator import DefaultCoordinatorStrategy

strategy = DefaultCoordinatorStrategy(registry=my_registry)

# Discover agents by skill, score them, route to the best fit
candidates, _ = await strategy.discover(
    task="Analyze quarterly revenue data",
    required_skills=["data-analysis", "finance"],
    trust_domain="internal",
)
rankings, spread = await strategy.score(task, candidates, weights={})
decision = await strategy.decide(task, rankings, threshold=0.1)
# decision.selected_uri → "jamjet://org/finance-analyst"

Agent-as-Tool — エージェントを呼び出し可能なツールとしてラップ

from jamjet.agent_tool import agent_tool

# Sync: quick, stateless
classifier = agent_tool(agent="jamjet://org/classifier", mode="sync",
                        description="Classifies documents by topic")

# Streaming: long-running with early termination on budget
researcher = agent_tool(agent="jamjet://org/researcher", mode="streaming",
                        description="Deep research with progress", budget={"max_cost_usd": 2.00})

# Conversational: multi-turn iterative refinement
reviewer = agent_tool(agent="jamjet://org/reviewer", mode="conversational",
                      description="Peer review with feedback", max_turns=5)

自動ルーティング — コンパイラが自動的にコーディネーターを挿入

from jamjet.workflow.graph import WorkflowGraph

graph = WorkflowGraph("pipeline")
graph.add_agent_tool("process", agent="auto", mode="sync", output_key="result")
# ↑ "auto" expands at compile time into: Coordinator → AgentTool
ir = graph.compile()
# IR now has 2 nodes: _coordinator_process → process

エージェント設計パターン

JamJetは6つの主要なマルチエージェントオーケストレーションパターンをサポートしています。それぞれの使用タイミングは以下の通りです:

パターン

JamJetプリミティブ

使用タイミング

シングルエージェント

@task を持つ Agent

シンプルなプロトタイプ、単一目的のタスク

チャットボット、分類器

シーケンシャルパイプライン

エッジを持つ WorkflowGraph

各ステップが前段に依存する順序付きステップ

ETL、ドキュメント処理

並列ファンアウト

ParallelNode

同時に実行可能な独立したタスク

マルチソース調査、バッチ分類

ループ&クリティック

LoopNode + EvalNode

反復的な洗練が必要な品質重視のタスク

コードレビュー、コンテンツ生成

コーディネーター(動的ルーティング)

CoordinatorNode

能力、コスト、レイテンシに基づいて実行時に最適なエージェントにルーティング

サポートチケットルーティング、タスク委任

Agent-as-Tool

agent_tool() ラッパー

あるエージェントが別のエージェントを関数として呼び出す必要がある場合

スペシャリストを呼び出すオーケストレーター

適切なパターンの選択

Is it a single task?
  → Single Agent

Does order matter?
  → Sequential Pipeline

Can tasks run independently?
  → Parallel Fan-Out

Does output need quality checks?
  → Loop & Critic

Do you need to pick the best agent at runtime?
  → Coordinator

Does one agent need to invoke another?
  → Agent-as-Tool

コーディネーター vs 静的ルーティング

静的 (ConditionalNode)

動的 (CoordinatorNode)

候補

YAMLで宣言

実行時にレジストリから発見

選択

式ベースのルール

構造化スコアリング + オプションのLLMタイブレーカー

エージェント変更時

ワークフローの再デプロイ

自動 — 新しいエージェントが発見される

可観測性

実行されたブランチがログ記録

完全なスコアリングの内訳 + イベントログ内の推論

最適用途

固定された既知のルート

動的環境、マルチテナント、研究


JamJetの比較

2026年3月時点。すべてのフレームワークは進化します — 最新情報は各ドキュメントを確認してください。

機能

JamJet

Google ADK

LangChain

AutoGen

CrewAI

シンプルなエージェント設定

✅ 3行 (@task)

✅ 5行

6行以上

10行以上

8行以上

インプロセス実行

pip install + 実行

✅ ネイティブ

✅ ネイティブ

✅ ネイティブ

✅ ネイティブ

耐久性のある実行

✅ イベントソーシング、クラッシュセーフ

❌ 一時的

❌ 一時的

❌ 一時的

❌ 一時的

動的エージェントルーティング

✅ スコアリング+LLMタイブレーカー付きコーディネーター

transfer_to_agent()

Agent-as-Tool

✅ 同期、ストリーミング、会話型

AgentTool (同期のみ)

Human-in-the-loop

✅ ファーストクラスのプリミティブ

🟡 コールバック

🟡 コールバック

🟡 会話型

🟡 手動

MCPサポート

✅ クライアント + サーバー

✅ クライアント + サーバー

🟡 クライアントのみ

🟡 クライアントのみ

🟡 クライアントのみ

A2Aプロトコル

✅ クライアント + サーバー

🟡 クライアントのみ

組み込み評価

✅ LLMジャッジ、アサーション、コスト

✅ 8つの組み込み基準

組み込み可観測性

✅ OTel GenAI、イベントリプレイ

✅ Cloud Trace

🟡 LangSmith (外部)

エージェントID

✅ エージェントカード、A2A発見

✅ エージェントカード

ポリシー&ガバナンス

✅ ポリシーエンジン、監査ログ

🟡 Model Armorプラグイン

マルチテナント分離

✅ 行レベルのパーティショニング

PII編集

✅ マスク/ハッシュ/削除、保持

🟡 プラグイン

モデルの独立性

✅ あらゆるモデルプロバイダー

🟡 Geminiファースト (LiteLLMエスケープ)

✅ あらゆる

✅ あらゆる

✅ あらゆる

段階的な複雑性

@taskAgentWorkflow

🟡 コードまたはYAML

❌ 単一API

マネージドデプロイ

📋 計画中

✅ Vertex AI Agent Engine

ランタイム言語

Rustコア + Python/Java/Go

Python/TS/Go/Java

Python

Python

Python

最適用途

本番マルチエージェントシステム

Google Cloud AIエージェント

ラピッドプロトタイピング

会話型エージェント

ロールベースのクルー


メモリ — Engram

JamJetには、エージェントのための耐久性のあるメモリ層であるEngramが付属しています。時間的ナレッジグラフ、ハイブリッド検索、統合エンジンを備え、すべて単一のSQLiteファイルによってバックアップされています。Engramは組み込みRustライブラリとして、またはスタンドアロンのMCP/RESTサーバーとして実行され、Python、Java、Spring Bootから利用可能です。

プロバイダー非依存。 同じEngramバイナリがOllama(ローカル、無料)、あらゆるOpenAI互換エンドポイント(OpenAI、Azure、Groq、Together、Mistral、DeepSeek、Perplexity、OpenRouter、vLLM、LM Studioなど)、Anthropic Claude、Google Gemini、またはその他のための command シェルアウトと通信します。ENGRAM_LLM_PROVIDER=… で選択するだけで、再コンパイルは不要です。

形状

パッケージ

使用タイミング

Rustライブラリ

jamjet-engram (crates.io)

Rustアプリケーションにメモリを直接埋め込む場合

スタンドアロンバイナリ

jamjet-engram-server (crates.io), ghcr.io/jamjet-labs/engram-server (Docker), 公式MCPレジストリ

MCPクライアント (Claude Desktop, Cursor)、言語非依存のRESTクライアント、コード不要のセットアップ

Pythonクライアント

jamjet (PyPI)

REST経由で engram-server と通信するPythonエージェント

Javaクライアント

dev.jamjet:jamjet-sdk (Maven Central)

REST経由で engram-server と通信するJVMエージェント

Spring Bootスターター

dev.jamjet:engram-spring-boot-starter (Maven Central)

Spring AIアプリケーション用のドロップイン @Bean EngramMemory

# Try it with Claude Desktop in 30 seconds (uses local Ollama by default)
docker run --rm -i \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

# Or point at Groq instead — same binary, no rebuild
docker run --rm -i \
  -e ENGRAM_LLM_PROVIDER=openai-compatible \
  -e ENGRAM_OPENAI_BASE_URL=https://api.groq.com/openai/v1 \
  -e OPENAI_API_KEY=gsk_... \
  -v engram-data:/data \
  ghcr.io/jamjet-labs/engram-server:0.3.2

サーバーによって公開される7つのMCPツール:memory_addmemory_recall、`

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