CameleeringCameleer

Cameleer runs your Apache Camel routes, patterns and endpoint URIs unchanged, as one native binary. It starts in 3 ms and runs in megabytes.

The reliable action layer for AI agents. An agent decides; a route does it. Serve routes as MCP tools with one command, and every call is validated against a schema, runs once, waits for approval when it is risky and lands in the audit log. Cameleer MCP

3 ms
to a started context; Apache Camel 4.23 on Java 21: 1.1 s, on Quarkus native: 30 ms
4.8–54x
less peak memory than Apache Camel on the JVM, across 11 scenarios
1.7–8.7x
the throughput, in every scenario; one p99 loss, below

A Cameleering project · measured 2026-11-06 on 0.4.0 against Apache Camel 4.23 · ledger row

A Cameleer route running Messages arrive from a Kafka topic, an AI model classifies each one, and a content-based router sends urgent tickets and routine tickets to different Kafka topics. fromkafka:tickets toopenai: classify urgent otherwise tokafka:urgent tokafka:routine triage.camel.yaml from: kafka:tickets - to: openai:chat-completion - choice: ${body} contains 'URGENT'

Apache Camel and us.

Cameleer exists because Apache Camel got integration right: its patterns, endpoint URIs and YAML DSL are what Cameleer follows, name for name, so the routes you have run unchanged. Cameleer is an independent Rust implementation in the style of Apache Camel. It contains no Camel source code and is not affiliated with or endorsed by the Apache Software Foundation; the comparisons on this site are factual and name the exact versions measured.

Found a route that behaves differently on Cameleer? That is a bug: report it with the route and both outputs. · Migrating from Apache Camel · Cameleering, the practice behind it

Keep your routes. Change the runtime.

The same YAML runs on Apache Camel and on Cameleer. Switch the runtime and watch what changes, including Apache Camel compiled natively with Quarkus.

triage.camel.yaml
- route:
    id: triage
    from:
      uri: kafka:support-tickets
      steps:
        - to: "openai:chat-completion?model=gpt-4o-mini"
        - choice:
            when:
              - simple: "${body} contains 'URGENT'"
                steps:
                  - to: kafka:tickets-urgent
            otherwise:
              steps:
                - to: kafka:tickets-routine

        
Startup3 ms
Memory8 MB
Install sizeone binary

Measured with the same routes against Apache Camel 4.23 on Java 21 and Apache Camel 4.22 compiled natively with Quarkus (full comparison). Same endpoint options, headers, Simple expressions and error handling on all three.

Faster in every scenario we measured.

The same routes on Cameleer and Apache Camel: APIs, Kafka, PostgreSQL and in-memory routing.

CameleerApache Camel 4.23, Java 21
REST APIread JSON, answer JSON
80.3k req/s
37.9k
2.1x
Writing to PostgreSQLinsert per request, pool of 16
11.0k req/s
4.8k
2.3x
Order ingestionHTTP into Kafka, keyed
17.8k req/s
10.1k
1.7x
Stream processingKafka in, filter, Kafka out
6.0k rec/s
698
8.7x
Content-based routerchoice, filter, transform
1.14M msgs/s
376k
3.0x
Request-replyin-memory queue
719k msgs/s
118k
6.1x

One loss: p99 latency for HTTP into Kafka is 8.6 ms against Apache Camel's 7.8 ms, while serving 1.7 times the requests. Plain HTTP reaches 68% of a do-nothing server on the same machines; simoom, the new HTTP engine, is measured to close that gap (its ledger rows). Apache Camel compiled natively with Quarkus starts faster than on the JVM but has lower throughput; it is in the full comparison. Every scenario, the method and the raw data.

The action layer for AI agents.

The model decides what; a tested route decides how. Cameleer feeds events to models, routes on their answers, and turns an agent's tool calls into actions that are validated, run once, retried, rolled back and audited.

  1. Events inKafka, MQTT, webhooks, files, mailboxes, queues, databases
  2. Model23 providers: OpenAI, Anthropic, Gemini, Bedrock, Azure OpenAI, Vertex AI, Ollama and OpenAI-compatible services, with retries, fallbacks and caching in process
  3. Route on the answercontent-based routing on a fixed label set, JSON schema checks on the output, a re-ask on failure
  4. Reliable actionsMCP or REST tools with schema validation, idempotency, approvals, rate limits, circuit breakers, timeouts that cancel, compensation, audit log

Direct tool calls

4 tool calls, 5 model turns
  • A retried call refunds the customer twice
  • A failed step leaves half-done work for the model to undo
  • The model chooses the refund amount
  • The agent holds every API key

Through a Cameleer route

1 tool call, 2 model turns
  • Each request runs once; a repeat gets duplicate
  • A saga cancels the refund when a later step fails
  • The amount comes from the order, not the prompt
  • Keys stay in the route; every call lands in the audit log

Tested on a damaged-order refund across orders, payments, shipping and email: 200 resolved · 200 duplicate, nothing run twice · 400 every bad argument named · 409 not delivered yet · 202 over the limit, waits for a person · 502 carrier down, refund rolled back. The route and the walkthrough

Cameleer MCP: how it works, where it runs, ten tested use cases · Routes as MCP tools · Camel MCP server vs Cameleer · Model calls without a gateway · Agent cookbook · Direct tool calls vs Cameleer · AI components · Let a coding agent write the routes, checked with cameleer validate

An existing route becomes an MCP tool by changing one line, its from URI to ai-tool:...; then cameleer run routes.camel.yaml --mcp (or the same in Docker, or one property in the Rust crate) serves it to Claude Desktop, VS Code, Cursor and agent frameworks, in both MCP protocol eras. Cameleer is both an MCP server and an MCP client: as a gateway it puts the same rules on other MCP servers' tools. The agent step runs a model and its tools in a loop inside a route. Since 0.6.0, in a confidential VM, Cameleer can prove to a client which routes and tools it runs.

What people run on it.

Each use case has a tested route in the repository and a page that explains it. A 3 ms start and an 8 MB footprint change where integration code can run.

Tools for AI agents

Give an agent tools it can call safely across databases, queues, SaaS APIs and files, over MCP or REST: schema validation, idempotency, retries, compensation and an audit log on every call, and a person in the loop for the risky ones.

Gateways at the edge

Run MQTT, syslog and HTTP routing on small devices, filter and aggregate on site, and buffer when the uplink is down, with one binary and no runtime to install, down to 5.9 MB with build features.

Everything you need to connect, built in.

163 components, 26 languages and 29 data formats, each with its own page and tested examples. No third-party crates: every protocol is written on the Rust standard library and checked against real servers and official clients.

230
components, languages, formats
0
dependencies
2,800+
tests

Plus every Enterprise Integration Pattern: the EIP guide. Looking for something specific? Search all components.

Cameleer at a glance.

Version
0.6.0 (2026-11-12)
Licence
Apache License 2.0
Container
docker run cameleering/cameleer:0.6.0; health pack: :health
CLI
cargo install cameleer (the cameleer command); in Rust, cargo add cameleer. The cameleer crate wraps cameleer-main, which works the same
Source
github.com/cameleering/cameleer
Platforms
Linux, macOS, Windows; images for linux/amd64 and linux/arm64; AWS Lambda
Dependencies
none outside the Rust standard library
Affiliation
independent; not affiliated with the Apache Software Foundation

Start with Cameleer: your first route in a minute.

Use the container, the Rust crates or the CLI. Every example here is a file in the repository, run end to end by the test suite.

  1. Save a Camel YAML route as hello-api.camel.yaml
  2. Run it in the container
    docker run --rm -p 8080:8080 \
      -v "$PWD:/routes:ro" cameleering/cameleer \
      run /routes/hello-api.camel.yaml
  3. Call it
    curl localhost:8080/orders/42
    {"id": "42", "status": "shipped"}
hello-api.camel.yaml
- rest:
    path: /orders
    get:
      - path: /{id}
        to: direct:getOrder
- route:
    from:
      uri: direct:getOrder
      steps:
        - setBody:
            simple: '{"id": "${header.id}", "status": "shipped"}'

One native binary on distroless, for linux/amd64 and linux/arm64, non-root and fine with --read-only. On Docker Hub and as ghcr.io/cameleering/cameleer. Routes written for Apache Camel's YAML DSL run unchanged. Kubernetes and Cloud Run: deployment guide.

Real use cases, ready to run

The AI ticket triage route
- route:
    id: ticket-triage
    from:
      uri: "kafka:support-tickets?brokers={{env:KAFKA_BROKERS:localhost:9092}}&groupId=triage&autoOffsetReset=earliest"
      steps:
        - setProperty:
            name: ticket
            simple: "${body}"
        - to: "openai:chat-completion?model={{env:OPENAI_MODEL:gpt-4o-mini}}&baseUrl={{env:OPENAI_BASE_URL:https://api.openai.com/v1}}&temperature=0&systemMessage=Classify the support ticket. Reply P1 for outages, data loss or security issues, otherwise P3. Reply with P1 or P3 only."
        - setHeader:
            name: priority
            simple: "${body}"
        - setBody:
            simple: "${exchangeProperty.ticket}"
        - choice:
            when:
              - simple: "${header.priority} contains 'P1'"
                steps:
                  - to: "kafka:tickets-urgent?brokers={{env:KAFKA_BROKERS:localhost:9092}}"
            otherwise:
              steps:
                - to: "kafka:tickets-routine?brokers={{env:KAFKA_BROKERS:localhost:9092}}"

# docker run --rm --network host -e KAFKA_BROKERS=localhost:9092 -e OPENAI_API_KEY \
#   -v "$PWD:/routes:ro" cameleering/cameleer run /routes/ai-ticket-triage.camel.yaml