{"name":"com.ainetcafe/netcafe-devkit","slug":"ainetcafe-netcafe-devkit","title":null,"description":"JSON/YAML, regex, diff, JWT, SQL dialects — the keyless millisecond ops an agent needs mid-task.","url":"https://mcp.market/server/ainetcafe-netcafe-devkit","rating":null,"grade":"B","score":76,"certified":false,"status":"active","category":"data","tags":["data","productivity","ai"],"presence":{"score":21,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-08-16T06:53:22.000Z","license":null},"uptime":{"percent":100,"checks":21,"ok":21,"last_checked_at":"2026-09-24T11:51:14.580Z","last_ok_at":"2026-09-24T11:51:14.580Z","latency_ms":706},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/mario03690/ai-netcafe","website":"https://ainetcafe.com/mcp.html","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://ainetcafe.com/mcp/dev?s=registry"}],"packages":[],"tools":[{"name":"diff_text","description":"Returns which lines were added and which were removed, with line numbers — computed with a longest-common-subsequence, not guessed by a model. Use to compare two versions of a config, a document, or any command output, instead of asking an LLM to eyeball two blobs and hoping it notices.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"a":{"type":"string","description":"The first (before) text."},"b":{"type":"string","description":"The second (after) text."}},"required":["a","b"]}},{"name":"json_format","description":"Validate and pretty-print JSON (2-space indent). Reports the error location if invalid.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"json":{},"url":{},"indent":{"type":"number"}},"additionalProperties":true}},{"name":"json_yaml","description":"Converts JSON to YAML or YAML to JSON. It works out which one you gave it, so you do not have to say. A parse failure comes back with the parser message instead of silently producing something that looks fine and is not. Use when a config, a CI file, or a Kubernetes manifest needs to be in the other format.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"The JSON or YAML content."},"to":{"type":"string","description":"Optional: \"json\" or \"yaml\" to force the direction."}},"required":["text"]}},{"name":"jwt_decode","description":"Decodes the header and payload of a JWT and reports issued-at / expiry as readable timestamps plus seconds remaining. The signature is NOT verified and the response says so — decoding is fine for debugging a token you already hold, but never treat these values as proof of anything; verification needs the secret and belongs in your own service.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"The JWT string."}},"required":["token"]}},{"name":"make_qr","description":"Any text or URL → a QR code PNG you can embed or download. Stateless URL form: https://ainetcafe.com/i/qr/<text>","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"The text or URL to encode."}},"required":["text"]}},{"name":"redact_text","description":"Strip emails, phone numbers, ID numbers, API keys, private keys, JWTs, card numbers and IPs out of text, returning the redacted text plus a mapping table to restore them afterwards. Rule-based only — no model sees the input. The same value always maps to the same placeholder, so the answer can be restored.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"The text to redact."},"only":{"type":"string","description":"Optional comma-separated subset, e.g. \"EMAIL,API_KEY,PRIVATE_KEY\"."}},"required":["text"]}},{"name":"regex_test","description":"Runs a regular expression against sample text and returns every match with its position and capture groups (named groups included). Use before wiring a pattern into code, instead of guessing whether the escaping survived the trip through JSON and the shell.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"pattern":{"type":"string","description":"The regular expression, without surrounding slashes."},"text":{"type":"string","description":"The text to test against."},"flags":{"type":"string","description":"Optional flags, e.g. \"gi\". Default \"g\"."}},"required":["pattern","text"]}},{"name":"screenshot_url","description":"Full-page screenshot of any URL → PNG. The same job screenshot APIs charge $7-79/month for.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{},"width":{"type":"number"}},"additionalProperties":true}},{"name":"sql_from_description","description":"Plain-language request + table schema → ready-to-run .sql file with comments.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"request":{},"schema":{"type":"string"},"dialect":{}},"additionalProperties":true}},{"name":"timezone_convert","description":"Convert a time between time zones, or get current time in any zone. from/to = IANA zone (Asia/Shanghai), time = YYYY-MM-DDTHH:mm (default now).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"to":{"type":"string"},"from":{"type":"string"},"time":{"type":"string"}},"additionalProperties":true}},{"name":"transpile_sql","description":"Convert a SQL statement from one dialect to another — mysql, postgres, sqlite, tsql, oracle, snowflake, bigquery, redshift, spark, hive, presto, trino, duckdb, clickhouse, databricks, doris, starrocks and more. Deterministic parser (sqlglot), not an LLM: the same input always produces the same output, and syntax errors come back with the exact line and column. Use it when migrating queries between databases or debugging dialect-specific syntax.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"sql":{"type":"string","description":"The SQL statement (or several, separated by semicolons)."},"read":{"type":"string","description":"Source dialect, e.g. \"mysql\". Omit to auto-detect from generic SQL."},"write":{"type":"string","description":"Target dialect, e.g. \"postgres\", \"bigquery\", \"doris\"."}},"required":["sql","write"]}},{"name":"unit_convert","description":"Convert units: length, weight, temperature, area, volume, speed, data size. value + from + to (e.g. 100 km mi, 25 c f).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"value":{"type":"number"},"from":{"type":"string"},"to":{"type":"string"}},"additionalProperties":true}},{"name":"validate_json","description":"Checks that text parses as JSON, and optionally that required keys are present with the right top-level types. Returns the specific violations, not just true/false. Checks required + types only — not full JSON Schema, and it says so rather than pretending. Use before feeding generated JSON into something that will fail on it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"type":"string","description":"The JSON to validate."},"schema":{"type":"string","description":"Optional JSON Schema (as JSON text) — required[] and properties[].type are checked."}},"required":["text"]}},{"name":"what_can_you_do","description":"Describe a task in plain language (any language) and get back exactly which tools on this server do it, with ready-to-run example calls — instead of reading the whole catalogue and guessing. Also returns multi-step recipes when a task needs several tools chained (invoices to a ledger, a bank statement reconciled, a messy CSV turned into a deliverable). Deterministic and free: it calls no model, costs nothing, and never runs out of quota. Call this FIRST when you are not sure what this server offers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task":{"type":"string","description":"What you are trying to do, e.g. \"reconcile a bank statement against my books\" or \"把一堆发票整理成能入账的表格\""}},"required":["task"]}}],"scan":{"score":76,"grade":"B","scanned_at":"2026-09-23T11:53:31.350Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-23T11:53:31.277Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1462ms"]},"poisoning":{"score":15,"max":15,"notes":["14 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":12,"max":15,"notes":["last push 38 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://ainetcafe.com/mcp/dev?s=registry","reachable":true,"authRequired":false,"latencyMs":1462,"serverInfo":{"name":"netcafe-devkit","version":"1.5.0"}}],"packages":[],"repo":{"found":true,"owner":"mario03690","repo":"ai-netcafe","archived":false,"pushedAt":"2026-08-16T06:53:22Z","stars":1,"forks":0,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/79393843?v=4","ownerCreatedAt":"2021-02-21T06:22:05Z"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-08-16T06:53:22.000Z","score":21}}}},"grade_history":[],"reviews":[]}