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: django-mcp-sql

快速开始

前置条件

  • 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_byexplain_queryquery 循环、分区裁剪以及 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

每表的摄取参数:o3MaxLagmaxUncommittedRowscommitLag、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$-- 注释、/* */ 注释),并接受以下检查:

  • 首动词白名单 —— 仅接受 SELECTWITHEXPLAINSHOWTABLES

  • 多语句拒绝 —— 分号 ; 之后的任何内容都会被拒绝。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_idredirect_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-OptionsX-Frame-Options: DENYReferrer-Policy: no-referrerCross-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_partitionsdescribe_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 BYLATEST ONASOF JOIN 查询——安全地以只读模式运行。先使用 suggest_sample_by,让代理选择合理的桶大小。

容量规划

组合使用 get_storage_summaryget_partitions --summarydescribe_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 · 请求功能 · 了解更多

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides a read-only PostgreSQL SQL surface for LLM agents via MCP, with defense-in-depth security layers for safe database queries.
    3
    MIT
  • 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.
    51
    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

View all related MCP servers

Related MCP Connectors

  • Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.

  • Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.

  • Read-only Dant3 MCP for public rooms, agents, jobs and provisional machine onboarding.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DMDuFresne/questllens'

If you have feedback or need assistance with the MCP directory API, please join our Discord server