Install
CLI
Python
TypeScript
Rust crate
Cargo
brew install lukacf/meerkat/rkat
The Homebrew tap supports macOS and Linux. On Linux, install Homebrew first from the Homebrew on Linux instructions, then use the same tap command. The SDK resolves rkat-rpc automatically by default and downloads it when needed. Install the standalone binary only if you want to manage it yourself.
The SDK resolves rkat-rpc automatically by default and downloads it when needed. Install the standalone binary only if you want to manage it yourself.
[dependencies]
meerkat = { version = "0.7.11", features = ["anthropic", "jsonl-store"] }
meerkat-store = "0.7.11"
meerkat-tools = "0.7.11"
tokio = { version = "1", features = ["full"] }
Before your first run, set up provider credentials. The fastest path is environment variables; for realm-scoped bindings and OAuth flows, see Auth and Providers.
Run an agent
Rust
Python
TypeScript
CLI
use std::sync::Arc;
use meerkat::{AgentBuilder, AgentFactory, AnthropicClient, JsonlStore};
use meerkat_store::StoreAdapter;
let api_key = std::env::var("ANTHROPIC_API_KEY")?;
let store_dir = std::env::current_dir()?.join(".rkat").join("sessions");
std::fs::create_dir_all(&store_dir)?;
let factory = AgentFactory::new(store_dir.clone());
let client = Arc::new(AnthropicClient::new(api_key)?);
let llm = factory.build_llm_adapter(client, "claude-sonnet-4-6").await;
let store = Arc::new(JsonlStore::new(store_dir));
store.init().await?;
let store = Arc::new(StoreAdapter::new(store));
let tools = Arc::new(meerkat_tools::EmptyToolDispatcher);
let mut agent = AgentBuilder::new()
.model("claude-sonnet-4-6")
.system_prompt("You are a helpful assistant. Be concise in your responses.")
.max_tokens_per_turn(1024)
.build(Arc::new(llm), tools, store)
.await?;
let result = agent
.run("What is the capital of France? Answer in one sentence.".into())
.await?;
println!("Response: {}", result.text);
from meerkat import MeerkatClient
client = MeerkatClient()
await client.connect()
result = await client.create_session(prompt="What is the capital of France?")
print(result.text)
await client.close()
import { MeerkatClient } from "@rkat/sdk";
const client = new MeerkatClient();
await client.connect();
const result = await client.createSession("What is the capital of France?");
console.log(result.text);
await client.close();
export ANTHROPIC_API_KEY=sk-...
rkat run "What is the capital of France?"
To share state across processes/surfaces, pass the same explicit realm (--realm for CLI, realm_id/realmId for SDK clients). See realms.
Switch providers
Same code, different model. The provider is resolved from the model registry:
rkat run --model claude-sonnet-4-6 "Explain monads"
rkat run --model gpt-5.5 "Explain monads"
rkat run --model gemini-3.5-flash "Explain monads"
Register an MCP server and its tools are available to the agent immediately:
rkat mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp
rkat run "List the files in /tmp"
Remote streamable HTTP MCP servers can be added with a URL. OAuth-protected
servers keep config simple and authenticate when you log in or run
interactively:
rkat mcp add --transport http glean https://king-be.glean.com/mcp/default
rkat mcp login glean
rkat run "Use Glean to search for onboarding docs"
Enforce budgets
Cap token usage, wall-clock time, or tool calls:
rkat run --max-tokens 10000 --max-duration 30s --max-tool-calls 5 "Analyze this codebase"
The agent completes its current turn when a limit is hit, then stops.
What’s next
For a maintained repository starter, see the Rust example in the Meerkat repository under meerkat/examples/simple.rs.