原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

BanditDB

作者:dynamicpricing-ai版本 0.3.1i★ –i在你的电脑上运行
注册名称com.banditdb/mcp

安装

概览

作者提供的说明(英文原文)

Persistent decision memory for agents — learns which action works in which context

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 搜索与 AI 记忆
  • 你需要填写:BANDITDB_URL, BANDITDB_API_KEY

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 需要你自己填写: BANDITDB_URL, BANDITDB_API_KEY

标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。

你需要

  • PyPI已安装 Python 的 uv(用于 uvx 命令)

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "banditdb": {
      "command": "uvx",
      "args": [
        "banditdb-python"
      ],
      "env": {
        "BANDITDB_URL": "your-value",
        "BANDITDB_API_KEY": "your-value"
      }
    }
  }
}

在终端中运行这条命令

claude mcp add banditdb --env BANDITDB_URL=your-value --env BANDITDB_API_KEY=your-value -- uvx banditdb-python

运行前请先填写空着的值。

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "banditdb": {
      "command": "uvx",
      "args": [
        "banditdb-python"
      ],
      "env": {
        "BANDITDB_URL": "your-value",
        "BANDITDB_API_KEY": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "banditdb": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "banditdb-python"
      ],
      "env": {
        "BANDITDB_URL": "your-value",
        "BANDITDB_API_KEY": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • BANDITDB_URL 必填 env
    Base URL of the BanditDB server, e.g. http://localhost:8080 or https://your-instance.api.banditdb.com. Try it against the public sandbox at https://sandbox.banditdb.com before running your own.
  • BANDITDB_API_KEY 机密 必填 env
    API key. A writer-role key is enough for get_intuition and record_outcome; admin is needed to create or delete campaigns.

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过域名 banditdb.com 验证(注册中心会核实域名所有权)

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“搜索与 AI 记忆”中的其他服务器比较i

  • 星标数多于此分类中其他 7251 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 7251 个服务器的 58% 更新
  • 基础检查结果等于或优于此分类中其他 7251 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

BanditDB 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

你需要填写:BANDITDB_URL, BANDITDB_API_KEY

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.3.1)于26天前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。

有什么可以替代它?

同一分类中有:Context7, Codebase Memory, Exa

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

Context7

作者:upstash

Up-to-date docs for AI agents

电脑或云端★ 64,224MIT今天更新
安装

Codebase Memory

作者:DeusData

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

在你的电脑上运行★ 48,148MIT20天前更新
安装

Exa

作者:exa-labs

Connect AI agents to Exa for web search, content fetching, and multi-step research.

在云端运行★ 5,213MIT上个月更新
安装

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

BanditDB Python SDK

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

Installation

pip install banditdb-python

Requires the BanditDB Rust server running (default: http://localhost:8080).


1. Standard SDK Usage

The client features automatic connection pooling, exponential backoff retries, and strict timeouts.

from banditdb import Client, BanditDBError

Connect to the BanditDB server.

Pass api_key if BANDITDB_API_KEY is set on the server.

db = Client( url="http://localhost:8080", timeout=2.0, api_key="your-secret-key", # omit if server runs without auth )

try:

1. Create a campaign (run once at startup)

algorithm defaults to "linucb"; use "thompson_sampling" for Bayesian exploration

db.create_campaign( campaign_id="checkout_upsell", arms=["offer_discount", "offer_free_shipping"], features=["is_mobile", "cart_value", "is_returning_user"], )

or: db.create_campaign(..., algorithm="thompson_sampling")

2. A user arrives — ask the database what to show them.

Scale each value to 0–1; the SDK puts them in order, adds a constant 1

and normalises the vector.

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"

3. The user clicked — send the reward

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.

All Client methods

Health

MethodDescription
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

MethodDescription
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

MethodDescription
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": dictList[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

MethodDescription
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}.
Budget constraints

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 ), ]), )

Arms added later declare their own costs

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:

  • Budget is spent at `predict`, not `reward`. A recommendation you never act on still consumes budget.
  • Budget never resets and pacing is immutable. Once spent, costly arms stay unselectable until the campaign is recreated.
  • arm_costs keys must be campaign arms. The server would silently treat a misspelt arm as free; the SDK raises ValueError instead.
  • Predicts on a pacing campaign can return 503 if the server's WAL is saturated.
  • Downgrading the server below 2.3.0 silently drops pacing.

2. The AI "Hive Mind" (Model Context Protocol)

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.

Starting the MCP server
# 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

Connecting to Claude Desktop

Add to your Claude configuration file:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %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:

ToolWhat it does
create_campaignCreate 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_campaignsList all active campaigns (shows algorithm and alpha) — useful to check what exists before calling get_intuition.
campaign_diagnosticsInspect 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_reportBusiness-level convergence report. Tells you whether the campaign has statistically converged and which arm is winning with confidence intervals.
get_intuitionAsk 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_intuitionGet decisions for multiple campaigns in a single round-trip. Pass a list of {campaign_id, context} dicts.
record_outcomeReport whether the chosen action succeeded (1.0) or failed (0.0). Updates the shared model.
archive_campaignSoft-delete a campaign. Pauses predictions/rewards but preserves all learned weights.
restore_campaignRestore an archived campaign to active status with all weights intact.
campaign_budgetBudget spend per resource: consumed, remaining, utilization, shadow price, exhaustion.
add_armAdd an action to a live campaign, optionally warm-started from existing arms and with budget costs.
set_arm_statusPause, 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.


3. Data Science & Offline Evaluation

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.

Call this on a schedule or after significant traffic.

summary = db.checkpoint() print(summary)

"Checkpoint written and WAL rotated: 2 campaigns, offset 4821 bytes,

150 interactions exported, 3 in-flight re-emitted"

List which Parquet files are available

print(db.export())

'Parquet files in /data/exports: ["llm_routing.parquet"]'

Load directly from the mounted volume into Polars.

Flat schema: interaction_id | arm_id | reward | predicted_at | rewarded_at | propensity | feature_0 | ...

import polars as pl df = p

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx