关于 toolkit-mcp-server
toolkit-mcp-server 通过本地工具提供常用开发实用功能,公共 IP 地理位置查询则由外部服务处理。它面向需要生成 ID、哈希和二维码、转换编码或按需检查主机信息的开发者与 Agent。
主要功能
- 01生成 UUID 和 ULID
- 02以多种格式创建二维码
- 03生成并比较摘要
- 04编码和解码常见格式
- 05查询公共 IP 和主机名位置
- 06受开关控制的网络与系统诊断
适用场景
- 01为测试数据生成标识符
- 02将 URL 制作为二维码
- 03检查文件或值的摘要
- 04查询公共 IP 位置或主机连通性
MCP 相关
它通过 stdio 或 Streamable HTTP 向 MCP 客户端提供七种实用工具。网络和系统诊断工具默认不注册,只有明确启用后才会提供。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://toolkit.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-toolkit https://toolkit.caseyjhand.com/mcp{"mcpServers":{"cyanheads-toolkit":{"type":"http","url":"https://toolkit.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-toolkit":{"type":"http","url":"https://toolkit.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-toolkit":{"type":"http","url":"https://toolkit.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-toolkit":{"serverUrl":"https://toolkit.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
5| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| value | string | 是 | 要哈希的数据,按 inputEncoding 解释(默认作为原始文本)。 |
| expected | string | 否 | 用于比较的摘要,可采用 hex(任意大小写)、标准 base64 或 SRI(<algorithm>-<base64>)格式;根据算法摘要长度对应的格式识别,且仅由十六进制数字组成的字符串始终按 hex 处理。SRI 值可包含多个以空格分隔的条目:跳过其他算法的条目,只要指定算法的任一条目匹配即可。省略 operation 但提供此值时将执行比较;若 operation 为 "generate",则拒绝该值。 |
| algorithm | enum | 否 | 摘要算法。sha256(默认)、sha384 或 sha512 用于安全场景;md5/sha1 仅用于校验和/兼容,不用于安全场景。sha256 | sha384 | sha512 | sha1 | md5 |
| operation | enum | 否 | "generate" 生成摘要;"compare" 以常量时间将 value 与 expected 进行比较。省略时,若提供 expected,则解析为 "compare";否则解析为 "generate"。generate | compare |
| inputEncoding | enum | 否 | 哈希前对值进行解码的方式:UTF-8 文本、hex 或 base64。utf8 | hex | base64 |
| digestEncoding | enum | 否 | 生成摘要的格式:小写 hex(默认)、标准 base64,或 sri(<algorithm>-<base64>,仅限 sha256/sha384/sha512)。仅适用于操作 "generate"。hex | base64 | sri |
详细介绍
@cyanheads/toolkit-mcp-server
通过 MCP 生成随机 ID、二维码和哈希,对值进行编码和解码,并查询 IP 的地理位置;还可通过授权门控执行网络和系统诊断。支持 STDIO 或 Streamable HTTP。
概述
日常开发实用工具:生成 ID、二维码和哈希,对值进行编码和解码,并查询公共 IP 或主机名的地理位置。除地理位置查询外,所有操作都在本地运行。
工具
| 工具 | 描述 |
|---|---|
toolkit_hash_value | 将摘要(sha256/sha384/sha512/sha1/md5)生成为十六进制、base64 或 SRI 格式,或以恒定时间比较某个值与预期摘要 |
toolkit_generate_id | 生成经密码学安全随机化的 UUIDv4、UUIDv7 或 ULID 标识符,每次调用最多生成 1000 个 |
toolkit_generate_qr | 将文本或 URL 编码为 SVG、base64 PNG 或终端半区块格式的二维码 |
toolkit_encode_value | 对 base64、base64url、十六进制或 URL 百分号编码进行编码或解码 |
toolkit_geolocate_ip | 将公共 IP 或主机名解析为国家、城市、坐标、ASN 和时区 |
toolkit_check_network | 受授权门控,默认关闭。 从服务主机执行 ping、traceroute、TCP 连通性检查或出口 IP 检查 |
toolkit_check_system | 受授权门控,默认关闭。 检查服务主机的 OS、CPU、内存、平均负载或网络接口 |
能力参考
toolkit_hash_value 工具
value按inputEncoding读取(默认utf8,也可为hex、base64);algorithm为sha256(默认)、sha384或sha512,也支持sha1和md5,但仅用于校验和兼容;operation为generate或compare,省略时,如果提供了expected,则执行比较generate会返回按digestEncoding编码的digest(默认hex,也可为base64;对于 SHA-2 算法,还可为sri),以及lengthInBytes;compare会返回与expected比较后的matches,expected可为 hex、base64 或 SRI,也可包含多个条目的 npmintegrity值- 无效的
expected会导致expected_malformed、expected_length_mismatch(提示会指出长度匹配的算法)或expected_algorithm_mismatch
toolkit_generate_id 工具
type为uuid_v4(默认)、uuid_v7或ulid;count为 1–1000(默认值为 1)ids始终恰好包含count个值;uuid_v7和ulid批次即使在同一毫秒内也严格递增,并带有随机间隔,因此无法从一个 ID 推导出另一个
toolkit_generate_qr 工具
data在纠错级别L下最多为 2953 个 UTF-8 字节;在M(默认)、Q和H下容量更小;format为svg(默认)、png_base64或terminal;margin为 0–20 个模块(默认值为 4),scale为每个模块 1–32 px(默认值为 4)- 返回
content、符号version(1–40)、图像格式的mimeType,以及 PNG 的byteLength;png_base64还会作为 MCP 图像块返回,terminal则是针对深色背景绘制的纯 Unicode 半块字符 - 超出容量的输入会导致
data_too_large,并附带字节数;每边超过 2048 px 的 PNG 会导致raster_too_large,并提供可用的缩放比例;svg和terminal没有像素上限
toolkit_encode_value 工具
- 必须指定
operation(encode或decode)和encoding(base64、base64url、hex、url);输入中的hex、base64和base64url空白字符会被忽略,因此换行的 MIME 和 PEM 内容可直接解码 - 解码会返回
result,默认为utf8文本;若outputEncoding指定为hex或base64,则会无损返回字节并在编码间转码;无效输入会导致decode_failed,二进制字节则会导致decode_not_utf8,而不会被替换字符取代
toolkit_geolocate_ip 工具
target为 IPv4/IPv6 地址或点分格式的主机名,并会先进行 DNS 解析;私有或保留地址会导致private_target,无法解析的主机名会导致unresolvable_host- 也可以改为发送
targets(最多 1000 个),但不能同时发送两者:前 100 个会按顺序返回在results中,并附带每个目标的错误;failedCount统计失败数量,unprocessedTargets列出可重新提交的其余目标 - 返回
country、countryCode、region、city、latitude/longitude、asn、org和timezone,并附带resolvedIp和source;proxy、hosting或mobile中的true表示位置信息描述的是基础设施,而非个人 - 默认通过明文 HTTP 使用无需密钥的 ip-api 免费层(
TOOLKIT_GEO_BASE_URL、TOOLKIT_GEO_API_KEY);结果按解析后的 IP 缓存 - 单次查询和批量查询的速率限制各自独立(
TOOLKIT_GEO_RATE_LIMIT_PER_MIN=45、TOOLKIT_GEO_BATCH_RATE_LIMIT_PER_MIN=15);被拒绝的请求会返回rate_limited以及需等待的秒数,缓存命中不受限制
toolkit_check_network 工具
mode为ping、traceroute、connectivity或public_ip;除public_ip外都必须指定target,connectivity还需要指定port(1–65535);count为 1–10 次 ping(默认值为 3),timeoutMs为 100–30000(默认值为 3000)- 无响应的主机返回
reachable: false,而不是错误;ping会添加rttMs、sent、received和packetLossPercent,connectivity会添加outcome(open、refused、timeout、unreachable),traceroute会返回hops;无法解析的主机,或无法运行的 ping/traceroute 二进制文件,会以unreachable失败 - 仅当
TOOLKIT_ENABLE_NET_DIAGNOSTICS=true时才会注册;除非TOOLKIT_ALLOW_PRIVATE_NETWORK=true,否则私有和保留目标会以private_target_blocked失败
toolkit_check_system 工具
what为os、cpu、memory、load或interfaces;恰好填充一个匹配的类别对象memory.availableBytes是可分配的剩余内存;在容器内存限制下会显示limitBytes;totalBytes、freeBytes和usedBytes是原始操作系统数据,其中已使用的内存包含可回收缓存- 仅当
TOOLKIT_ENABLE_SYSTEM_INFO=true时才会注册,因为os和interfaces会披露主机拓扑和版本详情
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔的身份验证(none / jwt / oauth)、可切换的存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
本工具包特有功能:
- 哈希、ID 生成、QR 编码及编解码均在进程内通过
node:crypto和qrcode库完成,不会调用上游服务 - 地理位置查询会调用服务提供方,而非目标地址;并检查 DNS 解析出的 IP 是否属于私有地址范围,确保主机名无法访问内部地址
- 默认拒绝的门控机制:除非启用,否则
toolkit_check_network和toolkit_check_system不会出现在tools/list中。这两者报告的是服务端主机的信息,而非调用方的信息,因此适用于本地或可自托管部署 - 两级网络门控:启用诊断后,私有、回环、链路本地和保留目标(包括云元数据端点)仍会被屏蔽,直至设置
TOOLKIT_ALLOW_PRIVATE_NETWORK=true
便于 Agent 使用的输出:
- 来源信息:地理位置查询会返回
resolvedIp和source,对于服务提供方未报告的字段则予以省略,而不凭空编造 - 响应整形:服务提供方返回的字符串最长为 256 个字符,并会移除控制字符,避免由注册表控制的文本(如
org)塞满或破坏模型上下文 - 判别式输出:
operation、format、mode和what会回显实际执行的操作,且只会填充对应分支的字段 - 类型化失败:每种已声明的失败都包含
reason和恢复提示;冲突输入(expected与generate同时出现,或outputEncoding与encode同时出现)会按名称拒绝,而非忽略
开始使用
公共托管实例
公共实例位于 https://toolkit.caseyjhand.com/mcp,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向此实例:
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "streamable-http",
"url": "https://toolkit.caseyjhand.com/mcp"
}
}
}
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中。无需 API 密钥。
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/toolkit-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/toolkit-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 Docker:
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/toolkit-mcp-server:latest"]
}
}
}
若要启用受门控的主机探测工具,请将相应标志添加到 env 中(Docker 使用 -e):
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"TOOLKIT_ENABLE_NET_DIAGNOSTICS": "true",
"TOOLKIT_ENABLE_SYSTEM_INFO": "true"
}
若要使用 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥——地理位置查询默认使用无需密钥的 ip-api 免费层级。
安装
- 克隆代码仓库:
git clone https://github.com/cyanheads/toolkit-mcp-server.git
- 进入目录:
cd toolkit-mcp-server
- 安装依赖项:
bun install
配置
所有变量均为可选项。
| 变量 | 说明 | 默认值 |
|---|---|---|
TOOLKIT_ENABLE_NET_DIAGNOSTICS | 注册受开关控制的 toolkit_check_network 工具。在托管或共享部署中请保持关闭。 | false |
TOOLKIT_ENABLE_SYSTEM_INFO | 注册受开关控制的 toolkit_check_system 工具。 | false |
TOOLKIT_ALLOW_PRIVATE_NETWORK | 启用网络诊断后,允许访问私有、保留、环回和链路本地目标。 | false |
TOOLKIT_GEO_API_KEY | 地理位置接口所需的 API 密钥(如有)。 | 无 |
TOOLKIT_GEO_BASE_URL | 兼容 ip-api 的接口基础 URL。默认地址无需密钥,但使用明文 HTTP;ip-api 的 HTTPS 接口需要付费密钥。 | http://ip-api.com |
TOOLKIT_GEO_CACHE_TTL_SECONDS | 地理位置内存缓存的存活时间(秒)。 | 3600 |
TOOLKIT_GEO_RATE_LIMIT_PER_MIN | 每分钟最多地理位置请求数;缓存命中不计入。 | 45 |
TOOLKIT_GEO_BATCH_RATE_LIMIT_PER_MIN | 每分钟最多批量地理位置请求数,单独计数。 | 15 |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务的端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证模式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(RFC 5424)。 | info |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表请参见 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security, changelog sync bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t toolkit-mcp-server .
docker run --rm -p 3010:3010 toolkit-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/toolkit-mcp-server。默认会安装 OpenTelemetry 对等依赖项;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖项。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口——注册五个始终启用的工具,两个受开关控制的工具仅在相应开关开启时注册。 |
src/config | 使用 Zod 解析并验证服务专属环境变量。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。共七个工具,其中五个始终启用,两个受开关控制。 |
src/services/geo | 地理位置服务——DNS 解析、带重试的服务商调用、规范化、内存缓存。 |
src/services/network | 网络诊断服务,以及共享的目标架构和私有地址范围分类器。 |
tests/ | 工具(tests/tools)和服务(tests/services)的 Vitest 测试套件。 |
开发指南
开发指南和架构规则请参见 CLAUDE.md / AGENTS.md。简而言之:
- 处理器抛出异常,由框架捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录请求范围内的日志,使用ctx.state存储租户范围内的数据 - 在
src/index.ts的createApp()数组中注册新工具;探测主机的工具仅在启用开关开启时注册 - 包装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;切勿编造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0——详情请参见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。