Skip to main content
Glama
panopticon

panopticon

by nocitponap

panopticon-mcp

一个基于 MCP 的服务器,架设在一个设计与创意社区的档案库上:覆盖 567,665 个主题、共 3,916,116 条回复,2,972,803 条备注和 42,796 张首页快照,每五分钟刷新一次。档案自 2001 年开始;回复自 2002 年开始。它能回答像 "过去一周哪位用户最活跃?" 这样的问题——而这正是整个系统的核心问题。

本仓库公开是为了让代码可以被阅读。阅读代码并不是使用服务器的先决条件:已部署的实例只接受一个粘贴到设置界面的地址,这一部分排在下面最前面。『The code』之后的全部内容,都是为审计代码或运行你自己的副本而准备的。

数字于 2026-08-25 测得。它们会随帖子被删除而变动;qbn_overview 返回实时数据。


地址

https://mcp.nocitponap.com/mcp

你无需安装任何东西,也不需要具备编程能力。在浏览器中打开该地址,服务器会返回一个安装页面,地址已填写完成,并且带有一个复制按钮。/mcp 路径本身向浏览器返回 Method not allowed,因为它是写给助手而不是给人看的。页面上会这样说明。一切正常。

助手本来就可以通过浏览实时站点来读取内容,但它看到的只是网页所展示的东西:最近几页内容、没有可靠日期、也没有可统计的数据。接入本服务器之后,它可以读取底层档案库,这正是它回答“本周谁最活跃”、“某个主题十年间如何发展”、“现在社区与 2005 年相比有多热闹”这些问题的方式。

Related MCP server: MyMem

Claude Desktop,或浏览器中的 Claude

  1. 打开 Settings。桌面版:Windows 上按 Ctrl+,,Mac 上按 ⌘,。浏览器:Mac 上按 ⌘⇧,,或点击你的头像图标并选择 Settings。

  2. 点击侧边栏中的 Connectors,然后点击右上角的 Add,再点击 Add custom connector。

  3. 粘贴上面的地址,然后点击 Add。没有登录步骤;档案库是公开且只读的。

  4. 开始新对话,并询问 "Catch me up on the archive"。工具首次运行时,允许权限提示。

如果看起来没有生效,请点击消息框左下角的 / 或回形针图标,查看 Connectors 一项。"This should list" Panopticon" 应连同一些问题建议一起列出。如果不在,请打开 Settings → Connectors,查看它是否显示为已连接。

任何支持 MCP 连接器的助手都使用同一个地址。菜单名称各不相同;去找 "connectors" 或 "custom integrations"。

Claude Code

一条命令:

claude mcp add --transport http panopticon https://mcp.nocitponap.com/mcp

然后在 Claude Code 中输入 /mcp 确认它已连接。

可问的问题

服务器内置五个问题。点击消息框中的 /,然后选择 Connectors。

问题

它的作用

Catch me up on the archive

活动、谁在发帖、热门帖子、首页

Who is most active?

在你指定的任意时间区间内排名

Tell me about a user

TA 的历史与发帖内容

Summarise a thread

主题是关于什么的,以及它是如何发展起来的

How has the community changed?

自 2001 年以来的完整轨迹

或者用你自己的话提问:

  • 上周谁发帖最多?

  • 档案库中最大的主题是哪些?

  • [username] 是什么时候加入的,发的内容是什么?

  • 现在的社区与 2005 年相比有多热闹?

  • 今天早上首页上有什么?

  • 这最近几天创建的新用户。很适合用来识别垃圾信息。

  • 那条回复在首页停留了多久?


隐私

档案库中存的是直播网站上本来就公开的内容。它是只读的:你或助手通过它进行的任何操作都不会去发布、编辑或删除任何东西。不需要登录账号,也不会保存任何与你的有关的信息。


代码

阅读这一部分是为了审计服务器,或者运行你自己的副本。

SQL 在哪里

这里不包含 SQL。 所有查询都在 panopticon-core 中,与 panopticon-api 共享。src/tools.js 里的工具负责整理参数并转发。验证、截断和 SQL 都在 core 中,这样 MCP 服务器与 HTTP API 对同一个问题不会给出相互矛盾的答复。

旧版把同样的查询保存在三个位置:一个 Node API、一个 PHP 移植版,以及 MCP 工具。它们逐渐彼此偏离,每一次修复都要改三遍。PHP 移植版已不再使用。

核心依赖

package.json 把 panopticon-core 声明为 file:../panopticon-core,npm 会把它解析为符号链接,而不是复制。它假定各仓库作为同级目录位于同一个父目录下,这正是它运行的机器上的目录布局。编辑 core 在这里会立即生效,而不需要重新安装,这正是这种安排的用意所在。

core 发布在 nocitponap/panopticon-core,因此 SQL 可以这份代码对照阅读。单独克隆本仓库没有任何可链接的目标,npm install 会在这里失败。阅读代码不需要安装;运行服务器则需要把 core 克隆到它的旁边。

服务器说明与提示词

有两样东西是为使用者而存在的,而不是为协议存在的。

  • src/instructions.js 在 initialize 阶段被发送,并在任何工具运行之前进入模型上下文。它说明了档案库、其词汇(reply、note、newsthread 之间的区别),以及这里的哪些数字是真实数据、哪些不是,这样模型会诚实报告限制,而不是强行绕开。

  • src/prompts.js 注册了上面列出的五个提示问题。客户端会把它们显示在菜单中,这是看到 18 个工具和看到零散的六件可做的事之间的区别。

工具

十八个工具,按要回答的问题命名,而不是按表名命名。旧版本暴露了 17 个工具,与 REST 端点一一对应(list_replies、get_reply、topics_by_post_count),选择哪个工具就得先弄清表结构。

从这里开始

  • qbn_overview — 一个调用里的档案库全貌:今日、7 天和 30 天的活跃度、本周最活跃的用户、最牢固的主题,以及当前首页。

  • most_active_users — 按任意时窗内的回复、发起的主题、备注或积分东西排名。这是设计核心。

  • user_profile — 单个用户:资料、累计次数、最近动态。

  • find_user — 通过 @handle 或姓名搜索,两者不同:defineipr 是 "Define IPR"。

  • user_activity_over_time — 单个用户的天/月/年粒度动态。

  • user_replies、user_notes — 一个用户所有的回复与备。

内容

  • search_replies、get_reply — 回复附带自己的备注内容。

  • busiest_topics、search_topics、read_thread。

  • list_notes、list_profiles、list_newsthread。

首页

  • front_page — 现在的,或过往某一天的样子。

  • front_page_history — 一个窗口内的快照,或某一条回复在首页的完整亮相记录:什么时候出现、它的最佳表现、停留了葡人。

整个

  • site_activity_over_time — 在整个档案库上,按天、月、年给出回复数、活跃用户数、新主题和新资料数。

qbn_overview 这个名字被保留,因为它是客户端已按它配置好的协议接口。改签名会破坏那些客户端。

项目布局

There are placeholders for project directory/代码块——download.

src/
  index.js            entry point; picks transport
  server.js           builds the McpServer
  tools.js            every tool definition
  instructions.js     the initialize-time briefing
  prompts.js          five starter questions
  landing.js          the install page, generated from the live registries
  guard.js            Host allowlist
  lib.js              result helpers and shared zod fragments
  transports/
    stdio.js          stdio transport
    http.js           Express and Streamable HTTP transport

安裝页面会计算自身文档的命令和工具,统计方式是向注册表注入一个自己“记录但不注册”的桩,所以它不会显示一个服务器并未暴露的工具。旧版有一个手工维护的表格就是这样做的,宣称有 22 个工具,实际只有 18 个,它已于 2026-08-22 被删除,而不是被修复。


要求

  • Node.js 20 或更高版本

  • 按 sibling 目录放置的 panopticon-core 克隆

  • 可访问档案库的本地镜像,而绝不能访问远程权威数据中心

配置

cp .env.example .env

变量

用途

默认值

DB_HOST

MySQL 主机

无

DB_USER

MySQL 用户

无

DB_PASSWORD

MySQL 密码

无

DB_DATABASE

MySQL 数据库名

无

MCP_TRANSPORT

stdio 或 http

stdio

PORT

HTTP 端口,仅 HTTP 传输时生效

3002

PUBLIC_ORIGIN

安装页发出去的地址,同时也是需要接受的 Host 头

无

传输方式

stdio(默认)

npm start

通过 stdin 和 stdout 说话 MCP。这是本地 MCP 客户端直接远端执行的进程。

HTTP

npm run start:http        # or MCP_TRANSPORT=http npm start

在 http://127.0.0.1:3002/mcp 上监听 POST。每个请求都是无状态的:服务端为每个请求构建一个新的 MCP 实例,对于这里暴露的只读工具来说是安全的。它只绑定回环接口,对外访问应通过隧道或 reversed proxy 到达,而不是让进程监听每个网络接口。

服务器只校验 Host 头部,因此 PUBLIC_ORIGIN 和 ALLOWED_HOSTS 必须把客户端实际会使用的每个地址都列出来。

npm run dev               # node --watch

冒烟测试

curl -s -X POST http://127.0.0.1:3002/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
event: message
data: {"result":{"tools":[{"name":"qbn_overview","title":"Archive overview",
"description":"The current state of the community in one call: reply/user/topic
counts for today, the last 7 days and the last 30 days, ...

本地 stdio 客户端

{
  "mcpServers": {
    "panopticon": {
      "command": "node",
      "args": ["/absolute/path/to/panopticon-mcp/src/index.js"],
      "env": {
        "DB_HOST": "127.0.0.1",
        "DB_USER": "your_database_user",
        "DB_PASSWORD": "your_database_password",
        "DB_DATABASE": "your_database_name"
      }
    }
  }
}

当 .env 已填写时,上面的 env 配置块可以省略;服务器启动时会加载 .env。执行 npm link 可以安装 panopticon-mcp 二进制,之后客户端中的启动条件就变成 "command": "panopticon-mcp", "args": []。


不能告诉你什么

服务器不会回答它无法如实回答的问题,而是会明确拒绝,而不是返回一个看似合理的数字。那些拒绝是正确的,不应该换一种方式重试。相关助手会说出这一点,而这一点看起来会像是出现了问题。

  • 注释没有自己的时间戳。 数据源从未公开注释是在何时写入的。注释携带的唯一时间是 observed_at——爬虫看到它时的时间;而 2,972,803 条注释中,有 2,809,581 条没有这个时间——它们是从一个旧列恢复的,该列只记录了注释本身,却没有记录它被读取的时刻。因此,注释的覆盖范围能涵盖整个存档,而注释随时间的活跃情况则不能。对于某个主题或某位用户的注释计数,在整个历史中都是可靠的;而按天计算注释的数量,则只有从注释纪元 2024-04-24 起才是真实的,统计到 163,344 条注释在到达时被看到,其中 83,958 条共享 2024-04-23 同一次批量导入的同一瞬间。纪元之前的滑动窗口注释排名一律不被采纳。这条限制没有绕行的路;时间戳数据从未被记录。

    修订于 2026-08-25。 此前表述为“注释时间戳即抓取时间,覆盖 2024 年以来的 163,268 条”。2026-08-22 的 blob 回填将注释覆盖范围带回了 2002 年,于是把原来的单一说法拆成了上文“覆盖范围”与“活跃情况”两半。

  • 旧存档没有捕获注释的标记。 2,874,005 条注释有文本而无 HTML,html_comment 对它们报告 null。这些标记只存在于现役网站上。

  • 注释的位置是注释首次被看到时所在的位置,而非现在的位置。从现役网站删除的注释仍会保留,因为它们在别处都不存在,因此一条回复所保留的注释数量可能多于现役网站所展示的数量。

  • 已删除的内容不可见。 251,122 条回复和 145,414 个主题已是墓碑:ID 存在,正文为空,内容已消失。它们在任何统计中都被排除在外。因此 ID 有缺口。缺少的 ID 表示已被删除,而非缺少或者并非缺失数据。正文从未被捕获,所以这一点同样无法绕行。

  • 2024 年之前的主题时间可能晚一小。 在 2024 年之前,数据源一是不以任何夏令时为准,而文章在每个主题盖上 -0800。同一主题内回复的时间不受影响,是更精确的信号,请以它们为准。

  • 回复正文不可搜索。 主题标题可以。search_replies 按用户、主题、日期和分数过滤,而不按帖子的文本。

  • 分数是一个净数字。 赞成票和反对票不分别存储,因此一个得分为 0 的回复和一个 +40 减 40 的回复是同一行。

其余内容自 2001 年以来都是完整的:回复、主题、注释、个人资料与首页历史。


许可协议

MIT。版权所有 (c) 2026 Anthony Lazaro。参见 LICENSE。

本许可只覆盖这段代码,并非图形档案馆。那些帖子被没有某一个社区成员打算从未为其选过许可的社区作者写下的,且本仓库对其不主张任何权利。

选择 MIT 而不是更有强制力的协议的原因:它发布出来是让人读、让人复制、并且让人去尝试。如果它使你看到想在自己所在网页的一角搭建自己的仪器,那就把它带走,把这里你觉得有用的都拿走,去做就是了——无须任何许可。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with read-only access to Reddit's API for browsing subreddits, reading posts and comments, searching Reddit, and retrieving user/subreddit information. Enables safe exploration of Reddit content without posting capabilities through natural language interactions.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes a private social memory archive to AI assistants via MCP, enabling read-only queries about the user's posts, people, and preferences with tools like search, whoami, and timeline.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to query your archived AI coding usage through read-only tools for usage summaries, project breakdowns, daily trends, and archive health.
    5 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to perform read-only Reddit research, including discovering relevant subreddits, ranking threads by real discussion volume, and returning verbatim quotes with permalinks.
    12
    4 npm
    MIT