Context7
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Description from the maker (original English)
Persistent decision memory for agents — learns which action works in which context
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
BANDITDB_URL, BANDITDB_API_KEYValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"banditdb": {
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}Run this in your terminal
claude mcp add banditdb --env BANDITDB_URL=your-value --env BANDITDB_API_KEY=your-value -- uvx banditdb-pythonFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"banditdb": {
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"banditdb": {
"type": "stdio",
"command": "uvx",
"args": [
"banditdb-python"
],
"env": {
"BANDITDB_URL": "your-value",
"BANDITDB_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified against the domain banditdb.com (the registry checks domain ownership)
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: BANDITDB_URL, BANDITDB_API_KEY
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.3.1) reached the registry 26 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Context7, Codebase Memory, Exa
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
The official Python client and Model Context Protocol (MCP) server for BanditDB — the ultra-fast, lock-free Contextual Bandit database written in Rust.
BanditDB abstracts away the complex linear algebra of Reinforcement Learning (LinUCB, Thompson Sampling) behind a dead-simple API. Build real-time personalizers, dynamic A/B tests, and give LLM agents mathematically rigorous persistent memory.
mcp-name: com.banditdb/mcp
pip install banditdb-python
Requires the BanditDB Rust server running (default: http://localhost:8080).
The client features automatic connection pooling, exponential backoff retries, and strict timeouts.
from banditdb import Client, BanditDBError
db = Client( url="http://localhost:8080", timeout=2.0, api_key="your-secret-key", # omit if server runs without auth )
try:
db.create_campaign( campaign_id="checkout_upsell", arms=["offer_discount", "offer_free_shipping"], features=["is_mobile", "cart_value", "is_returning_user"], )
arm_id, interaction_id = db.predict("checkout_upsell", { "is_mobile": 1.0, "cart_value": min(cart_total / 200, 1.0), "is_returning_user": 0.0, }) print(f"Showing: {arm_id}") # e.g., "offer_free_shipping"
db.reward(interaction_id, reward=1.0)
except BanditDBError as e: print(f"Database error: {e}")
Named features or a vector. With features=[...] the campaign stores the feature order in its metadata, and predict, batch_predict and interact accept a dict keyed by name. A missing or misspelt name raises ValueError before any request is sent. Campaigns created in the BanditDB console accept dicts too. The order is read once per campaign with campaign_info() and cached on the client. To manage the vector yourself, pass feature_dim instead and send lists — normalize_context() scales one to unit length.
Health
| Method | Description |
|---|---|
health() | Returns True if the server is reachable and the WAL writer is healthy. |
health_detail() | Returns the full health dict including per-campaign entropy and status ("ok" / "warning" / "critical"). |
Campaigns
| Method | Description |
|---|---|
create_campaign(campaign_id, arms, feature_dim=None, alpha=1.0, algorithm="linucb", metadata=None, decay_half_life_hours=None, pacing=None, features=None) | Register a new campaign. Pass features (names, in order) to predict with dicts, or feature_dim to send vectors. algorithm accepts "linucb", "thompson_sampling", NeuralLinUCBConfig, NeuralTSConfig, or ProgressiveConfig. metadata is an arbitrary JSON dict (≤ 64 KB). pacing takes a PacingConfig — see Budget constraints. |
list_campaigns() | Returns a list of all campaigns (active and archived) with alpha, arm_count, and algorithm. |
campaign_info(campaign_id) | Returns full per-arm state: theta, theta_norm, prediction and reward counters. Raises APIError (404) if not found. |
report(campaign_id) | Business-level convergence report. converged=True means one arm has a statistically significant lead at 95% CI — safe to stop. converged=False means leading but CIs still overlap. converged=None means not enough data yet (< 30 rewards per arm). |
diagnostics(campaign_id) | Operator diagnostics: per-arm theta norms, A_inv uncertainty bounds, entropy health (selection_entropy, entropy_status, entropy_trend, likely_cause, suggested_action), tournament traffic, and neural buffer size. |
archive_campaign(campaign_id) | Soft-delete: pauses predictions/rewards but preserves all learned weights. Recoverable with restore_campaign(). |
restore_campaign(campaign_id) | Restore an archived campaign to active status with all weights intact. |
delete_campaign(campaign_id) | Permanently delete a campaign. Returns False if not found. |
pacing(campaign_id) | Budget state of a pacing campaign: per-resource budget, consumed, remaining, utilization, lambda (shadow price), is_exhausted. None if the campaign has no pacing. Server 2.3.0+. |
add_arm(campaign_id, arm_id, group=None, warm_start=None, costs=None) | Add an arm to a live campaign (admin key). costs maps resource name → units consumed per prediction, for pacing campaigns. |
set_arm_status(campaign_id, arm_id, status) | "active", "paused" (not selectable, reversible) or "retired". The arm keeps what it learned. Admin key. |
Predict & Reward
| Method | Description | |
|---|---|---|
predict(campaign_id, context, eligible_arms=None, exclude_arms=None) | context is a dict of feature values (named campaigns) or a vector. Returns (arm_id, interaction_id). Pass interaction_id to reward() to close the loop. The optional filters narrow candidates for this call only. | |
batch_predict(predictions) | Predict for up to 100 campaign/context pairs in a single round-trip. Each item: `{"campaign_id": str, "context": dict | List[float]}. Returns list of {arm_id, interaction_id} or {error}` per item. |
reward(interaction_id, reward) | Record outcome. reward must be in [0.0, 1.0]. Raises APIError if the interaction has already been rewarded or has expired (default TTL: 24 h). |
Data & Export
| Method | Description |
|---|---|
checkpoint() | Flush WAL, snapshot models, write Parquet shards, run neural retrain + tournament eval, rotate WAL. Returns a summary string. |
export() | List Parquet export shards grouped by campaign. Returns {export_dir, shards}. |
Server 2.3.0+. Give a campaign one or more budgeted resources and per-arm costs; the server learns a shadow price per resource and steers spend to last the horizon, choosing costly arms only where their uplift is worth it.
from banditdb import Client, PacingConfig, ResourceConstraint
db.create_campaign( "promos", ["none", "discount_10", "discount_20"], feature_dim=4, pacing=PacingConfig(resources=[ ResourceConstraint( name="promo_budget", budget=5_000.0, # units available over the horizon horizon=100_000, # decisions the budget should last arm_costs={"discount_10": 1.0, "discount_20": 2.0}, # "none" costs 0 ), ]), )
db.add_arm("promos", "discount_30", costs={"promo_budget": 3.0})
for r in db.pacing("promos")["resources"]: print(f"{r['name']}: {r['utilization']:.0%} spent, lambda={r['lambda']:.3f}")
Worth knowing:
arm_costs keys must be campaign arms. The server would silently treat a misspelt arm as free; the SDK raises ValueError instead.Standard LLM agents are stateless — if they route a task to the wrong model and fail, they repeat the same mistake tomorrow. BanditDB's built-in MCP server gives the entire agent swarm shared persistent memory.
# Set environment variables before starting
export BANDITDB_URL=http://localhost:8080 export BANDITDB_API_KEY=your-secret-key # omit if server runs without auth
banditdb-mcp
Add to your Claude configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": { "banditdb": { "command": "banditdb-mcp", "args": [], "env": { "BANDITDB_URL": "http://localhost:8080", "BANDITDB_API_KEY": "your-secret-key" } } } }
The agent swarm now has twelve tools:
| Tool | What it does |
|---|---|
create_campaign | Create a new decision campaign. Accepts algorithm ("linucb" or "thompson_sampling"), alpha, and optional budgets for actions that cost something limited. Use Thompson Sampling for natural Bayesian exploration with no tuning needed. |
list_campaigns | List all active campaigns (shows algorithm and alpha) — useful to check what exists before calling get_intuition. |
campaign_diagnostics | Inspect per-arm learning state: theta_norm, prediction counts, reward rates, and entropy health. Use when a campaign doesn't seem to be learning or one arm is dominating. |
campaign_report | Business-level convergence report. Tells you whether the campaign has statistically converged and which arm is winning with confidence intervals. |
get_intuition | Ask BanditDB which arm to pick for a given context. Optional exclude_arms / eligible_arms narrow the choice for this request only. Returns the arm and an interaction_id to save. |
batch_get_intuition | Get decisions for multiple campaigns in a single round-trip. Pass a list of {campaign_id, context} dicts. |
record_outcome | Report whether the chosen action succeeded (1.0) or failed (0.0). Updates the shared model. |
archive_campaign | Soft-delete a campaign. Pauses predictions/rewards but preserves all learned weights. |
restore_campaign | Restore an archived campaign to active status with all weights intact. |
campaign_budget | Budget spend per resource: consumed, remaining, utilization, shadow price, exhaustion. |
add_arm | Add an action to a live campaign, optionally warm-started from existing arms and with budget costs. |
set_arm_status | Pause, retire, or reactivate an action. It keeps everything it learned. |
Every decision made by any agent in the network improves the routing for all future agents.
BanditDB event-sources every prediction and reward to a Write-Ahead Log (WAL). Calling checkpoint() compiles completed prediction→reward pairs into Snappy-compressed Parquet files — one per campaign — for offline analysis with Polars or Pandas.
Every prediction is guaranteed to appear in the Parquet file even if its reward arrives hours later: BanditDB re-emits in-flight interactions at each checkpoint so delayed rewards are always captured in a future cycle.
# Checkpoint: snapshot models, write Parquet, rotate the WAL.
summary = db.checkpoint() print(summary)
print(db.export())
import polars as pl df = p
Only the beginning is shown; read the rest in the repo