Search / io.github.cyanheads/toolkit-mcp-server
toolkit-mcp-server
R0· no sign-inGenerate IDs, QR codes, and hashes, encode values, geolocate IPs, plus gated host diagnostics.
v2.3.3 · active · repository · descriptor JSON · versions
Search / io.github.cyanheads/toolkit-mcp-server
R0· no sign-inGenerate IDs, QR codes, and hashes, encode values, geolocate IPs, plus gated host diagnostics.
v2.3.3 · active · repository · descriptor JSON · versions
{
"mcpServers": {
"toolkit-mcp-server": {
"type": "http",
"url": "https://toolkit.caseyjhand.com/mcp"
}
}
}claude mcp add --transport http toolkit-mcp-server https://toolkit.caseyjhand.com/mcp[mcp_servers.toolkit-mcp-server]
url = "https://toolkit.caseyjhand.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"toolkit-mcp-server": {
"type": "remote",
"url": "https://toolkit.caseyjhand.com/mcp",
"enabled": true
}
}
}{
"mcpServers": {
"toolkit-mcp-server": {
"type": "http",
"url": "https://toolkit.caseyjhand.com/mcp"
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=toolkit-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vdG9vbGtpdC5jYXNleWpoYW5kLmNvbS9tY3AifQ%3D%3D"
}{
"servers": {
"toolkit-mcp-server": {
"type": "http",
"url": "https://toolkit.caseyjhand.com/mcp"
}
}
}{
"mcpServers": {
"toolkit-mcp-server": {
"httpUrl": "https://toolkit.caseyjhand.com/mcp"
}
}
}extensions:
"toolkit-mcp-server":
enabled: true
name: "toolkit-mcp-server"
type: streamable_http
uri: "https://toolkit.caseyjhand.com/mcp"
timeout: 300
protocol.modernsupports 2026-07-28 (server/discover)protocol.statelessanswers without a sessionprotocol.transportstreamable HTTPprotocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every useauth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptionsevery tool has a descriptiontools.description_length3 tools have descriptions over 1,024 characters, which crowds the contexttools.schemasevery tool has an object input schematools.annotations5 of 5 tools declare readOnlyHint or destructiveHinttools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: toolkit_hash_value (destructiveHint); toolkit_generate_id (destructiveHint); toolkit_generate_qr (destructiveHint); …tools.token_costabout 3,145 tokens to load every tooltools.api_dumptools are not a one-to-one API dumpstability.changes5 tool changes in 30 daysstability.rug_pull1 tools kept their name but changed most of their description in 30 days; review before trusting themdeps.known_vulnsno known advisory in 132 resolved packagesdeps.mcp_sdk_version@modelcontextprotocol/core 2.3.1, no known advisorydeps.resolvable@cyanheads/[email protected], @cyanheads/[email protected] resolved: 132 packagestoolkit_geolocate_ipchangeddescription, input schema, output schemameaning changedResolve 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.
Resolve a public IP or dotted hostname to country, region, city, coordinates, ASN, organization, timezone, and proxy/hosting/mobile flags. Supply target for one lookup or targets for an ordered batch, never both; blank target and empty targets are unset. Batches process the first 100 positions (duplicates retained) and disclose every remainder in unprocessedTargets; at most 1000 inputs are accepted. Each batch position reports its result or an error with recovery, so cached and local outcomes survive quota refusals. The provider is called directly, never the target. Hostnames are DNS-resolved and resolvedIp names the located address. Private/reserved addresses have no public geolocation. Results are best-effort, city-level at best; VPNs, proxies, mobile NAT, and anycast defeat IP-to-location. Read proxy, hosting, and mobile before trusting coordinates: true describes infrastructure, not the user. Absent metadata remains unknown. source names the provider. Single and batch quotas are independent; cache hits consume neither quota.
toolkit_encode_valuechangeddescription, input schema, output schemaEncode 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.
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 bytes from an encoded value. Decoded bytes come back as UTF-8 text by default; set outputEncoding to "hex" or "base64" to receive them re-encoded instead, which is lossless for binary data and transcodes between encodings (a base64 digest to hex, for example). Decoding never substitutes replacement characters: bytes that are not valid UTF-8 text are reported as a recoverable error that points at outputEncoding. Whitespace in hex, base64, and base64url values is ignored, so line-wrapped MIME bodies and PEM bodies decode as-is (drop PEM's -----BEGIN/END----- lines, which are not base64). base64url uses the URL-safe alphabet (- and _ instead of + and /); url applies encodeURIComponent and percent-decoding. A value that is malformed for the chosen encoding is reported as a recoverable error, not a silent best-effort.
toolkit_generate_qrchangeddescription, input schema, output schemaEncode 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.
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 sized in pixels, png_base64 returns base64-encoded PNG bytes (with mimeType and byteLength), and terminal returns plain Unicode half-block characters (no escape codes) for a monospace display, drawn for a dark background: light modules, quiet zone included, are blocks and dark modules are spaces. errorCorrection (L/M/Q/H) trades data capacity for damage tolerance, margin sets the quiet-zone width in modules, and scale sets pixels per module for svg and png_base64, so both are (modules + 2 × margin) × scale pixels per side. The returned version (1–40) reflects how dense the encoded data is. png_base64 rejects an image past 2048 px per side with a typed raster_too_large error, so a dense symbol needs a lower scale; svg is vector markup and carries no such limit.
toolkit_generate_idchangeddescription, output schemaMint 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.
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 minted in the same millisecond are separated by random gaps, so no id in a batch can be derived from another. IDs from this tool feed into toolkit_generate_qr (pass ids[0] as data) to create a scannable code.
toolkit_hash_valuechangeddescription, input schema, output schemaGenerate 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.
Generate a cryptographic digest of a value, or verify a value against an expected digest. Set operation to "generate" for a digest, or "compare" to constant-time-check value against the expected digest — compare is timing-safe and avoids manual string equality checks. Omitting operation compares when expected is supplied and generates otherwise. Algorithm defaults to sha256; sha384 and sha512 are 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. digestEncoding selects the generated digest form: lowercase hex (default), base64, or sri (<algorithm>-<base64>, the npm lockfile integrity and Subresource Integrity form, sha256/sha384/sha512 only). expected is accepted as hex, base64, or SRI, recognized by its shape at the algorithm's digest length, so a published checksum can be pasted as-is; an SRI value may hold several space-separated entries, as an npm integrity field can, and matches when any entry for algorithm does. inputEncoding controls how value is 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 or a lockfile integrity entry.
Full history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo +reachable +uptime-100% +updated-6d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
@cyanheads/[email protected] npm65 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19
No known advisory affects this dependency graph.
@cyanheads/[email protected] npm65 dependencies, resolved · MCP SDK @modelcontextprotocol/core 2.3.1 · advisories checked 2026-10-19
No known advisory affects this dependency graph.
Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://toolkit.caseyjhand.com/mcp streamable-http | none | yes | 100% | 187 ms | 2026-07-28 | 2026-10-20 |
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
@cyanheads/toolkit-mcp-server | npm | 2.3.3 | npx | TOOLKIT_GEO_API_KEY |
@cyanheads/toolkit-mcp-server | npm | 2.3.3 | npx | TOOLKIT_GEO_API_KEY |
toolkit_encode_valueread-only | 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 bytes from an encoded value. Decoded bytes come back as UTF-8 text by default; set outputEncoding to "hex" or "base64" to receive them re-encoded instead, which is lossless for binary data and transcodes between encodings (a base64 digest to hex, for example). Decoding never substitutes replacement characters: bytes that are not valid UTF-8 text are reported as a recoverable error that points at outputEncoding. Whitespace in hex, base64, and base64url values is ignored, so line-wrapped MIME bodies and PEM bodies decode as-is (drop PEM's -----BEGIN/END----- lines, which are not base64). base64url uses the URL-safe alphabet (- and _ instead of + and /); url applies encodeURIComponent and percent-decoding. A value that is malformed for the chosen encoding is reported as a recoverable error, not a silent best-effort. |
toolkit_generate_idread-only | 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 minted in the same millisecond are separated by random gaps, so no id in a batch can be derived from another. IDs from this tool feed into toolkit_generate_qr (pass ids[0] as data) to create a scannable code. |
toolkit_generate_qrread-only | 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 sized in pixels, png_base64 returns base64-encoded PNG bytes (with mimeType and byteLength), and terminal returns plain Unicode half-block characters (no escape codes) for a monospace display, drawn for a dark background: light modules, quiet zone included, are blocks and dark modules are spaces. errorCorrection (L/M/Q/H) trades data capacity for damage tolerance, margin sets the quiet-zone width in modules, and scale sets pixels per module for svg and png_base64, so both are (modules + 2 × margin) × scale pixels per side. The returned version (1–40) reflects how dense the encoded data is. png_base64 rejects an image past 2048 px per side with a typed raster_too_large error, so a dense symbol needs a lower scale; svg is vector markup and carries no such limit. |
toolkit_geolocate_ipread-only | Resolve a public IP or dotted hostname to country, region, city, coordinates, ASN, organization, timezone, and proxy/hosting/mobile flags. Supply target for one lookup or targets for an ordered batch, never both; blank target and empty targets are unset. Batches process the first 100 positions (duplicates retained) and disclose every remainder in unprocessedTargets; at most 1000 inputs are accepted. Each batch position reports its result or an error with recovery, so cached and local outcomes survive quota refusals. The provider is called directly, never the target. Hostnames are DNS-resolved and resolvedIp names the located address. Private/reserved addresses have no public geolocation. Results are best-effort, city-level at best; VPNs, proxies, mobile NAT, and anycast defeat IP-to-location. Read proxy, hosting, and mobile before trusting coordinates: true describes infrastructure, not the user. Absent metadata remains unknown. source names the provider. Single and batch quotas are independent; cache hits consume neither quota. |
toolkit_hash_valueread-only | Generate a cryptographic digest of a value, or verify a value against an expected digest. Set operation to "generate" for a digest, or "compare" to constant-time-check value against the expected digest — compare is timing-safe and avoids manual string equality checks. Omitting operation compares when expected is supplied and generates otherwise. Algorithm defaults to sha256; sha384 and sha512 are 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. digestEncoding selects the generated digest form: lowercase hex (default), base64, or sri (<algorithm>-<base64>, the npm lockfile integrity and Subresource Integrity form, sha256/sha384/sha512 only). expected is accepted as hex, base64, or SRI, recognized by its shape at the algorithm's digest length, so a published checksum can be pasted as-is; an SRI value may hold several space-separated entries, as an npm integrity field can, and matches when any entry for algorithm does. inputEncoding controls how value is 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 or a lockfile integrity entry. |
Schemas: list_tools.
And 140 more from this publisher.
{
"name": "io.github.cyanheads/toolkit-mcp-server",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://toolkit.caseyjhand.com/mcp",
"type": "streamable-http"
}
],
"version": "2.3.3",
"packages": [
{
"version": "2.3.3",
"transport": {
"type": "stdio"
},
"identifier": "@cyanheads/toolkit-mcp-server",
"runtimeHint": "npx",
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"environmentVariables": [
{
"name": "MCP_LOG_LEVEL",
"format": "string",
"default": "info",
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
},
{
"name": "TOOLKIT_ENABLE_NET_DIAGNOSTICS",
"format": "string",
"default": "false",
"description": "Register the gated toolkit_check_network tool. Off by default — leave off for hosted/shared deployments."
},
{
"name": "TOOLKIT_ENABLE_SYSTEM_INFO",
"format": "string",
"default": "false",
"description": "Register the gated toolkit_check_system tool. Off by default — only meaningful on a local deployment."
},
{
"name": "TOOLKIT_ALLOW_PRIVATE_NETWORK",
"format": "string",
"default": "false",
"description": "With network diagnostics enabled, permit private/reserved/loopback targets. The second explicit gate; off by default."
},
{
"name": "TOOLKIT_GEO_API_KEY",
"format": "string",
"isSecret": true,
"description": "API key for the geolocation endpoint, if it requires one. The default ip-api tier is keyless."
},
{
"name": "TOOLKIT_GEO_BASE_URL",
"format": "string",
"default": "http://ip-api.com",
"description": "Base URL for an ip-api-compatible geolocation endpoint. Default is the keyless ip-api endpoint, which is plaintext HTTP."
},
{
"name": "TOOLKIT_GEO_CACHE_TTL_SECONDS",
"format": "string",
"default": "3600",
"description": "Geolocation cache TTL in seconds. Geolocation is stable, so repeats are cached."
},
{
"name": "TOOLKIT_GEO_RATE_LIMIT_PER_MIN",
"format": "string",
"default": "45",
"description": "Max geolocation requests per minute; excess requests are rejected with a retryable rate-limit error. Default 45 matches the ip-api free tier."
},
{
"name": "TOOLKIT_GEO_BATCH_RATE_LIMIT_PER_MIN",
"format": "string",
"default": "15",
"description": "Independent batch geolocation requests per minute; excess requests fail immediately with wait and recovery guidance."
}
]
},
{
"version": "2.3.3",
"transport": {
"url": "http://localhost:3010/mcp",
"type": "streamable-http"
},
"identifier": "@cyanheads/toolkit-mcp-server",
"runtimeHint": "npx",
"registryType": "npm",
"registryBaseUrl": "https://registry.npmjs.org",
"environmentVariables": [
{
"name": "MCP_TRANSPORT_TYPE",
"value": "http",
"format": "string",
"description": "Selects the HTTP transport."
},
{
"name": "MCP_HTTP_HOST",
"format": "string",
"default": "127.0.0.1",
"description": "The hostname for the HTTP server."
},
{
"name": "MCP_HTTP_PORT",
"format": "string",
"default": "3010",
"description": "The port to run the HTTP server on."
},
{
"name": "MCP_HTTP_ENDPOINT_PATH",
"format": "string",
"default": "/mcp",
"description": "The endpoint path for the MCP server."
},
{
"name": "MCP_AUTH_MODE",
"format": "string",
"default": "none",
"description": "Authentication mode to use: 'none', 'jwt', or 'oauth'."
},
{
"name": "MCP_LOG_LEVEL",
"format": "string",
"default": "info",
"description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
},
{
"name": "TOOLKIT_ENABLE_NET_DIAGNOSTICS",
"format": "string",
"default": "false",
"description": "Register the gated toolkit_check_network tool. Off by default — leave off for hosted/shared deployments."
},
{
"name": "TOOLKIT_ENABLE_SYSTEM_INFO",
"format": "string",
"default": "false",
"description": "Register the gated toolkit_check_system tool. Off by default — only meaningful on a local deployment."
},
{
"name": "TOOLKIT_ALLOW_PRIVATE_NETWORK",
"format": "string",
"default": "false",
"description": "With network diagnostics enabled, permit private/reserved/loopback targets. The second explicit gate; off by default."
},
{
"name": "TOOLKIT_GEO_API_KEY",
"format": "string",
"isSecret": true,
"description": "API key for the geolocation endpoint, if it requires one. The default ip-api tier is keyless."
},
{
"name": "TOOLKIT_GEO_BASE_URL",
"format": "string",
"default": "http://ip-api.com",
"description": "Base URL for an ip-api-compatible geolocation endpoint. Default is the keyless ip-api endpoint, which is plaintext HTTP."
},
{
"name": "TOOLKIT_GEO_CACHE_TTL_SECONDS",
"format": "string",
"default": "3600",
"description": "Geolocation cache TTL in seconds. Geolocation is stable, so repeats are cached."
},
{
"name": "TOOLKIT_GEO_RATE_LIMIT_PER_MIN",
"format": "string",
"default": "45",
"description": "Max geolocation requests per minute; excess requests are rejected with a retryable rate-limit error. Default 45 matches the ip-api free tier."
},
{
"name": "TOOLKIT_GEO_BATCH_RATE_LIMIT_PER_MIN",
"format": "string",
"default": "15",
"description": "Independent batch geolocation requests per minute; excess requests fail immediately with wait and recovery guidance."
}
]
}
],
"repository": {
"url": "https://github.com/cyanheads/toolkit-mcp-server",
"source": "github"
},
"description": "Generate IDs, QR codes, and hashes, encode values, geolocate IPs, plus gated host diagnostics."
}