关于 Benchline
Benchline 是面向软件开发及相关任务的浏览器工具目录,涵盖数据、文档、SEO 和安全等领域。工具以纯函数形式同时提供网页界面和无状态 HTTP MCP 服务,无需 API 密钥。
主要功能
- 01可搜索的工具目录及分类标签
- 02代码与数据格式浏览器工具
- 03PDF、图像和音频处理
- 04SEO、爬虫与元数据检查
- 05安全、加密与网络工具
- 06无状态 HTTP MCP 和 HTTP API
适用场景
- 01格式化或校验 JSON 并转换数据
- 02在浏览器中编辑或转换 PDF 和图像
- 03检查公开网页的 SEO 与爬虫设置
- 04检查响应头、令牌或 DNS 记录
MCP 相关
Benchline 通过 /mcp 提供无状态 Streamable HTTP MCP 服务。无需 API 密钥或会话;除读取公开 URL 的任务外,工具输入均保留在设备上。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://benchline.fabwaseem.com/mcpclaude mcp add --transport http fabwaseem-benchline https://benchline.fabwaseem.com/mcp{"mcpServers":{"fabwaseem-benchline":{"type":"http","url":"https://benchline.fabwaseem.com/mcp"}}}在 Cursor 中打开{"servers":{"fabwaseem-benchline":{"type":"http","url":"https://benchline.fabwaseem.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"fabwaseem-benchline":{"type":"http","url":"https://benchline.fabwaseem.com/mcp"}}}{"mcpServers":{"fabwaseem-benchline":{"serverUrl":"https://benchline.fabwaseem.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
Benchline
Benchline 是一个免费的浏览器工具目录,专为软件发布过程中那些小而精确的任务打造:JSON、PDF、图像、令牌、标头,以及爬虫可以引用的文件。每个工具都是纯函数,在网站上有对应页面,也可通过无状态 MCP 服务调用同一函数。除非工具的用途是读取公开 URL,否则工具输入都会保留在设备上。配置 Postgres 后,网站可以存储匿名使用次数;请参阅“隐私”。
在线体验: https://benchline.fabwaseem.com
截图
![]() | ![]() |
![]() | ![]() |
目录是首页。JSON 格式化工具是其中一个工具页面(/t/json-formatter)。
功能
- 可搜索的目录,提供分类、标签和 ⌘K 命令面板。筛选在浏览器中运行。
- 每个工具独立存放在一个文件夹中:包含元数据、客户端页面和由 vitest 覆盖测试的纯
lib/。 - 位于
/mcp的无状态 Streamable HTTP MCP 服务。无需 API 密钥,也无需会话。 - 通过
POST /api/v1/tools/<slug>使用相同的 HTTP 函数,并在/openapi.json提供 OpenAPI 文档。 /llms.txt和/llms-full.txt均根据注册表生成。- 支持浅色和深色主题。圆角保持在较小的令牌范围内。
工具
toolOrder 中的所有工具。添加工具后运行 pnpm gen:readme-tools。
开发者
构建文件、日程安排,以及部署所依赖的小型程序。
Cron。 构建 cron 表达式并查看后续运行时间。
- Cron 表达式构建器 — 构建或粘贴 cron 日程安排,以通俗易懂的语言查看其含义,并查看后续运行时间。
Next.js。 用于在容器中发布 Next.js 应用的生产文件。
- Next.js Dockerfile 生成器 — 为 Next.js 生成生产环境多阶段 Dockerfile,并生成 .dockerignore 和 compose 文件。
Fixtures。 为架构生成占位文本和预置行。
- Lorem ipsum — 根据种子生成占位文本,或以 JSON、CSV 和 SQL 格式生成虚拟行。
Regex。 使用示例测试 JavaScript 正则表达式。
- Regex 测试器 — 测试 JavaScript 模式、查看分组并预览替换结果。
代码。 压缩并转换源代码。
- 代码压缩器 — 压缩 JavaScript、CSS 和 HTML,并查看字节级节省量。
数据与格式
JSON、表格,以及在系统之间传输数据的编码格式。
JSON。 格式化 JSON 并将其转换为 YAML。
- JSON 格式化工具 — 美化、压缩并验证 JSON;验证失败时显示准确的行号和列号。
- JSON YAML 转换器 — 在浏览器中转换 JSON、YAML、TOML 和 XML;文档验证失败时保留行号。
- JSON Schema — 从 JSON 推断 Schema、根据 Schema 验证,并导出 TypeScript 和 Zod。
- JSONPath 测试器 — 使用 JSONPath Plus 查询 JSON 并检查每个匹配项。
- JSON 转类型 — 粘贴 JSON,获取 TypeScript、Zod、Pydantic、dataclass 和 Go 类型。
表格。 将 CSV 转为 JSON,也可将 JSON 转为行。
- CSV JSON 转换器 — 将 CSV 转为 JSON,也可将 JSON 转回 CSV,并可自选分隔符和标题行。
编码。 Base64 及字符串中隐藏的字节。
- Base64 编解码器 — 对文本或文件进行 Base64 编码和解码,包括 URL 安全字母表。
- 程序员计算器 — 进制转换、位运算和可点击的位网格。
- ZIP 工具 — 完全在浏览器中创建 ZIP 压缩包并解压。
标记语言。 双向转换 Markdown 和 HTML。
- Markdown HTML — 将 Markdown 转换为 HTML,或将 HTML 转回 Markdown,并提供实时预览。
SQL。 格式化查询,但不执行查询。
- SQL 格式化工具 — 为 PostgreSQL、MySQL、BigQuery、Snowflake 和其他方言格式化 SQL。
SEO 与 AI 搜索
标记、爬虫,以及 AI 搜索引擎可以引用的文件。
AI 搜索。 决定 AI 爬虫可以抓取、引用和跳过哪些内容的文件与检查工具。
- llms.txt 生成器 — 读取公开站点地图并编写 llms.txt 索引,还可选择生成 llms-full.txt。
- AI SEO 检查器 — 评估爬虫访问权限、llms.txt、结构化数据,以及 AI 搜索使用的页面信号。
- robots.txt 检查器 — 读取允许与禁止规则、站点地图链接,以及会导致 robots.txt 文件内容不实的问题。
- 网页转 Markdown — 抓取公开网页并将文章转换为 Markdown。
SEO。 结构化数据,以及爬虫无需猜测即可引用的标记。
- JSON-LD 架构生成器 — 填写表单,即可生成适用于 Article、FAQ、Product、Organization 等类型的有效 schema.org JSON-LD。
- 站点地图验证器 — 检查站点地图 URL 或 XML,也可根据列表生成 urlset。
AI 开发。 发送提示词前,统计令牌数并估算费用。
- AI 令牌计数器 — 统计令牌数并估算提示词在 GPT、Claude 和 Gemini 模型上的 API 费用。
社交媒体预览。 Open Graph 卡片、元标签,以及分享链接展开后的预览图。
- OG 图片生成器 — 选择模板,查看卡片实时更新,然后下载 PNG 或复制 Next.js 文件。
- OG 模板列表 — 浏览 Open Graph 模板 ID、字段和颜色预设。
- 元标签检查器 — 从一个公开 URL 中读取标题、描述、规范链接、robots、Open Graph、Twitter 和 JSON-LD 类型。
- 社交图片尺寸调整器 — 将任意照片调整为适用于 Instagram、YouTube、X、LinkedIn 和 Facebook 的精确尺寸,并按你选择的主体进行裁剪。
- Meme 生成器 — 使用预设样式或你自己的图片,制作经典的顶部/底部字幕 Meme。
图片和媒体
在浏览器中转换、压缩和调整图片尺寸。文件保留在设备上。
图片。 在浏览器中转换、压缩和调整图片尺寸。文件保留在设备上。
- 图片格式转换器 — 在浏览器中转换 HEIC、WebP、PNG、JPG 和 AVIF。不会上传任何内容。
- 图片压缩器 — 在浏览器中缩小 JPEG、PNG、WebP 和 AVIF 图片,并查看压缩前后的实际大小。
- 图片尺寸调整器 — 按像素或百分比调整尺寸,锁定宽高比,并支持批量打包为 ZIP。
- 二维码和条形码读取器 — 从照片、粘贴的图片或摄像头读取二维码和条形码。
- SVG 优化器 — 压缩 SVG、比较文件大小,并在未关闭此选项时保留 viewBox。
- EXIF 查看器和移除器 — 读取照片元数据,包括 GPS 信息,并移除全部元数据或仅移除位置信息。
- 图片裁剪器 — 使用自由裁剪框或宽高比预设进行裁剪,支持圆形裁剪。
- 图片转文字 — 识别图片中的文字。OCR 模型只需下载一次,之后便会在此浏览器中运行。
- 背景移除器 — 在浏览器中抠出人像,或清除纯色背景,无需下载。
- 照片拼贴 — 将照片排列成网格布局,并导出高分辨率 PNG。
音频。 在浏览器中裁剪和调整音频。文件保留在设备上。
- 音频裁剪器 — 从音频文件中裁剪片段。查看波形、拖动裁剪区域、添加淡入淡出,并导出 WAV。
PDF 和文档
在浏览器中合并、拆分、压缩和创建 PDF。文件保留在此设备上。
- 合并 PDF — 在浏览器中合并 PDF。重新排序、保留每个文件中的指定页码范围,并下载合并后的文档。
- 拆分 PDF — 提取页码范围,或将 PDF 拆分为单页或多个分段,然后下载 PDF 或 ZIP。
- 压缩 PDF — 在浏览器中缩小 PDF。选择预设或目标大小,并比较压缩前后的文件。
- 图片转 PDF — 将 JPG、PNG 和 WebP 图片转换为一个 PDF。设置页面尺寸、方向、边距和顺序。
- PDF 转文本 — 读取 PDF 中可选择的文本;如果文本字号较大,则使用 Markdown 标题。
- 旋转 PDF — 重新排序、旋转或删除页面,然后下载 PDF。
- PDF 转图片 — 将 PDF 页面渲染为 PNG 或 JPEG,然后下载单张图片或 ZIP。
- 保护 PDF — 添加 AES 密码,或在已知密码的情况下解锁 PDF。
- 简历生成器 — 在浏览器中制作精美简历,包含个人资料、工作经历、教育背景和技能,并导出为格式整洁的 PDF。
- PDF 签名 — 在浏览器中为 PDF 签名。手绘或输入签名,将其放置在任意页面,然后下载签署后的文件。
- PDF 表单填写器 — 在浏览器中填写交互式 PDF 表单并导出。
安全与加密
令牌、哈希、密码,以及权限的组成部分。
身份验证调试。 读取 JSON Web Token、检查签名,并了解会话过期的原因。
- JWT 解码器 — 粘贴 JSON Web Token,在浏览器中读取声明并验证签名。
- TOTP 身份验证器 — 为你的账户生成实时 2FA 验证码,支持导入 otpauth:// 和导出 QR 码。
加密。 哈希、密码、UUID 和权限位。
- 哈希生成器 — 为文本或文件生成 MD5、SHA-1、SHA-256 和 SHA-512 校验和,并支持 HMAC。
- UUID 生成器 — 批量生成 UUID v4 或 v7,并读取 v7 ID 中存储的时间。
- 密码生成器 — 生成加密级密码和密码短语,并提供熵强度计。
- Chmod 计算器 — 将权限网格转换为八进制和符号形式的 chmod,反向转换也可以。
- Bcrypt 哈希 — 使用 bcrypt 或 argon2id 对密码进行哈希和验证。不会存储任何内容。
- 密钥对 — 生成 RSA、EC 和 Ed25519 密钥,并转换 PEM 和 JWK。
- AES 加密 — 在浏览器中使用 AES-GCM 加密和解密,不会上传任何内容。
标头。 Content-Security-Policy 和浏览器强制执行的标头。
- CSP 生成器 — 构建 Content-Security-Policy 和 Next.js 标头代码片段。
设计
颜色值、对比度,以及构成布局的标记。
- 颜色转换器 — 将任意颜色转换为 HEX、RGB、HSL、OKLCH 和 CMYK,并检查对比度。
- QR 码生成器 — 为文本、URL、Wi-Fi 或 vCard 创建静态 QR 码。设置颜色和纠错级别,然后下载 SVG 或 PNG。
- Favicon 生成器 — 根据图片或字母生成 ICO、各种尺寸的 PNG、清单文件和 HTML 代码片段。
文本
计数、大小写,以及两段文本之间发生变化的行。
差异对比。 比较两段文本,查看发生变化的行。
- 差异检查器 — 并排或内联比较两段文本,并下载统一补丁。
写作。 计数、大小写,以及标题或帖子必须符合的限制。
- 字数统计器 — 统计单词数、字素数和阅读时间,并查看标题或帖子必须符合的限制。
- 大小写转换器 — 转换为 camelCase、snake_case 和标题大小写,并支持 AP 和 Chicago 规则。
数学与金融
贷款、百分比、单位,以及计算日程所用的时间戳。
时间。 Unix 时间戳,以及两个日期之间的天数。
- Unix 时间戳转换器 — 将纪元秒数或毫秒数转换为日期,也可将任意时区的日期转换为纪元时间。
- 日期差计算器 — 计算两个日期之间的天数、周数和工作日数。
金融。 贷款还款计划和带小数舍入的百分比计算。
- 贷款 EMI 计算器 — 计算每月分期金额和完整的摊销表,并四舍五入到美分。
- 百分比计算器 — 计算百分比、百分比变化、反向百分比和利润率,并显示公式。
- 发票生成器 — 在浏览器中创建发票和报价单。添加明细项目、税费和折扣,然后下载整洁的 PDF。
- 货币转换器 — 实时汇率、历史趋势和多币种表格。
单位。 转换长度、质量、温度和数据大小。
- 单位转换器 — 转换长度、质量、温度和数据大小,并将十进制单位与二进制单位分别处理。
网络
DNS、证书、响应头,以及构建请求所用的 URL。
URL。 对 URL 及其查询参数进行编码和解码。
- URL 编码器和解析器 — 对 URL 进行编码或解码,然后将查询字符串拆分为参数。
DNS。 通过 HTTPS 查询公共 DNS 记录。
- DNS 查询 — 通过 DNS-over-HTTPS 查询 A、AAAA、MX、TXT、CNAME 和 CAA 记录。
IP 和子网。 IPv4 和 IPv6 子网计算。
- CIDR 计算器 — 计算 IPv4 和 IPv6 的网络地址、广播地址、主机范围,并检查地址是否属于该网段。
HTTP。 响应头、重定向,以及安全响应头评级。
- HTTP 响应头 — 跟踪重定向,并为公共 URL 的安全响应头评级。
- HAR 分析器 — 上传 HAR 捕获文件,查看时间都花在了哪里。
- cURL 转换器 — 将任意 curl 命令转换为 fetch、Python、Go、PHP 或 Rust。
- GraphQL 客户端 — 使用变量、请求头和历史记录查询任意 GraphQL 端点。
- WebSocket 测试器 — 连接到任意 ws/wss 端点并检查实时帧。
TLS。 公共主机上的证书到期时间、证书链和名称。
- SSL 检查器 — 检查 443 端口上证书的到期时间、名称和证书链。
在 AI Agent 中使用
服务地址为 https://benchline.fabwaseem.com/mcp。它通过 Streamable HTTP 使用 JSON-RPC,并以 JSON 作答(enableJsonResponse)。无需会话 ID。唯一支持的方法是 POST。可在 /mcp/guide 查看易读的设置指南。
Open Graph 需要两次调用。list_og_templates 会返回模板 ID、类别、默认值和字段架构。build_open_graph 接收模板 ID、该模板所用的字段、颜色、尺寸和可选图片,并返回 PNG 及 Next.js 文件。输入架构见 docs/MCP.md。
Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"benchline": {
"url": "https://benchline.fabwaseem.com/mcp"
}
}
}
Claude Desktop
打开 Claude Desktop,然后依次选择 Customize > Connectors,并添加自定义连接器。粘贴 https://benchline.fabwaseem.com/mcp。该服务无需登录。请按此方式设置。
若要将该 URL 桥接为 stdio 命令,请将以下内容放入 claude_desktop_config.json:
{
"mcpServers": {
"benchline": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://benchline.fabwaseem.com/mcp"]
}
}
}
VS Code
.vscode/mcp.json
{
"servers": {
"benchline": {
"type": "http",
"url": "https://benchline.fabwaseem.com/mcp"
}
}
}
curl
发送 content-type: application/json 和 accept: application/json, text/event-stream。无需先执行 initialize,以下两个调用即可对在线服务正常工作。
tools/list:
curl -sS -X POST https://benchline.fabwaseem.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
对 format_json 执行 tools/call:
curl -sS -X POST https://benchline.fabwaseem.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"format_json","arguments":{"json":"{\"a\":1}"}}}'
调用成功时会返回 result.structuredContent 和相同 JSON 的文本副本。调用失败时会返回 result.isError: true 和一条文本消息。
速率限制
/mcp 每个地址每分钟允许 60 个请求。POST /api/v1/tools/<slug> 有自己的速率限制,每分钟允许 60 个请求。地址取第一个 x-forwarded-for 跳点,否则取 x-real-ip。429 响应正文是 JSON-RPC 错误(Too many requests.),且响应会设置 retry-after。
如果请求包含 Origin,它必须与请求主机、localhost、127.0.0.1 或 https://benchline.fabwaseem.com(NEXT_PUBLIC_SITE_URL 来源)匹配。不包含 Origin 标头也可以,curl 就是如此。
文件输入
文件参数只能接受 url 或 data,不能同时提供两者。
data可以是标准或 URL 安全的 base64,也可以是data:URI。解码后的字节数上限为 10 MB。url必须是公共http或https地址,端口为 80 或 443,且不能包含用户名或密码。拒绝localhost、*.local、*.internal和metadata.google.internal。系统会解析主机,并在任何地址属于环回、私有、链路本地、CGNAT(100.64.0.0/10)、组播范围或 IPv6 对应范围时拒绝请求。系统会手动跟随重定向,最多 4 次,并重新检查每个跳转。请求会在 15 秒后超时。声明或流式传输的正文超过 10 MB 时会被拒绝。
完整输入列表见 docs/MCP.md。
隐私
完全在浏览器中运行的工具会将文本、文件和结果保留在设备上。
以下工具可以通过本站获取公共 URL。页面会提交你输入的 URL 或主机名,路由会获取该地址,但不会将其写入任何位置;私有地址会被拒绝。这些路由每 10 分钟允许来自同一地址的 8 个请求。
- llms.txt 生成器 — 读取公共站点地图并编写 llms.txt 索引,还可选生成 llms-full.txt。
- AI SEO 检查器 — 评估爬虫访问情况、llms.txt、结构化数据,以及 AI 搜索使用的页面信号。
- robots.txt 检查器 — 检查允许和禁止规则、站点地图链接,以及可能导致 robots.txt 文件失效的错误。
- Meta 标签检查器 — 从一个公共 URL 读取标题、描述、规范链接、robots、Open Graph、Twitter 和 JSON-LD 类型。
- 页面转 Markdown — 获取公共页面并将文章转换为 Markdown。
- DNS 查询 — 通过 DNS-over-HTTPS 查询 A、AAAA、MX、TXT、CNAME 和 CAA 记录。
- 站点地图验证器 — 检查站点地图 URL 或 XML,也可以根据列表生成 urlset。
- HTTP 标头 — 跟随重定向并评估公共 URL 的安全标头。
- SSL 检查器 — 检查端口 443 上证书的有效期、名称和证书链。
- GraphQL 客户端 — 使用变量、标头和历史记录查询任意 GraphQL 端点。
- WebSocket 测试器 — 连接到任意 ws/wss 端点并检查实时帧。
- 货币转换器 — 查看实时汇率、历史趋势和多币种表格。
使用次数
设置 DATABASE_URL 后,服务会记录匿名数据:工具运行次数(MCP、POST /api/v1/tools/<slug> 和浏览器)、页面浏览量、工具打开次数、目录搜索文本,以及复制或下载点击次数。每次运行会记录时间、工具 slug、来源、结果、错误类别(例如 validation 或 timeout)、耗时和字节数。不会记录工具输入、工具输出、文件字节、提交的 URL 或原始 IP 地址。
这些数据的客户端地址取自 X-Real-Ip,若无则取 X-Forwarded-For 中的第一跳。Traefik 会根据 TCP 连接设置这两个字段。存储的地址为 sha256(ANALYTICS_SALT + UTC date + ip)。国家/地区信息是通过服务端查询该地址在 DB-IP IP to Country Lite 数据库(CC BY 4.0)所得的 ISO 代码。若该文件缺失,则国家/地区字段留空。只有查询无结果时,才会使用 CDN 国家/地区标头(cf-ipcountry 及其他边缘服务的同类标头)。用户代理会以类别形式存储(chrome、curl 等),引荐来源则存储为主机名。浏览器访客会在 localStorage 中获得一个随机的第一方 ID,并设置 bl_vid / bl_sid Cookie。
POST /api/track 接收浏览器信标。它会像 MCP 一样检查 Origin,忽略已知机器人和预取请求,将请求正文限制为 4 KB,并将每个地址的请求频率限制为每分钟 30 次。未知工具 slug 会被拒绝。看起来像 URL 或令牌的搜索文本会被丢弃。数据会排入内存队列,每隔几秒写入一次;缓冲区已满或数据库出错时,会丢弃该批数据并记录警告。数据库操作不会延迟工具响应。
GET /api/v1/stats 返回按工具、来源、结果和日期划分的总数,以及 MCP 客户端、国家/地区、错误率和 p50/p95 耗时。请发送 Authorization: Bearer <STATS_TOKEN>。令牌缺失或错误时会返回 404。筛选条件为 from、to、slug 和 source(最多 366 天;默认时间范围为 30 天)。
/admin 是用于同一数据库的私密面板。除非同时设置了 ADMIN_PASSWORD 和 ADMIN_SESSION_SECRET,否则会返回 404。密码比较采用恒定时间算法。登录成功后会设置一个由 HMAC 签名的 httpOnly、Secure、SameSite=Strict Cookie,有效期为 7 天。登录尝试会按 IP 哈希进行速率限制。页面和 CSV 导出均在服务端运行,绝不会向浏览器发送 STATS_TOKEN。管理路径会设置 noindex,不会列入站点地图和 robots 允许列表,也不会被记录为页面浏览量。查询近期记录时使用原始表;查询已汇总的日期时使用 analytics_daily,并设置 statement_timeout(ADMIN_QUERY_TIMEOUT_MS,默认值为 8s)。
超过 ANALYTICS_RETENTION_DAYS(默认值为 90 天)的原始记录会汇总到 analytics_daily 并删除。该任务会在启动时运行一次,此后每天运行一次;pnpm db:retain 可手动运行该任务。pnpm db:migrate 会应用与服务启动时相同的 SQL。启动时会获取 advisory lock,必要时创建 schema_migrations,并应用尚未记录的版本。如果未设置 DATABASE_URL,或数据库在几秒内没有响应,则会关闭跟踪功能,网站仍会继续提供工具服务。
如果不运行汇总任务,执行的清理操作相同:
DELETE FROM tool_runs WHERE ts < now() - interval '90 days';
DELETE FROM page_views WHERE ts < now() - interval '90 days';
DELETE FROM tool_opens WHERE ts < now() - interval '90 days';
DELETE FROM search_queries WHERE ts < now() - interval '90 days';
DELETE FROM ui_actions WHERE ts < now() - interval '90 days';
MCP 调用与页面处理不同。服务会运行该函数。以 base64 发送的文件,或由服务获取的公开 URL,仅会在本次调用期间读入内存,不会写入磁盘。MCP 条目注明会获取网络内容的工具,会在注册表中标记为 openWorld。图片和 PDF 页面仍由浏览器处理;其 MCP 处理器接受文件,因为 Agent 在此服务上没有本地磁盘。
技术栈
Next.js 16(App Router、React Server Components、output: "standalone")、React 19、严格模式下的 TypeScript、Tailwind CSS v4、基于 Base UI 的 shadcn/ui(base-nova)、zod 4、vitest,以及 Model Context Protocol TypeScript SDK。pnpm 10.33.4。CI 和 Docker 镜像使用 Node 22。字体为 Geist Sans 和 Geist Mono。主题使用 next-themes(<html> 上的 class)。
项目结构
src/app/ directory, category, tag, tool, explore, search, about, AI, MCP guide
src/app/mcp/route.ts POST /mcp
src/app/api/v1/tools/ POST /api/v1/tools/<slug>
src/app/api/v1/stats/ GET /api/v1/stats
src/app/api/track/ POST /api/track
src/app/api/tools/ browser routes for tools that fetch
src/lib/analytics/ usage counts, queue, migrations, country lookup
src/tools/<slug>/ meta.ts, tool.tsx, lib/, mcp.ts
src/registry/ generated index, loaders, MCP registry, search index
src/lib/ shared helpers, MCP handler, SSRF guard, rate limit
src/components/kit/ tool workspace blocks
src/components/ui/ themed primitives
src/components/shell/ directory
public/tools/<slug>/ cover.png and logo.png
scripts/gen-registry.ts
scripts/db-migrate.ts
scripts/db-retain.ts
scripts/download-geodb.ts
scripts/gen-readme-tools.ts
scripts/gen-mcp-docs.ts
scripts/live-mcp-smoke.mts
pnpm gen:registry 会扫描 src/tools/*/meta.ts 和 mcp.ts,检查它们并生成注册表。目录仅导入元数据。工具 UI 由生成的宿主通过 next/dynamic 加载,因此打开目录时不会下载所有工具。
更多详情请参阅 docs/ARCHITECTURE.md。
本地开发
Node 22(参见 .nvmrc)和 pnpm 10.33.4(package.json 中的 packageManager;Corepack 会使用该版本)。
pnpm install
pnpm dev
pnpm dev 会在端口 3000 上启动 Next。
pnpm test
pnpm lint
pnpm typecheck
pnpm build
pnpm start
pnpm build 会先运行 pnpm gen:registry。测试使用 vitest,文件为 src/**/*.test.ts。
更改注册表后:
pnpm gen:readme-tools
pnpm gen:mcp-docs
Docker
Dockerfile 中的镜像采用三阶段构建:安装依赖、运行 pnpm geo:download 和 pnpm build,然后使用 Node 22 Alpine 运行器在端口 3000 上启动 node server.js。国家数据库下载失败也不会影响构建;在文件存在之前,国家信息会保持为空。运行器会将 data/ 复制到服务器旁边。
docker build -t benchline .
docker run --rm -p 3000:3000 benchline
运行器会将 pdfjs-dist、zxing-wasm、tesseract.js、tesseract.js-core 及其 worker 依赖、satori 和 @resvg/resvg-js 复制到独立服务器旁边,以便 PDF、条码、OCR 和 Open Graph 工具加载这些依赖。
环境
| 变量 | 用途 | 默认值 |
|---|---|---|
NEXT_PUBLIC_SITE_URL | 规范 URL、Open Graph 和 MCP 来源检查 | https://benchline.fabwaseem.com |
MCP_URL | 仅供 scripts/live-mcp-smoke.mts 使用 | https://benchline.fabwaseem.com/mcp |
DATABASE_URL | 用于匿名使用次数统计的 Postgres 17 连接 | 未设置(关闭追踪) |
ANALYTICS_SALT | 每日 IP 哈希 | 未设置(不生成哈希) |
STATS_TOKEN | GET /api/v1/stats 的 Bearer token | 未设置(该路由返回 404) |
ADMIN_PASSWORD | /admin 的密码 | 未设置(/admin 返回 404) |
ADMIN_SESSION_SECRET | 管理员会话 cookie 的 HMAC 密钥 | 未设置(/admin 返回 404) |
ADMIN_QUERY_TIMEOUT_MS | 管理员 SQL statement_timeout | 8000 |
ANALYTICS_RETENTION_DAYS | 汇总前原始事件的保留时长 | 90 |
GEOIP_DB_PATH | DB-IP country lite mmdb | data/dbip-country-lite.mmdb |
GEOIP_DOWNLOAD | 0 表示跳过启动时下载 | 文件缺失时下载 |
如果需要本地来源,请复制 .env.example。即使未设置这些变量,应用也能运行。
MCP 实时冒烟测试
scripts/live-mcp-smoke.mts 会使用 MCP 客户端连接,调用 tools/list,然后对列出的每个工具调用 tools/call。示例位于该文件中。脚本会在每次调用之间等待 1.2 秒,使完整测试保持在每分钟 60 次的限制以内,并会在遇到 429 时重试。结果写入 /tmp/benchline-mcp-live-results.json。如果调用失败或列出的工具没有示例,进程会以 1 退出。
MCP_URL=https://benchline.fabwaseem.com/mcp pnpm exec tsx scripts/live-mcp-smoke.mts
添加工具
创建 src/tools/<slug>/,其中包含 meta.ts、tool.tsx、纯函数 lib/ 及其 vitest 文件,还有 mcp.ts。将 slug 添加到 toolOrder,添加美术资源,将调用示例添加到端点测试和 scripts/live-mcp-smoke.mts,然后运行 pnpm gen:registry。具体步骤、UI 规则和 MCP 契约见 CONTRIBUTING.md。
路线图
新工具和更改通过 GitHub issue 进行跟踪。工具构想应使用工具请求模板,说明其功能、证明人们需要它的依据、MCP 调用,以及它能否在浏览器中按照许可政策运行。本仓库不会另行维护未发布的功能列表。
许可证
MIT。版权所有 (c) 2026 Waseem Anjum。
致谢
Benchline 基于 Next.js、React、Tailwind CSS、shadcn/ui 和 Base UI、zod、Vitest、Model Context Protocol TypeScript SDK、Lucide 和 Geist(通过 next/font 加载)构建。工具实现使用 package.json 中列出的软件包,包括 pdf-lib 和 sharp。新增依赖均采用宽松许可证。请参阅 CONTRIBUTING.md。
IP 地理位置数据由 DB-IP 提供,使用免费的 IP to Country Lite 数据库,遵循 CC BY 4.0 许可。构建时会下载图片 dbip-country-lite-YYYY-MM.mmdb.gz。如果文件缺失,国家/地区字段将为空。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。



