toolkit-mcp-server
The Toolkit MCP Server offers a comprehensive suite of utilities via the Model Context Protocol for LLM agents:
Time Utilities: Get current time, convert between timezones, and list available timezones
System Information: Retrieve system details, load averages, and network interface information
Network Operations: Test TCP connectivity, get public IP, ping hosts, perform traceroute, and geolocate IPs/domains with caching
Security Tools: Generate and compare cryptographic hashes (MD5, SHA-1, SHA-256, SHA-512), create UUIDs
Generators: Create QR codes in terminal, SVG, or Base64 formats with customizable error correction
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@toolkit-mcp-servergenerate a QR code for https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Tools
Seven tools. Five are always on and need no configuration — pure-compute utilities plus an SSRF-free IP lookup. Two probe the server host and stay absent from tools/list until you opt in, fail-closed.
Tool | Description |
| Generate a cryptographic digest (sha256/sha512/sha1/md5), or constant-time-compare a value against an expected digest. |
| Mint cryptographically-random identifiers — UUIDv4, UUIDv7, or ULID — singly or in batches up to 1000. |
| Encode text or a URL into a QR code as SVG markup, base64 PNG, or a terminal-renderable string. |
| Encode or decode a value across base64, base64url, hex, or URL percent-encoding, in either direction. |
| Resolve a public IP or hostname to geographic and network metadata — country, city, coordinates, ASN, timezone. |
| Gated, off by default. Read-only network diagnostics from the server host — ping, traceroute, TCP connectivity, or egress-IP detection. |
| Gated, off by default. Report a facet of the server host's system state — OS, CPU, memory, load average, or network interfaces. |
toolkit_hash_value
Generate a digest, or constant-time-verify a value against an expected one.
operation:generate(lowercase-hex digest) orcompare(timing-safe check viatimingSafeEqual)Algorithms:
sha256(default) andsha512for security;sha1andmd5are exposed for checksum and file-integrity compatibility only — never for passwords or signaturesinputEncodingreadsvalueasutf8(default),hex, orbase64, so binary blobs skip a decode round-tripCanonical use: match a download against a vendor-published checksum
toolkit_generate_id
Mint cryptographically-random identifiers from the platform CSPRNG — the correct source for IDs that must be unpredictable, unlike model-invented values.
type:uuid_v4(random, default),uuid_v7(time-ordered, sortable by creation), orulid(26-char Crockford base32, lexicographically sortable)countmints a batch up to 1000 in one call; the returnedidsarray always holds exactlycountvaluesuuid_v7andulidbatches are monotonic — strictly increasing even within the same millisecond — soidsstays in sorted creation orderNot read-only — each call is fresh entropy, so a client won't cache it or auto-approve it as side-effect-free
toolkit_generate_qr
Encode text or a URL into a QR code.
format:svg(inline markup),png_base64(raster bytes withmimeTypeandbyteLength), orterminal(Unicode block string)errorCorrection(L/M/Q/H) trades data capacity for damage tolerance;marginsets the quiet-zone width;scalesets pixels per module for raster outputThe returned
version(1–40) reflects how dense the encoded data isdatais capped at 2953 bytes — the absolute ceiling (version 40, level L, byte mode); usable capacity is lower at highererrorCorrectionlevels, so over-capacity input is rejected with a typeddata_too_largeerror rather than a generic failure
toolkit_encode_value
Encode or decode a value, in either direction.
encoding:base64,base64url(URL-safe alphabet),hex, orurl(percent-encoding)operation:encode(raw UTF-8 → encoding) ordecode(encoded value → text)Malformed decode input returns a typed
decode_failederror with a recovery hint, not a silent best-effort
toolkit_geolocate_ip
Resolve a public IP or hostname to geographic and network metadata.
Returns country, region, city, latitude/longitude, ASN, owning organization, and timezone
A hostname is DNS-resolved first;
resolvedIpechoes the IP actually located, andsourcenames the answering providerSSRF-free — the server calls the provider, never the target; the resolved IP is re-checked against private ranges, and private/reserved addresses are rejected (they have no public geolocation)
Best-effort and provider-bounded: VPNs, proxies, mobile NAT, and anycast all defeat IP-to-location, accuracy is city-level at best, and absent fields are reported as unknown rather than invented
Keyless by default (ip-api free tier); results are cached in memory by resolved IP
toolkit_check_network
Gated — registered only when TOOLKIT_ENABLE_NET_DIAGNOSTICS=true. Read-only network diagnostics from the server host.
mode:ping(ICMP round-trip),traceroute(hop path to the target),connectivity(raw TCP connect totargetonport), orpublic_ip(the host's own egress IP)A host that does not respond is reported as
reachable: false— a valid result, not an errorDiagnoses the server's own network, so it is useful on a local or self-hosted deployment; reaching a private/reserved/internal target additionally requires
TOOLKIT_ALLOW_PRIVATE_NETWORK=true, which keeps the cloud-metadata endpoint blocked by default
toolkit_check_system
Gated — registered only when TOOLKIT_ENABLE_SYSTEM_INFO=true. Report a facet of the server host's system state, read-only.
what:os,cpu,memory,load, orinterfacesExactly one facet object is populated per call, matching
whatDescribes the host this server runs on, not the calling client — meaningful on a local or self-hosted deployment; gated off by default because
osandinterfacesdisclose host topology and version details
Related MCP server: IT Tools MCP Server
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool definitions — single file per tool, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats
Typed error contracts — each fallible tool declares its failure reasons with recovery hints the agent can act on
Pluggable auth:
none,jwt,oauthStructured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
Toolkit-specific:
Fail-closed gating — the two host-probing tools are absent from
tools/listunless explicitly enabled, so a hosted instance exposes no SSRF or info-disclosure surfaceTwo-tier network gate — even with diagnostics enabled, private/reserved/loopback/link-local targets (including the cloud-metadata endpoint) stay blocked until a second flag permits them
CSPRNG-backed primitives — identifiers and digests come from the platform crypto source, and hash comparison is constant-time via
timingSafeEqualSSRF-free geolocation — the server calls the provider, then re-checks the DNS-resolved IP against private ranges before the lookup, so a hostname cannot smuggle a request to an internal address
Agent-friendly output:
Provenance — geolocation echoes the resolved IP and names the answering provider; absent upstream fields are reported as unknown, never invented
Down-but-valid results — an unreachable host returns
reachable: falseinstead of an error, so callers branch on data, not exception textTyped failure reasons — decode failures, missing digests, and blocked private targets each carry a structured reason plus a next-step recovery hint
Getting started
Add the following to your MCP client configuration file. No API key is required — the five always-on tools and the default keyless geolocation tier work out of the box.
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/toolkit-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/toolkit-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with 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"]
}
}
}To enable the gated host-probing tools, add their flags to env (or -e for Docker):
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"TOOLKIT_ENABLE_NET_DIAGNOSTICS": "true",
"TOOLKIT_ENABLE_SYSTEM_INFO": "true"
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.2 or higher (or Node.js v24+).
No API key needed — geolocation uses the keyless ip-api free tier by default.
Installation
Clone the repository:
git clone https://github.com/cyanheads/toolkit-mcp-server.gitNavigate into the directory:
cd toolkit-mcp-serverInstall dependencies:
bun installConfiguration
Every variable is optional. Server-specific options are validated at startup via the Zod schema in src/config/server-config.ts.
Variable | Description | Default |
| Register the gated |
|
| Register the gated |
|
| With network diagnostics on, permit private/reserved/loopback targets. The second explicit gate. |
|
| IP-geolocation provider id. The default |
|
| API key for the geolocation provider, if it requires one. | none |
| Base URL for the geolocation provider. |
|
| In-memory geolocation cache TTL in seconds. |
|
| Max geolocation requests per minute. |
|
| Transport: |
|
| Port for the HTTP server. |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Enable OpenTelemetry instrumentation (spans, metrics, completion logs). |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
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 -e MCP_TRANSPORT_TYPE=http -p 3010:3010 toolkit-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/toolkit-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Geolocation service — DNS resolution, provider call with retry/backoff, normalization, in-memory cache. |
| Network-diagnostic service plus the shared target validator and private-range classifier. |
| Unit and integration tests mirroring the |
Development guide
See CLAUDE.md / AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools in the
createApp()arrays insrc/index.tsThe two host-probing tools register behind their enable-flags; the network target gate validates after DNS resolution — never fabricate a result for an unlocatable or unreachable target
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Maintenance
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/cyanheads/toolkit-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server