{"openapi":"3.1.0","info":{"title":"Devkit API","version":"0.1.0","description":"Developer utilities: regex, JSON, cron, JWT, encodings, hashes, UUIDs, timestamps, diffs, HTTP status codes — all local.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://devkit.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/devkit/docs"},"termsOfService":"https://connectorbay.com/devkit/terms"},"servers":[{"url":"https://devkit.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/devkit/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/regex_test":{"post":{"operationId":"regex_test","summary":"Test a regex: matches with positions, capture groups and named groups, total count, and an optional replace.","description":"Test a regex: matches with positions, capture groups and named groups, total count, and an optional replace.\n    Use for \"does this pattern match\", \"extract all emails\", \"replace dates\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"pattern":{"description":"Python/PCRE-style regex.","examples":["(\\w+)@(\\w+)\\.com","^\\d{6}$"],"title":"Pattern","type":"string"},"text":{"description":"Text to test against.","title":"Text","type":"string"},"flags":{"default":"","description":"Any of i (ignore case), m (multiline), s (dotall), x (verbose).","title":"Flags","type":"string"},"replace":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Replacement template (\\1 or \\g<name>) to apply.","title":"Replace"},"limit":{"default":50,"maximum":200,"minimum":1,"title":"Limit","type":"integer"}},"required":["pattern","text"],"title":"regex_testArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/json_tool":{"post":{"operationId":"json_tool","summary":"Validate JSON with a plain-language error hint, pretty-print or minify, list all key paths, query a path, or","description":"Validate JSON with a plain-language error hint, pretty-print or minify, list all key paths, query a path, or\n    get type counts and depth. Use for \"why is this JSON invalid\", \"format this\", \"get items[0].name\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"JSON text.","title":"Text","type":"string"},"action":{"default":"validate","description":"validate | format | minify | keys | query | stats","title":"Action","type":"string"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"For query: dotted path like items[0].name or $.a.b[*].c","title":"Path"},"indent":{"default":2,"maximum":8,"minimum":0,"title":"Indent","type":"integer"},"sort_keys":{"default":false,"title":"Sort Keys","type":"boolean"}},"required":["text"],"title":"json_toolArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/cron_explain":{"post":{"operationId":"cron_explain","summary":"Explain a cron expression in words and list its next runs in a time zone. Use for \"what does 0 9 * * 1-5","description":"Explain a cron expression in words and list its next runs in a time zone. Use for \"what does 0 9 * * 1-5\n    mean\", \"when does */15 run next in IST\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"expression":{"description":"Cron expression (5 fields, 6 with seconds, or @daily/@hourly…).","examples":["0 9 * * 1-5","*/15 * * * *","0 0 1 */3 *","@weekly"],"title":"Expression","type":"string"},"timezone":{"default":"UTC","description":"IANA time zone for next runs.","title":"Timezone","type":"string"},"next_runs":{"default":5,"maximum":20,"minimum":1,"title":"Next Runs","type":"integer"}},"required":["expression"],"title":"cron_explainArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/jwt_decode":{"post":{"operationId":"jwt_decode","summary":"Decode a JWT's header and payload without verifying the signature; shows claim times and whether it has","description":"Decode a JWT's header and payload without verifying the signature; shows claim times and whether it has\n    expired. Never trust decoded claims without verification.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"token":{"description":"JWT (header.payload.signature).","title":"Token","type":"string"}},"required":["token"],"title":"jwt_decodeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/encode":{"post":{"operationId":"encode","summary":"Encode or decode text: base64/base64url, URL percent-encoding, hex, HTML entities, unicode escapes, binary,","description":"Encode or decode text: base64/base64url, URL percent-encoding, hex, HTML entities, unicode escapes, binary,\n    ROT13, Morse. Use for \"base64 this\", \"decode %20 string\", \"hex of hello\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"Input text.","title":"Text","type":"string"},"scheme":{"default":"base64","description":"base64 | base64url | url | url_path | hex | html | unicode | binary | rot13 | morse","title":"Scheme","type":"string"},"direction":{"default":"encode","description":"encode | decode","title":"Direction","type":"string"}},"required":["text"],"title":"encodeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/hash_text":{"post":{"operationId":"hash_text","summary":"Hex digests (MD5, SHA-1, SHA-2, SHA-3, BLAKE2, CRC32) or HMACs of a text. Use for \"sha256 of hello\", \"hmac","description":"Hex digests (MD5, SHA-1, SHA-2, SHA-3, BLAKE2, CRC32) or HMACs of a text. Use for \"sha256 of hello\", \"hmac\n    sha256 with key k\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"Input text (UTF-8).","title":"Text","type":"string"},"algorithms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"e.g. ['sha256'], default md5, sha1, sha256, sha512; also sha3_256, blake2b, crc32.","title":"Algorithms"},"hmac_key":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"If given, computes HMACs with this key.","title":"Hmac Key"}},"required":["text"],"title":"hash_textArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/uuid_tool":{"post":{"operationId":"uuid_tool","summary":"Generate UUID v4/v7/v1 or inspect one (validity, version, variant, embedded timestamp for v1/v7). Use for \"give","description":"Generate UUID v4/v7/v1 or inspect one (validity, version, variant, embedded timestamp for v1/v7). Use for \"give\n    me 5 uuids\", \"is this a valid uuid\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"action":{"default":"generate","description":"generate | inspect","title":"Action","type":"string"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"UUID to inspect.","title":"Value"},"count":{"default":1,"maximum":50,"minimum":1,"title":"Count","type":"integer"},"version":{"default":4,"description":"4 (random) | 7 (time-ordered) | 1 (time+node)","title":"Version","type":"integer"}},"title":"uuid_toolArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/timestamp":{"post":{"operationId":"timestamp","summary":"Convert a timestamp or date to unix seconds/ms, ISO UTC, RFC 2822, a chosen zone and a set of world zones,","description":"Convert a timestamp or date to unix seconds/ms, ISO UTC, RFC 2822, a chosen zone and a set of world zones,\n    with weekday, ISO week and relative time. Use for \"1700000000 in IST\", \"what's 2 pm New York in Kolkata\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Unix seconds/ms/µs, ISO 8601, or a date string; omit for now.","examples":["1700000000","2026-09-23T10:00:00Z","23 Sep 2026 14:30"],"title":"Value"},"timezone":{"default":"UTC","description":"IANA zone to interpret naive input and to show.","title":"Timezone","type":"string"},"to_timezones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Zones to convert to (default a world set).","title":"To Timezones"}},"title":"timestampArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/text_diff":{"post":{"operationId":"text_diff","summary":"Unified diff and similarity between two texts (lines added/removed). Use for \"diff these two configs\".","description":"Unified diff and similarity between two texts (lines added/removed). Use for \"diff these two configs\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"a":{"description":"Original text.","title":"A","type":"string"},"b":{"description":"Changed text.","title":"B","type":"string"},"context":{"default":3,"maximum":10,"minimum":0,"title":"Context","type":"integer"},"ignore_whitespace":{"default":false,"title":"Ignore Whitespace","type":"boolean"}},"required":["a","b"],"title":"text_diffArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/http_status":{"post":{"operationId":"http_status","summary":"Meaning and typical cause of an HTTP status code, or the whole table. Use for \"what is HTTP 422\".","description":"Meaning and typical cause of an HTTP status code, or the whole table. Use for \"what is HTTP 422\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"code":{"anyOf":[{"maximum":599,"minimum":100,"type":"integer"},{"type":"null"}],"default":null,"description":"Status code, or omit to list all.","title":"Code"}},"title":"http_statusArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}