MCPcopy Index your code
hub / github.com/IvanLi-CN/tavily-hikari

github.com/IvanLi-CN/tavily-hikari @v0.74.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.74.0 ↗ · + Follow
7,789 symbols 26,789 edges 531 files 133 documented · 2%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Tavily Hikari

Release CI Pipeline Rust Frontend Docs

Tavily Hikari social preview

Tavily Hikari 是一个面向 MCP (Model Context Protocol) 的 Tavily 代理层,基于 Rust + Axum 构建,具备多密钥轮询、匿名透传与细粒度审计能力。后端通过 SQLite 维护密钥状态与请求日志,前端使用 React + Vite 提供实时的可视化运维界面,可直接查看 Key 健康、告警与历史流量。

文档站与 Storybook

功能亮点

  • 多密钥轮询 + 亲和:SQLite 记录每个 Key 的最近使用时间,并为访问令牌(access token)维护一个短期“亲和”关系——在一段时间窗口内,同一 token 会优先命中同一把 Tavily API key;亲和关系失效或 Key 状态变化(耗尽/禁用)时,再通过全局“最久未使用”策略在健康 Key 间重新分配,以尽量均衡磨损。
  • 短 ID 与密钥密级隔离:每个 Tavily Key 会生成 4 位 nanoid,对外只暴露短 ID;真实 Key 仅管理员 API/Web 控制台可读取。
  • 健康巡检:一旦收到 Tavily 432(额度耗尽)会把 Key 标记为 exhausted,并在下一个 UTC 月初或管理员恢复后重新上阵。
  • 高匿透传:仅透传 /mcp 与静态资源,自动清洗 X-Forwarded-* 等敏感头并重写 Origin/Referer,细节见 docs/high-anonymity-proxy.md
  • 可视化运维web/ 单页应用展示实时统计、请求日志、管理员操作入口,支持复制真实 Key、软删除/恢复等动作。
  • 管理路由升级:管理端采用 URL Path 路由(如 /admin/dashboard/admin/tokens/:id/admin/keys/:id),不再使用旧 hash 子路由。
  • 用户控制台 Path 路由:用户控制台现使用 /console/console/dashboard/console/tokens/console/tokens/:id;首页 token 引导仍刻意保留 /#<token> / /#<token-id> hash 兼容,避免把完整 token 带入 path/query 日志面。
  • 完整审计request_logs 表保留 method/path/query、状态码、错误信息、透传/丢弃头部等字段,方便回溯配额损耗与异常请求。
  • 生产级 CI/CD:GitHub Actions 对代码格式、lint、单元测试把关;发版由 PR intent label 驱动(打 tag + GitHub Release + 推送 ghcr.io 镜像)。

组件与数据流

Client → Tavily Hikari (Axum) ──┬─> Tavily upstream (/mcp)
                                ├─> SQLite (api_keys, request_logs)
                                └─> Web SPA (React/Vite, served via /)
  • 后端:Rust 2024 edition、Axum、SQLx、Tokio;负责 CLI、Key 生命周期、请求透传/审计、静态资源托管。
  • 数据层:SQLite 单文件库,包含 api_keys(状态、短 ID、配额字段)与 request_logs(请求/响应/错误)。
  • 前端:React 18 + TanStack Router + Tailwind CSS + shadcn/ui(Radix)+ Vite 5;构建后输出 web/dist,由后端静态挂载或通过 Vite Dev Server 代理到 http://127.0.0.1:58087

快速开始

本地运行

# 1. 启动代理(示例绑定高位端口,本地开发显式放开管理员接口)
DEV_OPEN_ADMIN=true cargo run -- --bind 127.0.0.1 --port 58087

# 2. (可选)启动前端 Dev Server
cd web && bun install --frozen-lockfile && bun run --bun dev -- --host 127.0.0.1 --port 55173

# 3. 通过管理员接口注册 Tavily key(仅本地开发模式)
curl -X POST http://127.0.0.1:58087/api/keys \
  -H "Content-Type: application/json" \
  -d '{"api_key":"key_a"}'

服务启动后可访问 http://127.0.0.1:58087/health 验证状态,或在浏览器打开 http://127.0.0.1:55173 使用控制台。所有 Tavily key 建议通过管理员 API 或 Web 控制台录入,避免把敏感密钥写入环境变量。

Docker 部署

CI 在发布时会产出 ghcr.io/ivanli-cn/tavily-hikari:<tag> 镜像,可直接运行:

docker run --rm \
  -p 8787:8787 \
  -v $(pwd)/data:/srv/app/data \
  ghcr.io/ivanli-cn/tavily-hikari:latest

镜像已包含 web/dist,默认监听 0.0.0.0:8787 并把 SQLite 数据写入 /srv/app/data/tavily_proxy.db(可通过挂载卷持久化)。容器启动后同样需通过管理员接口或前端控制台为代理注册 Tavily key。

二进制发布

GitHub Release 现在会附带 Linux tar.gz 二进制包,分别覆盖 linux/amd64linux/arm64,并同步提供 SHA256 校验文件。该二进制把 Web 界面一并内嵌进程序里,运行时不再需要单独的 web/dist 目录。

Docker Compose

仓库内提供了一个最小化的 docker-compose.yml,用于长期运行或一次性 POC:

docker compose up -d

# 以管理员身份注入首批 Tavily key
curl -X POST http://127.0.0.1:8787/api/keys \
  -H "X-Forwarded-User: admin@example.com" \
  -H "X-Forwarded-Admin: true" \
  -H "Content-Type: application/json" \
  -d '{"api_key":"key_a"}'
  • 服务会自动使用 ghcr.io/ivanli-cn/tavily-hikari:latest,将 8787 端口暴露到宿主机。
  • 通过 tavily-hikari-data 卷持久化 /srv/app/data/tavily_proxy.db,容器重启不会丢数据。
  • 其他 CLI 参数可通过 compose 文件的 environment 字段覆写(例如自定义 upstream 或端口)。

若需要运行自定义镜像,可在 compose 文件里将 image 替换为 build: . 并在本地构建 web/dist 后执行 docker compose up --build

CLI / 环境变量

Flag / Env 说明
--keys / TAVILY_API_KEYS Tavily API key 列表(可选),支持逗号分隔或多次传参,仅用于一次性导入或开发场景;生产环境推荐通过管理员 API/前端控制台录入。
--upstream / TAVILY_UPSTREAM Tavily MCP 上游端点,默认 https://mcp.tavily.com/mcp;支持带 path prefix 的反代 URL。
--bind / PROXY_BIND 监听地址,默认 127.0.0.1
--port / PROXY_PORT 监听端口,默认 8787。建议开发期使用高位端口(如 58087)。
--db-path / PROXY_DB_PATH SQLite 文件路径,默认 tavily_proxy.db
--log-format / RUNTIME_LOG_FORMAT 运行期日志格式,默认 json;需要本地 grep/迁移期排障时可显式切到 text
--static-dir / WEB_STATIC_DIR Web 静态目录,若缺省且存在 web/dist 会自动挂载。
--forward-auth-header / FORWARD_AUTH_HEADER 指定 ForwardAuth 注入的“用户标识”请求头(如 Remote-Email)。
--forward-auth-admin-value / FORWARD_AUTH_ADMIN_VALUE 匹配到该值时视为管理员,可访问 /api/keys/* 接口。
--forward-auth-nickname-header / FORWARD_AUTH_NICKNAME_HEADER 可选,提供 UI 展示的昵称头(如 Remote-Name)。
--admin-mode-name / ADMIN_MODE_NAME 当缺少昵称头时用于覆盖前端显示的管理员名称。
--admin-auth-forward-enabled / ADMIN_AUTH_FORWARD_ENABLED 是否启用旧版 ForwardAuth 管理员校验(默认 false;完整旧版 header 配置会为兼容自动启用)。
--admin-auth-builtin-enabled / ADMIN_AUTH_BUILTIN_ENABLED 是否启用内置管理员登录(cookie 会话)(默认 false)。
--admin-auth-builtin-password-hash / ADMIN_AUTH_BUILTIN_PASSWORD_HASH 内置管理员口令哈希(PHC 字符串,推荐)。
--admin-auth-builtin-password / ADMIN_AUTH_BUILTIN_PASSWORD 内置管理员登录口令(不推荐,优先使用口令哈希)。
--dev-open-admin / DEV_OPEN_ADMIN 仅限本地调试的开关,跳过管理员校验(默认 false)。
--linuxdo-oauth-enabled / LINUXDO_OAUTH_ENABLED 是否启用 Linux DO Connect OAuth2 用户登录(默认 false)。
--linuxdo-oauth-client-id / LINUXDO_OAUTH_CLIENT_ID Linux DO OAuth2 客户端 ID(connect.linux.do 应用)。
--linuxdo-oauth-client-secret / LINUXDO_OAUTH_CLIENT_SECRET Linux DO OAuth2 客户端密钥。
--linuxdo-oauth-authorize-url / LINUXDO_OAUTH_AUTHORIZE_URL OAuth2 授权端点(默认 https://connect.linux.do/oauth2/authorize)。
--linuxdo-oauth-token-url / LINUXDO_OAUTH_TOKEN_URL OAuth2 换 token 端点(默认 https://connect.linux.do/oauth2/token)。
--linuxdo-oauth-userinfo-url / LINUXDO_OAUTH_USERINFO_URL OAuth2 用户信息端点(默认 https://connect.linux.do/api/user)。
--linuxdo-oauth-scope / LINUXDO_OAUTH_SCOPE OAuth scope(默认 user)。
--linuxdo-oauth-redirect-url / LINUXDO_OAUTH_REDIRECT_URL 本服务的前端回调地址(例如 https://tavily.ivanli.cc/console/oauth/linuxdo/callback)。
--linuxdo-oauth-refresh-token-crypt-key / LINUXDO_OAUTH_REFRESH_TOKEN_CRYPT_KEY 用于加密落库 LinuxDo refresh token(32 字节原文,或可解码为 32 字节的 base64/base64url)。
--linuxdo-oauth-user-sync-enabled / LINUXDO_OAUTH_USER_SYNC_ENABLED 是否启用 LinuxDo 离线每日用户同步调度器(默认 true)。
--linuxdo-oauth-user-sync-at / LINUXDO_OAUTH_USER_SYNC_AT LinuxDo 离线每日同步时间,按服务器本地时区解释,格式固定 HH:mm(默认 06:20)。
--linuxdo-credit-enabled / LINUXDO_CREDIT_ENABLED 是否启用 Linux.do Credit 充值支付流程(默认 false)。
--linuxdo-credit-client-id / LINUXDO_CREDIT_CLIENT_ID Linux.do Credit 应用 Client ID。
--linuxdo-credit-client-secret / LINUXDO_CREDIT_CLIENT_SECRET Linux.do Credit 应用 Client Secret。
--linuxdo-credit-merchant-private-key / LINUXDO_CREDIT_MERCHANT_PRIVATE_KEY Linux.do Credit LDC 创建订单签名使用的 Ed25519 商户私钥。
--linuxdo-credit-submit-url / LINUXDO_CREDIT_SUBMIT_URL Linux.do Credit LDC 提交订单端点(默认 https://credit.linux.do/epay/pay/submit.php)。
--linuxdo-credit-notify-url / LINUXDO_CREDIT_NOTIFY_URL 可选的订单级回调地址,通常为 https://<你的 Hikari 域名>/api/linuxdo-credit/notify
--linuxdo-credit-return-url / LINUXDO_CREDIT_RETURN_URL 可选的支付后浏览器返回地址,通常为 https://<你的 Hikari 域名>/console/dashboard
--linuxdo-credit-test-price-enabled / LINUXDO_CREDIT_TEST_PRICE_ENABLED 是否启用 1 LDC 购买 1 个自然月积分的测试档位(默认 false)。
--user-session-max-age-secs / USER_SESSION_MAX_AGE_SECS 用户登录会话 cookie 的有效期(秒,默认 1209600,即 14 天)。
--oauth-login-state-ttl-secs / OAUTH_LOGIN_STATE_TTL_SECS OAuth 一次性 state 的有效期(秒,默认 600)。

首次运行会自动建表。若在 CLI/环境变量里显式传入 --keysTAVILY_API_KEYS,会同步 api_keys 表:在列表中的 Key 会被新增或恢复为 active不在列表中的 Key 会被标记为 deleted。默认推荐通过管理员 API/前端控制台维护 Key 集合。

  • TAVILY_UPSTREAM 按完整的 MCP 端点解释;如果反代保留了 path prefix,配置值里需要包含最终的 /mcp 路径。
  • TAVILY_USAGE_BASE 可以带 path prefix;Hikari 会在这个 prefix 后继续追加 /search/extract/crawl/map/research/research/{id}/usage

HTTP API 速览

Method Path 说明 认证
GET /health 健康检查,返回 200 代表代理可用。
GET /api/summary 汇总成功/失败次数、活跃 Key 数、最近活跃时间。
GET /api/keys 列出 4 位短 ID、状态、请求统计。 管理员
GET /api/logs?page=1 最近请求日志(分页返回,默认每页 20 条),包含状态码与错误。 管理员
POST /api/tavily/search Tavily /search 的代理入口,供 Cherry Studio 等 HTTP 客户端使用。 Hikari Token
POST /api/keys 管理员接口,新增或“反删除”一个 Key。Body: { "api_key": "..." } 管理员
DELETE /api/keys/:id 管理员接口,软删除指定短 ID。 管理员
GET /api/keys/:id/secret 管理员接口,返回真实 Tavily Key。 管理员

管理员身份由 Passkey、内置管理员会话、显式启用的旧版 ForwardAuth 或本地 DEV_OPEN_ADMIN 判断;控制台仅在管理员会话下显示“复制原始 Key”按钮。

Cherry Studio 接入示例

Tavily Hikari 通过 /api/tavily/search 为 Tavily HTTP API 提供代理与密钥池能力,Cherry Studio 这类直接调用 Tavily HTTP

Extension points exported contracts — how you extend this code

WallClock (Interface)
(no doc) [2 implementers]
src/backend_time.rs
GuideReference (Interface)
(no doc)
web/src/PublicHome.tsx
GuideSample (Interface)
(no doc)
web/src/PublicHome.tsx
GuideContent (Interface)
(no doc)
web/src/PublicHome.tsx
PublicHomeStoryArgs (Interface)
(no doc)
web/src/PublicHome.stories.tsx
UserConsoleStoryArgs (Interface)
(no doc)
web/src/UserConsole.stories.tsx

Core symbols most depended-on inside this repo

bind
called by 4106
src/forward_proxy/relay_and_xray.rs
map
called by 1750
src/server/handlers/tavily.rs
now_ts
called by 332
src/backend_time.rs
as_str
called by 323
src/store/key_store_account_usage_rollups.rs
get
called by 271
web/test/happydom.ts
contains
called by 218
src/models.rs
from
called by 152
src/server/dto.rs
create_access_token
called by 138
src/store/key_store_keys.rs

Shape

Function 4,746
Method 1,724
Class 777
Interface 467
Enum 75

Languages

Rust66%
TypeScript32%
Python2%

Modules by API surface

web/src/api/runtime.ts341 symbols
web/src/admin/AdminDashboardRuntime.tsx224 symbols
src/models.rs217 symbols
src/lib.rs142 symbols
src/server/handlers/admin_auth.rs138 symbols
src/store/mod.rs135 symbols
src/tavily_proxy/proxy_auth_and_oauth.rs123 symbols
src/ha.rs120 symbols
web/src/admin/storySupport/AdminPagesStoryRuntime.tsx118 symbols
src/analysis.rs118 symbols
src/tavily_proxy/mod.rs113 symbols
src/server/dto.rs102 symbols

For agents

$ claude mcp add tavily-hikari \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page