Skip to main content
Glama

QuestLLens

让 AI 拥有时间序列数据的"眼睛"

一个自带文档说明的 QuestDB MCP 服务器,可将任何 QuestDB 实例转变为 AI 代理可查询的丰富知识源——对分区、符号、去重键、WAL 状态、摄取健康度和存储布局具备一流的感知能力。

MCP SDK QuestDB TypeScript Node.js Docker License

快速开始 · 工具 · 配置 · Docker · 安全 · 领域上下文


为什么选择 QuestLLens?

AI 模型很强大——但它们对你的时间序列数据库一无所知。它们不知道你的指定时间戳、分区策略、符号基数,也不知道哪些表的 WAL 应用正在落后。

QuestLLens 解决了这个问题。 它通过模型上下文协议(MCP)将任何 QuestDB 实例连接到 AI 助手,为它们提供 18 个专用工具来发现、理解和查询你的数据——安全、只读模式、零意外写入风险。

这与 QuestDB 内置 MCP 服务器的关系

QuestDB 在 Web 控制台中提供了自己的 MCP 服务器,对于在办公桌前进行交互式工作,它是更好的工具——它支持笔记本、图表、SQL/函数文档查询,以及与你已打开的控制台的双向交接。请在这种情况下使用它。

它解决的问题与 QuestLLens 不同:

QuestDB Web 控制台 MCP

QuestLLens

传输方式

WebSocket,仅限回环

HTTP/SSE,可远程访问

需要实时浏览器会话

是——配对和授权在控制台内完成

否

写入权限

是——在写入权限级别支持 DDL/DML

否——进程内强制只读

远程客户端的认证

控制台会话 / 企业版 SSO

OAuth 2.1 + PKCE,本地使用可无认证

笔记本、图表、文档查询

是

否

分区、WAL、去重、符号、摄取健康度工具

否

是

将领域上下文注入工具描述

否

是

当代理不在你的浏览器旁时,请使用 QuestLLens:无头助手、隧道后面的容器、共享团队端点——或者任何你需要硬性只读保证而非权限设置的地方。

QuestLLens 的独特之处

  • 时间序列原生——与通用 SQL MCP 服务器不同,QuestLLens 使用 QuestDB 的语言。指定时间戳、时间分区、符号容量、去重键和 WAL 状态都是你的 AI 助手可以推理的一等概念。

  • 自带文档说明——自动提取表元数据、列类型、分区、索引和物化视图定义。你的 AI 助手能像你的团队一样理解你的模式。

  • 领域感知——注入一个包含业务上下文的简单 markdown 文件(表含义、常见 SAMPLE BY 模式、注意事项),QuestLLens 会将其编织到每个工具响应中。

  • 非侵入式——通过标准 PostgreSQL 线协议接入任何 QuestDB 实例。无需代理、无需扩展、无需修改 QuestDB 配置。只需一个只读用户。

  • 安全优先——纵深防御:针对 QuestDB 完整 DDL 面调优的 SQL 关键字拦截、语句超时、行数限制,以及可选的带速率限制的 OAuth。你的数据始终安全。


Related MCP server: DB MCP Gateway

快速开始

前置条件

  • Node.js 20+

  • QuestDB 7.4+(任何托管或自管理实例——WAL 表在 7.4 中成为默认)

  • 一个具有 SELECT 权限的 QuestDB 用户(建议只读;请参阅安全)

快速开始(npm)

# Clone and install
git clone https://github.com/DMDuFresne/questllens.git
cd questllens
npm install

# Configure
cp .env.example .env
cp context.md.example context.md
# Edit .env with your QUESTDB_URL

# Build and run
npm run build
npm start

QuestLLens 现在运行在 http://localhost:3000,MCP 端点为 /mcp。

快速开始(Docker)

docker run -p 3000:3000 \
  -e QUESTDB_URL="postgresql://admin:quest@host:8812/qdb" \
  ghcr.io/dmdufresne/questllens:1.0.0

连接到 Claude Desktop

将 QuestLLens 添加到你的 Claude Desktop 配置中:

{
  "mcpServers": {
    "questllens": {
      "url": "http://localhost:3000/mcp"
    }
  }
}

启用 OAuth 后:

{
  "mcpServers": {
    "questllens": {
      "url": "http://localhost:3000/mcp",
      "authorizationUrl": "http://localhost:3000/oauth/authorize",
      "tokenUrl": "http://localhost:3000/oauth/token",
      "registrationUrl": "http://localhost:3000/oauth/register"
    }
  }
}

连接到 Claude Code

{
  "mcpServers": {
    "questllens": {
      "type": "url",
      "url": "http://localhost:3000/mcp"
    }
  }
}

技能

skills/ 捆绑了四个 Claude 技能,用于教会 Claude 如何驱动 QuestLLens,而不是猜测工具名称:

技能

用途

questllens-using

定位技能——只读姿态、改变每次查询的四个时间序列概念(指定时间戳、分区、SYMBOL、WAL)、先发现后工作流,以及路由到其他三个技能。从这里开始。

questllens-explore-a-database

在不熟悉的实例中定位:清单、含义、时间覆盖范围、基数、分区、物化视图图。

questllens-health-check

按优先级排序的摄取扫描:WAL 延迟与陈旧度、挂起表、存储、运行中的查询。

questllens-tune-a-query

suggest_sample_by → explain_query → query 循环、分区裁剪以及 QuestDB 特定的重写。

将 skills/ 下的四个目录复制到你的项目的 .claude/skills/(或你的客户端加载技能的任何位置)即可使用;Claude Code 会根据每个技能 frontmatter 中的触发短语自动显示正确的技能。

工具

QuestLLens 提供 18 个 MCP 工具,分为六个类别。工具首先为 AI 代理设计——markdown 输出以提高 token 密度、解释何时使用每个工具的描述,以及一次往返即可回答问题的复合诊断,而不是三次。

查询

工具

描述

query

执行只读 SQL SELECT 查询。结果以 markdown 表格形式返回,包含行数和截断警告。

explain_query

SELECT 的 QuestDB 执行计划。在慢速 query 之后使用——揭示 SAMPLE BY / LATEST ON / ASOF JOIN 行为和所选连接算法。

suggest_sample_by

根据表、范围和目标桶数推荐 SAMPLE BY 间隔。防止代理在一年数据上选择 1m。

模式发现

工具

描述

list_tables

每张表及其指定时间戳、分区单位、WAL 标志、去重键和列数。物化视图也会在此显示。

describe_table

表或物化视图的一站式描述:列、去重键、分区单位。可选标志可添加时间范围(with_time_range)和每符号列的独立计数(with_symbol_stats)。

search_columns

按名称模式在所有表中查找列。不区分大小写的子字符串匹配。

get_create_table

可往返的 CREATE TABLE(或 CREATE MATERIALIZED VIEW)DDL。在代码中镜像模式或与期望状态进行差异比较时使用。

get_table_params

每表的摄取参数:o3MaxLag、maxUncommittedRows、commitLag、TTL、去重状态。对摄取故障排查至关重要。

refresh_schema

手动强制重新加载模式缓存。通常不需要——describe_table 及相关工具会在缓存未命中时自动刷新。

数据探索

工具

描述

get_sample_data

1–20 行样本数据。传入 latest=true 获取按指定时间戳排序的最新行;传入 columns 在宽表上投影子集;传入 where 添加只读过滤器。

get_table_stats

行数、空值百分比、每列独立计数——批量合并为一条 SQL。在大表上传入 sample_rows——全表扫描可能需要数分钟。

存储与分区

工具

描述

get_partitions

按分区列出,带有 parquet/read-only 标志。传入 from/to 可限定长期保留表,或使用 summary=true 获取汇总(计数、首/末条、原生与 parquet 拆分)。

get_storage_summary

按磁盘占用列出前 N 张表,并显示 parquet 与原生存储的拆分。单次调用即可发现磁盘热点,无需对每张表逐一执行 get_partitions。

操作

工具

描述

get_wal_status

每张表的 WAL 应用状态:sequencer 事务、writer 事务、延迟、暂停标志。

get_ingestion_health

综合摄入健康检查:WAL 延迟 + 暂停状态 + 最新时间戳滞后,一次调用完成。排查“数据为何未到达?”的首选工具。

get_running_queries

通过 query_activity() 查看当前正在执行的查询。可选 min_duration_ms 过滤条件。用于“系统感觉变慢”时的排查。

get_mv_dependencies

物化视图依赖关系图,支持反向查询(“哪些视图依赖表 X?”)。可深入查看单个视图的 SQL 定义。需要 QuestDB 8.x。

服务器

工具

描述

server_info

版本、构建信息、运行时长,以及对 materialized_views() 和 query_activity() 的功能检测。在会话早期调用——它能让代理无需反复试错即可知道哪些可选功能可用。


配置

QuestLLens 通过环境变量进行配置。可以创建 .env 文件,也可以直接传入。

必需项

变量

描述

示例

QUESTDB_URL

QuestDB 连接字符串(PostgreSQL 线协议)

postgresql://admin:quest@host:8812/qdb

QuestDB 默认的 PG-wire 凭据是 admin / quest,端口为 8812。请修改默认凭据,并创建一个只读用户——参见安全。

可选项

变量

默认值

描述

MCP_PORT

3000

HTTP 服务器端口

QUERY_TIMEOUT_MS

30000

单次查询最大执行时间(毫秒)

MAX_ROWS

1000

单次查询返回的最大行数

SCHEMA_REFRESH_INTERVAL_MS

300000

模式缓存刷新间隔(毫秒)

DOMAIN_CONTEXT_FILE

—

包含业务上下文的 Markdown 文件路径

DOMAIN_CONTEXT

—

内联业务上下文字符串(替代文件)

OAuth 选项(使用 --oauth 运行时)

变量

默认值

描述

MCP_AUTH_PASSWORD

—

OAuth 登录表单密码

EXTERNAL_BASE_URL

http://localhost:3000

公网 URL(用于反向代理场景)

MCP_ALLOWED_ORIGINS

空 — 允许所有来源

浏览器来源的 CORS 白名单(逗号分隔,例如 https://claude.ai)。为空或 * 时允许任何来源;启用 --oauth 时,工具路由仍要求 Bearer 令牌。原生 MCP 客户端发送 Origin: null,始终被允许,因此通常无需配置此项。

MCP_OAUTH_TOKEN_EXPIRES_IN

604800

令牌有效期(秒,默认 7 天)

MCP_RATE_LIMIT_ATTEMPTS

5

每个时间窗口内允许的最大登录尝试次数

MCP_RATE_LIMIT_WINDOW_MS

900000

限流时间窗口(毫秒,默认 15 分钟)

TRUST_PROXY_HEADERS

false

是否从 X-Forwarded-For 获取客户端 IP,以便限流器统计真实客户端而非代理地址。仅当代理是访问此服务器的唯一入口时设为 true——否则该头可被伪造。


Docker

拉取镜像

docker pull ghcr.io/dmdufresne/questllens:1.0.0

构建镜像

docker build -t questllens .

运行容器

# Without OAuth (local development, trusted networks)
docker run -p 3000:3000 \
  -e QUESTDB_URL="postgresql://readonly:password@host:8812/qdb" \
  questllens

# With OAuth (production, Claude Desktop)
docker run -p 3000:3000 \
  -e QUESTDB_URL="postgresql://readonly:password@host:8812/qdb" \
  -e MCP_AUTH_PASSWORD="your-secure-password" \
  questllens node dist/index.js --oauth

# With custom domain context
docker run -p 3000:3000 \
  -e QUESTDB_URL="postgresql://readonly:password@host:8812/qdb" \
  -v ./my-context.md:/app/context.md \
  -e DOMAIN_CONTEXT_FILE="context.md" \
  questllens

Docker Compose

services:
  questllens:
    image: ghcr.io/dmdufresne/questllens:1.0.0
    ports:
      - "3000:3000"
    environment:
      QUESTDB_URL: postgresql://readonly:password@questdb:8812/qdb
      MAX_ROWS: 500
    volumes:
      - ./context.md:/app/context.md
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    restart: unless-stopped

镜像详情

  • 基础镜像: node:20-alpine(多阶段构建)

  • 大小: 约 80MB

  • 用户: 非 root(nodejs:1001)

  • 健康检查: 内置,通过 /health 端点


安全

漏洞报告方式及范围界定,请参阅 SECURITY.md。简要说明:只读保证和 OAuth 流程在范围内;任何通过合法授予的只读访问可触及的内容均不在范围内——请使用最小权限的数据库角色。

QuestLLens 设计为只读,并采用纵深防御。应用层不足以单独保障安全——只读数据库角色和网络隔离是必需的,而非可选项。以下各节描述每一层防护。

必需项:只读数据库角色

QuestDB 不支持 PostgreSQL 的 BEGIN READ ONLY。数据库是唯一可强制执行的写入屏障。请使用只读用户运行 QuestLLens:

QuestDB 企业版(基于用户的 RBAC):

CREATE USER questllens_readonly WITH PASSWORD 'your-secure-password';
GRANT SELECT ON ALL TABLES TO questllens_readonly;

QuestDB 开源版(尚无基于用户的 RBAC):

OSS 缺乏基于用户的 RBAC,因此应用层无法完全隔离写入操作。必须采取以下缓解措施:

  1. 立即更改默认的 admin/quest 凭据。

  2. 对 PG-wire 端口(8812)进行网络隔离,确保只有 QuestLLens 可以访问。不要将其暴露给运维工作站或其他服务。

  3. 在 OAuth(--oauth)后面运行 QuestLLens,使 MCP 客户端在应用层也受到访问控制。

如果无法满足第 (1) 和 (2) 条,请不要针对生产环境的 OSS 实例运行 QuestLLens。

应用层只读路径(纵深防御)

每条用户提供的 SQL 语句都会经过一个真正的分词器处理(能正确处理 '…' 中的转义 ''、$tag$…$tag$、-- 注释、/* */ 注释),并接受以下检查:

  • 首动词白名单 —— 仅接受 SELECT、WITH、EXPLAIN、SHOW 或 TABLES。

  • 多语句拒绝 —— 分号 ; 之后的任何内容都会被拒绝。PG-wire 简单查询路径可以执行多条语句;安全检查使其无法触达。

  • 对分词后输入进行禁用关键词扫描 —— INSERT · UPDATE · DELETE · DROP · CREATE · ALTER · TRUNCATE · RENAME · REINDEX · VACUUM · BACKUP · SNAPSHOT · COPY · ATTACH · DETACH · GRANT · REVOKE · SET · RESET · RESUME · SUSPEND · CHECKPOINT · CANCEL · KILL · SQUASH · CONVERT · DEDUP · REFRESH · CALL · EXECUTE · PREPARE · DEALLOCATE。由于输入经过分词处理,WHERE message LIKE '%DROP%' 不会触发扫描。

内部内省查询(tables()、wal_tables()、SHOW CREATE TABLE 等)通过数据库客户端中的显式 internal: true 标志绕过安全检查。每个内部调用点都是审计点;用户输入永远不会到达该路径。

语句超时

每次从连接池取出连接时都会重新应用 statement_timeout(QuestDB 没有 SET LOCAL),因此之前的内部调用不会在池化连接上留下过期的超时值。默认 30 秒。

行数限制

结果被限制在可配置的最大值(默认:1,000 行),超出时会给出截断警告。

OAuth(启用 --oauth 时)

使用 --oauth 运行时,QuestLLens 提供:

  • RFC 7591 动态客户端注册

  • PKCE S256 — 当客户端发送 code_challenge 时必填;在令牌端点使用常量时间比较来校验 code_verifier

  • 授权码绑定 — 授权码与其 client_id 和 redirect_uri 绑定;兑换时不匹配则拒绝

  • 重定向 URI 校验 — 仅接受已注册的 URI;scheme 限制为 https(开发环境可为 http://localhost/127.0.0.1)

  • CORS 白名单 — MCP_ALLOWED_ORIGINS(逗号分隔)指定哪些浏览器来源可以调用服务器。留空则允许任何来源,这在此处是安全的,因为每个工具路由都要求 Bearer 令牌而非 cookie——跨源页面没有隐式凭据可用。当您希望限制浏览器来源时请设置此项

  • 密码限流 — 默认每 15 分钟最多 5 次尝试

  • 常量时间密码比较 — 防止时序攻击

  • Bearer 令牌校验 — 在所有 MCP 端点上执行;过期的令牌会从内存存储中移除

  • 自包含同意页面 — 登录页面不加载任何第三方字体、脚本或资源,因此认证提示绝不会向 CDN 泄露请求

  • 安全响应头 — 每个响应均包含 Content-Security-Policy: default-src 'none'(仅内联样式、frame-ancestors 'none'、base-uri 'none'),以及 X-Content-Type-Options、X-Frame-Options: DENY、Referrer-Policy: no-referrer 和 Cross-Origin-Opener-Policy。无 form-action:同意表单的 302 跳转指向客户端已注册的 redirect_uri,对于原生客户端而言是回环端口——这是浏览器在 form-action 'self' 下会阻止的不同来源。因此重定向目标改为在服务端根据客户端已注册的 URI 进行约束

  • 1 MB 请求体上限 — 同时适用于 JSON 和表单编码的请求体

令牌和授权码仅保存在内存中;服务器重启后即失效。若需要跨重启的长期会话,请自行持久化存储。

位于代理或隧道之后时: 请设置 TRUST_PROXY_HEADERS=true,否则限流器会将所有请求视为来自代理的单一地址,一个攻击者的失败登录就会锁定所有客户端。仅当该代理是访问服务器的唯一途径时才应开启此选项。


领域上下文

这是 QuestLLens 的秘密武器。模式 introspection 让 AI 知道您的表长什么样,而领域上下文则告诉它这些表意味着什么——对于时序数据,还指导它如何高效查询。

工作原理

复制模板并描述您数据库的业务逻辑,然后让 QuestLLens 指向它:

cp context.md.example context.md

context.md 已被 gitignore——它存放您专有的领域知识,绝不会被提交到版本库。

# Via environment variable
DOMAIN_CONTEXT_FILE=context.md

# Or inline
DOMAIN_CONTEXT="This database stores sensor telemetry from industrial PLCs. Use SAMPLE BY for downsampled queries; never SELECT * across more than 1 hour of raw data."

QuestLLens 会将这些上下文注入工具描述中,因此您的 AI 助手从第一次交互起就能理解您的业务领域。

示例 context.md

# Industrial Telemetry Database

## Key Concepts
- Every table is partitioned by **DAY** with designated timestamp `ts`
- The `device_id` column is a SYMBOL — always filter on it before time ranges
- We use `LATEST ON ts PARTITION BY device_id` to get the most recent reading per device
- Hot data lives in the last 7 days; older partitions are detached to cold storage

## Common Queries
- 1-minute downsample: `SELECT ts, avg(value) FROM readings SAMPLE BY 1m`
- Latest per device: `SELECT * FROM readings LATEST ON ts PARTITION BY device_id`
- Aligned multi-sensor: `ASOF JOIN` on `ts`

## Gotchas
- The `value` column is in raw ADC counts, not engineering units — multiply by `scale` from `device_config`
- `ts` is always UTC; the device-local time is in `local_ts`
- Never run `SELECT *` on the `raw_packets` table — it's billions of rows

哪些内容会被增强

领域上下文会被编织进:

  • query 工具描述(让 AI 写出更好的 SQL)

  • get_partitions 和 describe_table --with_time_range 的结果(让 AI 理解数据生命周期)

  • describe_table --with_symbol_stats 的输出(让 AI 尊重基数约束)

  • 模式发现响应(让 AI 提出更好的后续问题)


API 参考

健康检查

GET /health

返回服务器状态和版本:

{
  "status": "healthy",
  "server": "questllens",
  "version": "1.0.0"
}

MCP 端点

POST /mcp          → JSON-RPC 2.0 request
GET  /mcp          → Server-Sent Events (SSE) stream
DELETE /mcp        → Session termination

所有 MCP 通信均使用 Streamable HTTP Transport,并通过 mcp-session-id 头进行会话管理。

OAuth 端点(启用 --oauth 时)

GET  /.well-known/oauth-protected-resource  → Resource metadata
GET  /.well-known/oauth-authorization-server → Server metadata
POST /oauth/register                         → Dynamic client registration
GET  /oauth/authorize                        → Login form
POST /oauth/authorize                        → Authenticate
POST /oauth/token                            → Token exchange

开发

# Install dependencies
npm install

# Run in dev mode (hot reload)
npm run dev

# Run with OAuth in dev mode
npm run dev:oauth

# Type check
npm run typecheck

# Run tests (read-only SQL boundary, config validation, identifier quoting)
npm test

# Build for production
npm run build

项目结构

src/
├── index.ts                       # Entry point
├── config.ts                      # Environment config with Zod validation
├── server.ts                      # Express + MCP server, OAuth, session management
├── database/
│   ├── client.ts                  # PG-wire connection pool, query execution
│   ├── schema-loader.ts           # QuestDB introspection + cache (auto-refresh on miss)
│   └── sql-safety.ts              # Lexer + allowlist enforcing the read-only path
├── tools/
│   ├── index.ts                   # Executor re-exports
│   ├── _util.ts                   # Shared identifier quoting
│   ├── query.ts                   # Execute SELECT queries (markdown output)
│   ├── explain-query.ts           # QuestDB EXPLAIN
│   ├── suggest-sample-by.ts       # Pick a SAMPLE BY interval for a target bucket count
│   ├── list-tables.ts             # Tables with TS / partitioning / WAL flags
│   ├── describe-table.ts          # Table or MV detail (with optional time range / symbol stats)
│   ├── search-columns.ts          # Cross-table column search
│   ├── get-create-table.ts        # Round-trippable CREATE TABLE / CREATE MATERIALIZED VIEW
│   ├── get-table-params.ts        # Per-table ingestion knobs (o3MaxLag, maxUncommittedRows, ttl)
│   ├── refresh-schema.ts          # Manual cache reload (auto-refresh on miss is the default)
│   ├── get-partitions.ts          # Partition list with from/to filter and summary mode
│   ├── get-storage-summary.ts     # Top-N tables by disk (parquet vs native)
│   ├── get-sample-data.ts         # Sample rows with optional columns/where projection
│   ├── get-table-stats.ts         # Per-column null % + distinct (single batched SQL)
│   ├── get-wal-status.ts          # WAL apply state, lag, suspended tables
│   ├── get-ingestion-health.ts    # Composite WAL lag + latest-row staleness diagnostic
│   ├── get-running-queries.ts     # query_activity() wrapper
│   ├── get-mv-dependencies.ts     # Materialized view graph (forward + reverse)
│   └── server-info.ts             # Version, build, feature detection
├── descriptions/
│   ├── generator.ts               # Dynamic description builder
│   └── static.ts                  # Static description blocks
├── types/
│   └── index.ts                   # TypeScript interfaces
└── ...

tests/
├── sql-safety.test.ts             # Read-only boundary: verbs, literals, injection shapes
├── config.test.ts                 # Env parsing, limits, domain-context loading
└── identifiers.test.ts            # quoteIdent breakout attempts

skills/                            # Claude skills — copy into .claude/skills/
├── questllens-using/
├── questllens-explore-a-database/
├── questllens-health-check/
└── questllens-tune-a-query/

CI 在 Node 20 和 22 上运行类型检查、测试和构建,然后构建镜像并针对真实的 QuestDB 容器验证只读边界仍然有效(参见 .github/workflows/ci.yml)。


使用场景

使用场景

QuestLLens 如何提供帮助

AI 驱动的时序分析

让 Claude 针对您的实时数据编写 SAMPLE BY、LATEST ON 和 ASOF JOIN 查询——安全地以只读模式运行。先使用 suggest_sample_by,让代理选择合理的桶大小。

容量规划

组合使用 get_storage_summary、get_partitions --summary 和 describe_table --with_symbol_stats,一次调用即可识别热分区、符号容量不足和磁盘占用过大的表。

时序数据入门

让 AI 借助领域上下文理解 QuestDB,并解释“此表的 designated timestamp 是什么意思?”或“此查询为什么慢?”。server_info 会告知代理可用的功能特性。

查询优化

使用 explain_query 配合 describe_table --with_symbol_stats,发现缺失的索引、容量不足的符号列和低效的时间谓词。当“系统感觉变慢”时,使用 get_running_queries 定位问题。

数据摄入故障排查

get_ingestion_health 一次调用即可综合查看 WAL 延迟、暂停状态和最新数据延迟。配合 get_table_params(o3Lag、maxUncommittedRows)诊断写入卡顿问题。

数据保留审计

使用 get_partitions(配合 from/to 过滤器)和 describe_table --with_time_range,确认保留策略正在生效,且已分离/parquet 分区符合预期计划。

模式可移植性

get_create_table 返回可往返的 DDL——非常适合在代码中镜像模式、对比期望状态,或快速搭建同构环境。


兼容性

QuestLLens 可与任何兼容 MCP 的客户端配合使用:

  • Claude Desktop(支持或不支持 OAuth)

  • Claude Code(CLI)

  • Cursor / Windsurf / VS Code(通过 MCP 扩展)

  • 自定义 MCP 客户端(任何实现 MCP 规范的客户端)

以及任何 QuestDB 部署方式:

  • QuestDB 开源版 7.4+

  • QuestDB 企业版(推荐——支持按用户 RBAC)

  • QuestDB 云服务

  • 自托管 Docker、Kubernetes 或裸机

get_mv_dependencies 以及 describe_table / get_create_table 的物化视图分支需要 QuestDB 8.x。get_running_queries 需要支持 query_activity() 的 QuestDB 版本。运行 server_info 可查看所连接实例支持的功能。所有其他工具兼容 7.4+。


故障排查

端口 8812 上出现“连接被拒绝”

QuestLLens 通过 PostgreSQL wire 协议连接端口 8812,而非 HTTP API 的 9000。请确保 PG-wire 监听器已启用(server.conf 中的 pg.enabled=true)且可访问。

模式 introspection 时出现“权限被拒绝”

QuestLLens 使用 QuestDB 的系统函数(tables()、table_columns()、wal_tables()、table_partitions()、materialized_views())。在 QuestDB 开源版中,任何已认证用户均可使用这些函数。在 QuestDB 企业版中,请确保您的角色已被授予必要的读取权限:

GRANT SELECT ON ALL TABLES TO questllens_readonly;

get_mv_dependencies 返回空结果

物化视图需要 QuestDB 8.x。如果您使用的是 7.x,此工具将返回空结果并附带提示——请升级到 8.0+ 以使用 MV。

get_wal_status 显示“WAL not enabled”

WAL 表自 QuestDB 7.4 起成为默认类型。在更早版本上创建的表可能仍为非 WAL 表;它们会出现在 list_tables 中且 wal_enabled = false,并且不会包含在 get_wal_status 的结果中。

模式变更未反映

QuestLLens 会缓存模式元数据。您可以等待下一个刷新周期(默认:5 分钟),或调用 refresh_schema 立即更新 MCP 缓存。

OAuth 登录失败

请检查 MCP_AUTH_PASSWORD 是否已设置,以及限流器是否已触发(默认每 15 分钟 5 次尝试)。查看服务器日志以获取详细信息。


许可证

Apache-2.0。可自由使用、修改和分发,需注明出处;包含明确的专利授权。条款详见 LICENSE,第三方依赖许可证、QuestDB 商标免责声明以及 Abelara 品牌资产例外条款详见 NOTICE——徽标和品牌 artwork 不受 Apache-2.0 保护。

按“现状”提供,不附带任何形式的担保——使用风险自负。

由 Abelara 构建

QuestLLens 是 Abelara 工业 AI 与边缘计算工具集的一部分,与面向 PostgreSQL 的 PgLLens 并肩协作。

报告 Bug · 请求功能 · 了解更多

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to databases for MCP-compatible AI tools, allowing schema exploration and SELECT queries without exposing credentials or risking data changes.
    145 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to PostgreSQL databases via MCP, enforcing least-privilege roles, row-level security, masked views, and SQL AST guardrails to prevent data leakage and unauthorized operations, enabling AI agents to safely query sensitive production data.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides governed, read-only PostgreSQL access for AI agents via MCP. Enforces schema/table allowlists, query limits, and audit events.
    MIT