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로 작성되었습니다. 작성 인터페이스는 Python, Java, Go(계획 중) 또는 YAML을 지원합니다. 모두 동일한 IR 그래프로 컴파일되어 동일한 엔진에서 실행됩니다.

왜 JamJet인가?

문제

JamJet의 답변

에이전트 실행 중 충돌 시 상태 손실

내구성 있는 그래프 실행 — 이벤트 소싱, 충돌 방지 재개

사람의 승인을 위해 일시 중지할 방법 없음

Human-in-the-loop를 일급 워크플로우 기본 요소로 지원

에이전트가 자체 프레임워크에 고립됨

네이티브 MCP + A2A — 모든 에이전트, 모든 프레임워크와 상호 운용

대규모 Python 오케스트레이션의 느린 속도

Rust 코어 — GIL 없음, 실제 비동기 병렬 처리

약한 관측 가능성, 재실행 불가

전체 이벤트 타임라인, OTel GenAI 추적, 모든 체크포인트에서 재실행

표준 에이전트 식별자 없음

에이전트 카드 — 모든 에이전트는 주소 지정 및 검색 가능

하드코딩된 에이전트 라우팅

코디네이터 노드 — 구조화된 점수 매기기 + 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})

세 가지 수준 모두 동일한 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 (외부)

에이전트 식별자

✅ 에이전트 카드, 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와 통신하는

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