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.
Public Hosted Server: https://toolkit.caseyjhand.com/mcp
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 orderRead-only — minting changes nothing — but never idempotent, so a client won't cache or deduplicate a batch
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 ispng_base64also arrives as an MCP image content block, so a client readingcontent[]can render the code without decodingstructuredContentA rendered PNG is bounded at 2048 px per side —
(modules + 2 × margin) × scale— so a dense symbol at a highscaleis rejected with a typedraster_too_largeerror naming a scale that fits;svgandterminalare unboundeddatais 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
proxy,hosting, andmobileflag when the address is a proxy/VPN/Tor exit, a datacenter network, or a mobile carrier — atrueon any of them means the coordinates describe infrastructure, not a person. Absent when the provider doesn't report themA 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
Provider-supplied strings are truncated and stripped of control characters before they reach the response, so registry-controlled text (
org,isp,as) cannot flood or format a model's contextKeyless by default (ip-api free tier, which is plaintext HTTP — see
TOOLKIT_GEO_BASE_URL); results are cached in memory by resolved IP under a fixed entry cap
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
Public Hosted Instance
A public instance is available at https://toolkit.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "streamable-http",
"url": "https://toolkit.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
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.0 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. |
|
| API key for the geolocation endpoint, if it requires one. | none |
| Base URL for an ip-api-compatible geolocation endpoint. The default is plaintext HTTP — ip-api's HTTPS endpoint is not part of the keyless free tier and answers |
|
| 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.
Available Tools
5 toolstoolkit_encode_valuetoolkit-mcp-server: encode valueARead-onlyIdempotentInspect
Encode or decode a value across base64, base64url, hex, or URL (percent) encoding, in either direction. Set operation to "encode" to transform raw UTF-8 text into the chosen encoding, or "decode" to recover the original text from an encoded value. base64url uses the URL-safe alphabet (- and _ instead of + and /); url applies encodeURIComponent / decodeURIComponent. Decoding a value that is malformed for the chosen encoding is reported as a recoverable error, not a silent best-effort.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The value to transform — raw text for encode, an encoded string for decode. | |
| encoding | Yes | The encoding to apply: base64, URL-safe base64url, hex, or URL percent-encoding. | |
| operation | Yes | "encode" transforms text into the encoding; "decode" recovers text from an encoded value. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| result | No | The transformed value (encoded text, or the decoded original). |
| encoding | No | The encoding that was applied. |
| operation | No | The operation that was performed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already supply readOnlyHint and idempotentHint, and the description adds strong behavioral context beyond that: base64url alphabet substitution, encodeURIComponent/decodeURIComponent semantics, and recoverable-error behavior for malformed decodes. This tells the agent exactly what to expect without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences: the first states scope, the second explains operation semantics, and the third adds essential encoding-specific and error behavior. No filler, repetition of schema fields, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateless encode/decode utility with an output schema and fully documented parameters, this is complete: it covers all four encodings, both directions, and the failure mode. Nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the schema (100% coverage), so the baseline is 3. The description adds extra practical meaning for encoding ('base64url uses the URL-safe alphabet', 'url applies encodeURIComponent / decodeURIComponent') and clarifies that value is raw text for encode vs an encoded string for decode, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: encode or decode a value across four named encodings, in either direction. This clearly distinguishes it from siblings like hashing, ID generation, QR generation, and IP geolocation without needing to inspect them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit operation-level guidance: set operation to "encode" or "decode" depending on the desired direction, with clear expectations for each. It does not name alternative tools or exclusion criteria, so sibling differentiation is implicit by domain rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolkit_generate_idtoolkit-mcp-server: generate idARead-onlyInspect
Mint cryptographically-random identifiers using the platform CSPRNG — the correct source for IDs that must be unpredictable, unlike model-generated values. type selects the format: uuid_v4 (random, the default), uuid_v7 (time-ordered, sortable by creation), or ulid (26-char Crockford-base32, lexicographically sortable). Set count to mint a batch in one call (up to 1000); the returned ids array always contains exactly count values and is never truncated. For uuid_v7 and ulid, a batch is monotonic — strictly increasing even within the same millisecond — so the ids array stays in sorted creation order. IDs from this tool feed into toolkit_generate_qr (pass ids[0] as data) to create a scannable code.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Identifier format: uuid_v4 (random), uuid_v7 (time-ordered), or ulid (sortable Crockford-base32). | uuid_v4 |
| count | No | How many identifiers to mint (1–1000). The full batch is always returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ids | No | The minted identifiers — exactly count of them, in mint order; for uuid_v7 and ulid that order is strictly increasing (sorted by creation). |
| type | No | The identifier format that was minted. |
| count | No | The number of identifiers minted (equals the requested count). |
| error | No | Present when the call failed. Absent on success. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and idempotentHint=false. The description enriches this by clarifying that the result is cryptographically random, that the ids array always contains exactly count values and is never truncated, and that batches for uuid_v7/ulid are monotonic and sorted. These behavioral details go beyond what annotations provide, though it does not mention failure modes or performance characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph with zero filler. It front-loads the core purpose, then details types and count, then adds behavioral guarantees and a cross-reference to a related tool. Every sentence earns its place and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given only 2 parameters, 100% schema coverage, and a provided output schema, the description is complete. It covers the purpose, usage, parameter semantics, behavioral guarantees, and even a downstream use case. There is nothing an agent needs to know to call it correctly that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% description coverage for both parameters. The description adds value by explaining the semantic difference between uuid_v4, uuid_v7, and ulid (including sortability), the default behavior, and the monotonic ordering within a batch — none of which are in the schema descriptions. It also clarifies the count semantics (exact return size).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Mint cryptographically-random identifiers') and a precise resource ('platform CSPRNG'), and immediately distinguishes it from the alternative of model-generated values. It also names the three output formats with their distinct properties, so an agent can clearly tell this tool apart from siblings like toolkit_hash_value or toolkit_generate_qr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('IDs that must be unpredictable') and when not ('unlike model-generated values'), and it names a concrete downstream use case (feed ids[0] into toolkit_generate_qr). This leaves no ambiguity about the appropriate context of use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolkit_generate_qrtoolkit-mcp-server: generate QR codeARead-onlyIdempotentInspect
Encode text or a URL into a QR code. data is the content to encode (a link, a generated identifier such as toolkit_generate_id's ids[0], or any string). format selects the output: svg returns inline SVG markup, png_base64 returns base64-encoded PNG bytes (with mimeType and byteLength), and terminal returns a block of Unicode block characters renderable in a monospace terminal. errorCorrection (L/M/Q/H) trades data capacity for damage tolerance, margin sets the quiet-zone width, and scale sets pixels per module for raster output. The returned version (1–40) reflects how dense the encoded data is. png_base64 renders (modules + 2 × margin) × scale pixels per side and rejects anything past 2048 px with a typed raster_too_large error, so a dense symbol needs a lower scale; svg carries no such limit.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The text or URL to encode. 2953 is the absolute ceiling (QR version 40, level L, byte mode); usable capacity drops at higher errorCorrection levels, so over-capacity data is rejected with a typed data_too_large error rather than a generic failure. | |
| scale | No | Pixels per module for raster (png_base64) output. Ignored for terminal. png_base64 also bounds the whole image at 2048 px per side, so a dense symbol or a wide margin admits a lower scale than 32. | |
| format | No | Output format: svg markup, png_base64 (raster bytes), or a terminal-renderable string. | svg |
| margin | No | Quiet-zone width in modules around the symbol. The spec recommends 4. | |
| errorCorrection | No | Error-correction level: L (~7% recoverable) to H (~30%). Higher tolerance lowers data capacity. | M |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| format | No | The format that was produced. |
| content | No | The QR artifact: SVG markup, a terminal-renderable string, or base64 PNG bytes for png_base64. |
| version | No | QR symbol version (1–40); higher versions hold denser data and indicate denser content. |
| mimeType | No | MIME type of content for image formats. Absent for the terminal format. |
| byteLength | No | Decoded byte size of the PNG. Present only for png_base64. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important runtime behavior: exact output forms per format, the returned QR version, the png_base64 pixel formula, the 2048-pixel rejection limit, and the typed raster_too_large error. It also notes that svg has no such size limit, which is valuable behavioral context an agent cannot infer from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then proceeds logically through data, format, error correction, margin, scale, and constraints. Every sentence adds practical information, and the detail is proportionate to the tool's five-parameter complexity with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, an output schema, and the presence of siblings, the description covers everything needed to invoke the tool correctly: parameter semantics, format-specific behavior, capacity limits, error types, and interaction effects. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 100%, the description enriches the parameters substantially by explaining how they interact: errorCorrection trades capacity for damage tolerance, scale is bounded by image size, and dense data may force a lower scale. It also clarifies return-value details like mimeType and byteLength, adding meaning beyond the raw schema entries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Encode text or a URL into a QR code.' It then enumerates the three output formats, making it unmistakable what the tool produces and clearly distinguishing it from siblings like toolkit_hash_value, toolkit_encode_value, and toolkit_generate_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes when it is appropriate to use the tool by explaining its purpose and giving concrete examples of valid data, including a generated identifier from toolkit_generate_id. It does not explicitly list when-not-to-use cases or name alternative tools as a routing hint, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolkit_geolocate_iptoolkit-mcp-server: geolocate IPARead-onlyIdempotentInspect
Resolve a public IP address (or hostname) to geographic and network metadata: country, region, city, latitude/longitude, the owning ASN and organization, timezone, and the proxy/hosting/mobile quality flags. target accepts an IPv4/IPv6 address or a hostname — a hostname is DNS-resolved first and the resolvedIp field echoes which IP was actually located. The provider is called directly (never the target), so this is SSRF-free and safe to expose anywhere. Results are best-effort and provider-bounded: VPNs, proxies, mobile NAT, and anycast all defeat IP-to-location, accuracy is city-level at best, and many fields can be absent for reserved or thinly-documented ranges — absent fields are reported as unknown, never invented. Read proxy, hosting, and mobile before trusting the coordinates: a true on any of them means the location describes infrastructure, not the user. Private/reserved addresses have no public geolocation and are rejected. The source field names which provider answered.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | A public IPv4/IPv6 address or a hostname (e.g. "8.8.8.8" or "example.com"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| asn | No | Autonomous System number, e.g. "AS15169". Absent on providers that omit it. |
| org | No | Owning organization or ISP, e.g. "Google LLC". Absent when unknown. |
| city | No | City name. Absent when unknown. |
| error | No | Present when the call failed. Absent on success. |
| proxy | No | True when the address is a known proxy, VPN, or Tor exit — the location describes the exit node, not the user. Absent when the provider does not report it. |
| mobile | No | True when the address belongs to a mobile carrier network, where NAT can place the location far from the device. Absent when unreported. |
| region | No | Region or state name. Absent when unknown. |
| source | No | The provider that answered the lookup, e.g. "ip-api". |
| target | No | The target as supplied (IP or hostname). |
| country | No | Country name. Absent when the provider does not report it. |
| hosting | No | True when the address belongs to a hosting or datacenter network, so the location is a facility rather than a person. Absent when unreported. |
| latitude | No | Latitude in decimal degrees. Absent when unknown. |
| timezone | No | IANA timezone, e.g. "America/Los_Angeles". Absent when unknown. |
| longitude | No | Longitude in decimal degrees. Absent when unknown. |
| resolvedIp | No | The IP that was actually located (a supplied hostname is resolved to this first). |
| countryCode | No | ISO 3166-1 alpha-2 country code. Absent when unknown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false already in annotations, the bar is lower, yet the description still adds real context: the provider is called directly (never the target), so it is safe on untrusted input; accuracy is provider-bounded; behavior on private/reserved ranges is stated; proxy/VPN/mobile flags are defined as reliability warnings; and the source field is disclosed. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All four sentences are substantive and the operation is stated up front in the first sentence, with caveats and security notes after. No filler. Minor redundancy between 'accuracy is best-effort' and 'VPNs, proxies, anycast...' slightly thins the density, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param, read-only tool whose output is not schema-described, the description covers: the input types, DNS resolution behavior, the output fields, the meaning of proxy/mobile flags for reliability, and failure modes (private ranges rejected). An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the single param is fully defined with three alternates: IPv4, IPv6, hostname). The description adds value beyond the schema by stating that hostnames are DNS-resolved first and that the resolved address is echoed in the response — behavior the schema cannot express. Slightly more caveat detail (e.g., punycode) would push to 5, but coverage is already high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a clear verb-resource pair — resolve a public IP or hostname to a set of geographic and network metadata — and enumerates every returned field, so an agent immediately knows what it does and what it returns. It also carves out scope (public only) that distinguishes it in a toolkit whose other tools are QR, hash, and weather related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when results are reliable and when they are not (VPNs, proxies, anycast, mobile NAT, reserved ranges), which is implicit guidance to the caller on trusting the output. It does not explicitly contrast with a sibling geolocation alternative, but the sibling set contains no competing tool, so a 4 is appropriate rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toolkit_hash_valuetoolkit-mcp-server: hash valueARead-onlyIdempotentInspect
Generate a cryptographic digest of a value, or verify a value against an expected digest. Set operation to "generate" for a lowercase-hex digest, or "compare" to constant-time-check value against the expected digest — compare is timing-safe and avoids manual string equality checks. Algorithm defaults to sha256; sha512 is also secure, while md5 and sha1 are exposed for checksum and file-integrity compatibility ONLY and must not be used for passwords, signatures, or any security purpose. inputEncoding controls how value and expected are read before hashing (utf8 default, or hex/base64 for raw binary data) so binary blobs need no decode round-trip. The canonical use is matching a download against a vendor-published checksum.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | The data to hash, interpreted per inputEncoding (raw text by default). | |
| expected | No | The expected lowercase-hex digest to compare against. Required when operation is "compare". | |
| algorithm | No | Digest algorithm. sha256 (default) or sha512 for security; md5/sha1 are checksum/compat only — not for security. | sha256 |
| operation | No | "generate" produces a digest; "compare" constant-time-checks value against expected. | generate |
| inputEncoding | No | How value (and expected's pre-image, when relevant) is decoded before hashing: utf8 text, hex, or base64. | utf8 |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| digest | No | Lowercase-hex digest of value. Present for operation "generate". |
| matches | No | Constant-time equality of the computed digest against expected. Present for operation "compare". |
| algorithm | No | The algorithm used. |
| operation | No | The operation performed. |
| lengthInBytes | No | Digest size in bytes (32 for sha256, 64 for sha512, 20 for sha1, 16 for md5). Present for "generate". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the tool's safety profile. The description adds value beyond these: it reveals the timing-safe nature of compare, security caveats for md5/sha1, and the encoding behavior that prevents decode round-trips for binary blobs. It does not contradict annotations or mention any side effects, so the behavioral disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but logically structured, starting with the core purpose, then operation, algorithm, encoding, and a canonical use case. Each sentence carries specific information with minimal fluff. It is slightly longer than necessary but remains efficient, and the front-loaded purpose ensures quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers the key behaviors: operation modes, algorithm choices, encoding implications, and the primary use case. Minor gaps exist (e.g., error behavior for missing expected in compare), but these are covered by the schema's required field and are acceptable for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (each param has a description), giving a baseline of 3. The description enhances this with meaningful additions: algorithm security guidance, operation semantics (timing-safe compare), and inputEncoding purpose (hex/base64 for raw binary). It clarifies the relationship between operation, expected, and inputEncoding, going beyond the bare schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource pair: 'Generate a cryptographic digest of a value, or verify a value against an expected digest.' It clearly distinguishes between the two operations (generate/compare) and is unambiguous. The sibling tools (id generation, QR, encoding, geolocation) share no overlap, so the tool's purpose stands apart without needing additional differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides practical context: 'The canonical use is matching a download against a vendor-published checksum.' It also gives explicit algorithm guidance (sha256/sha512 for security, md5/sha1 only for checksum compatibility) and explains when compare is preferable ('constant-time-check ... timing-safe and avoids manual string equality checks'). While it doesn't name alternative tools, there are no direct competitors among siblings, so the guidance is sufficient for appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct operation: hashing, ID generation, QR generation, encoding/decoding, and IP geolocation. Even the two 'value' tools are cleanly separated by function—one is a cryptographic digest, the other is reversible character encoding. There is no realistic overlap that would cause an agent to mis-select.
All tools share the 'toolkit_' prefix and follow a snake_case verb_noun pattern: hash_value, generate_id, generate_qr, encode_value, geolocate_ip. The style is uniform and predictable, with no mixed case or arbitrary abbreviations.
Five tools is within the comfortable range for a helper server, and each tool earns its place as a separate, non-redundant utility. The slight deduction is because the broad 'toolkit' framing implies a larger helper surface, so the set feels a little lean but not problematically so.
Each utility covers a solid subset: hash and compare, multiple ID formats, several output encodings, and QR generation with multiple formats. However, as a general-purpose toolkit there are missing adjacent capabilities such as QR decoding, HMAC or fingerprint support, and broader string utility functions, so the overall domain coverage is plausible but not comprehensive.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Real-time planetary signal engine and Model Context Protocol (MCP) server for autonomous AI agents.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive Model Context Protocol server implementation that enables AI assistants to interact with file systems, databases, GitHub repositories, web resources, and system tools while maintaining security and control.812MIT
- AlicenseBqualityFmaintenanceA comprehensive Model Context Protocol server providing access to 70+ IT tools for developers and system administrators, including encoding/decoding, text manipulation, hashing, and network utilities.10015322TypeScriptMIT
- FlicenseNot gradedqualityCmaintenanceA secure Model Context Protocol server providing HTTP endpoints for AI agent tool execution, including file system operations, shell commands, and LLM-based code generation.1
- AlicenseAqualityDmaintenanceA Model Context Protocol server providing network diagnostic tools for AI agents, including connectivity testing, batch operations, local network info, and pcap analysis.344MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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