{"server":"com.ainetcafe/ai-netcafe","count":34,"tools":[{"name":"ai_visibility","title":"Can AI assistants read and cite this site?","description":"Audit a URL for AI visibility: which AI crawlers robots.txt actually allows (parsed per user-agent group, not keyword-matched), whether llms.txt / sitemap / JSON-LD / canonical exist, and how much real text an agent gets without running JavaScript. Returns a score plus the specific fixes, ordered by impact.","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Page to audit, e.g. https://example.com"}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"ask_model","title":"Run a prompt on a specific LLM","description":"Send a prompt to one specific large language model and get the answer plus measured platform cost metadata. The beta platform covers the user charge ($0.00); capacity limits still apply. Example — GET https://ainetcafe.com/t/ask_model?prompt=Say+hi&model=deepseek-v4-flash","input_schema":{"type":"object","required":["prompt"],"properties":{"model":{"type":"string","description":"Model id. Call list_models for available ids. Defaults to a cheap capable model."},"prompt":{"type":"string","description":"The prompt to send."},"system":{"type":"string","description":"Optional system instruction."},"max_tokens":{"type":"integer","description":"Optional output cap."}}},"output_schema":{"type":"object","properties":{"model":{"type":"string"},"answer":{"type":"string"},"cost_usd":{"type":"number"},"latency_ms":{"type":"number"}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"build_app","title":"Build and deploy a web app from a description","description":"Turn one plain-language description into a LIVE single-page web tool: code is generated, deployed to managed hosting with HTTPS, and listed — you get the public URL in ~1-2 minutes. Best for tool-style apps: calculators, converters, checklists, timers, generators, small games. Async — poll with check_job. Example — tools/call build_app {\"description\":\"a tip calculator web app\"} → poll check_job","input_schema":{"type":"object","required":["description"],"properties":{"name":{"type":"string","description":"Optional short app name (defaults to the description)."},"refine":{"type":"string","description":"Slug of an app you built earlier (e.g. \"u-1a23e679\") to modify instead of building from scratch — describe only the change in `description`."},"visibility":{"type":"string","description":"\"public\" (default, listed in the store) or \"unlisted\" (URL-only, not in the store)."},"description":{"type":"string","description":"What the tool should do, in any language. Be specific about inputs/outputs."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"check_job","title":"Check a long-running job","description":"Get the status or result of a job started by deep_research, translate_pdf, or make_slides. Poll every 15-30 seconds until status is \"done\" or \"error\". While work is pending, follow retry_after_seconds and next_action; when complete, prefer structured_result when present. Example — GET https://ainetcafe.com/t/check_job?job_id=<id-from-a-job-tool>","input_schema":{"type":"object","required":["job_id"],"properties":{"job_id":{"type":"string","description":"The job_id returned when the task was started."}}},"output_schema":{"type":"object","required":["job_id","status"],"properties":{"kind":{"type":"string"},"error":{"type":"string"},"job_id":{"type":"string"},"result":{},"status":{"type":"string"},"is_terminal":{"type":"boolean"},"next_action":{"type":["object","null"]},"structured_result":{},"retry_after_seconds":{"type":"integer"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"china_reachability","title":"Test if a URL is reachable from mainland China","description":"Fetch a URL from a real mainland-China network egress and report HTTP status, latency and China DNS resolution. Answers \"is my site/API usable from China?\" with a measurement instead of a guess — you cannot get this from a VPS abroad.","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Full URL to test, e.g. https://example.com"}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"clean_table","title":"Messy CSV → tidy CSV, with a report of every change","description":"Tidies a spreadsheet export: removes duplicate rows, trims whitespace (half-width and full-width — Chinese exports are full of 　), unifies the half-dozen ways a cell can say \"empty\" (NA / null / - / 无), drops empty rows and columns, and can split one column into several. Returns the cleaned CSV plus exactly what changed: rows in, rows out, duplicates removed, cells trimmed per column. It can also transpose rows/columns and unpivot a wide table into a long one. The row arithmetic is verified in code — if in − removed ≠ out, the response says so instead of handing back a table nobody can check. Use when a CSV came out of Excel or an export and needs cleaning before analysis.","input_schema":{"type":"object","properties":{"ops":{"type":"string","description":"Comma-separated, default \"dedupe,trim,drop_empty,unify_blank\". Also available: split_column, transpose (swap rows/columns), wide_to_long (unpivot a wide table into the long format analysis tools expect)."},"url":{"type":"string","description":"Link to the CSV. Provide this or text."},"keep":{"type":"string","description":"For wide_to_long: comma-separated id columns to keep as-is. Defaults to the first column."},"text":{"type":"string","description":"The CSV content itself. Provide this or url."},"split_by":{"type":"string","description":"Separator to split on, default a single space."},"split_column":{"type":"string","description":"Column name to split (requires ops to include split_column)."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"compare_models","title":"Run the same prompt on several models and compare","description":"Run one prompt across multiple LLMs in parallel and return every answer side by side with measured platform cost metadata and latency. The beta platform covers the user charge ($0.00). This answers \"which model should I actually use for this kind of task?\" with data instead of guesswork. Example — GET https://ainetcafe.com/t/compare_models?prompt=Explain+CAP+theorem+in+1+line","input_schema":{"type":"object","required":["prompt"],"properties":{"models":{"type":"array","items":{"type":"string"},"description":"Model ids to compare (2-5). Defaults to a cheap/mid/strong spread."},"prompt":{"type":"string","description":"The prompt to send to every model."},"system":{"type":"string","description":"Optional system instruction applied to all."}}},"output_schema":{"type":"object","required":["results"],"properties":{"results":{"type":"array","items":{"type":"object"}},"summary":{"type":["object","null"]}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"create_task","title":"Schedule a recurring task that runs on our servers","description":"Create a task that runs on a schedule in our cloud — you do not keep anything running. It only notifies you when the result actually changes. Kinds: watch_page (Watch a web page and report when its content changes); daily_answer (Re-run a web-researched question on a schedule and report when the answer changes); watch_reachability (Track whether a site stays reachable from mainland China); pipeline (Run one of your production lines (create_pipeline) on a schedule; every run leaves a proof-carrying work order). Needs a workspace token (?w=ws_... on your MCP URL) so you can manage it later. Application and model calls are subsidized during the free beta; your charge is $0.00 and capacity limits apply.","input_schema":{"type":"object","required":["kind","input"],"properties":{"kind":{"type":"string","description":"watch_page | daily_answer | watch_reachability | pipeline"},"input":{"type":"string","description":"The URL to watch, or the question to re-research."},"notify_url":{"type":"string","description":"Optional https webhook to POST results to when they change."},"interval_seconds":{"type":"integer","description":"How often to run. Minimum 900 (15 min), default 3600."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"delete_task","title":"Delete a scheduled task","description":"Stop and remove a scheduled task and its run history.","input_schema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"integer","description":"From list_tasks."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"diff_tables","title":"Two tables → what differs (the VLOOKUP job, no amounts needed)","description":"Matches rows across two CSVs on a key column and reports three things: keys only in A, keys only in B, and keys in both whose other columns disagree — naming the exact column and both values. Unlike reconcile_ledger this needs no amount column, so it also fits name lists, inventory counts, permission tables, and any \"these two exports should match\" check.","input_schema":{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"Column that identifies a row, e.g. id."},"url_a":{"type":"string","description":"Link to the first CSV."},"url_b":{"type":"string","description":"Link to the second CSV."},"text_a":{"type":"string","description":"Or the first CSV content directly."},"text_b":{"type":"string","description":"Or the second CSV content directly."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"diff_text","title":"What changed between two texts, line by line","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.","input_schema":{"type":"object","required":["a","b"],"properties":{"a":{"type":"string","description":"The first (before) text."},"b":{"type":"string","description":"The second (after) text."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"extract_invoices","title":"A batch of invoices → one ledger-ready table (arithmetic-checked)","description":"Give it up to 20 invoice URLs (PDF or page images) and get back one table ready to post: number, date, seller, buyer, net / tax / gross, currency. Every row is checked in code — net + tax must equal gross — and the batch total is re-added independently, so a row the model misread is flagged with the exact difference instead of quietly landing in your books. Mixed currencies get no batch total on purpose: adding them together would be an accounting error. CSV is UTF-8 with BOM so Excel opens it right.","input_schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"string","description":"Invoice URLs — comma-separated, or pass an array. Up to 20 per call."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"extract_statement","title":"Bank statement PDF → transactions + reconciliation check","description":"Turn a bank statement or transaction PDF into a clean transaction table (JSON + CSV), then cross-check it: opening + credits - debits must equal the stated closing balance. If it does not balance you get the exact difference and which row the running balance first breaks at — so you know whether the table is safe to use for accounting. Text-layer PDFs only (scanned images not yet supported).","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public URL of the statement PDF."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"extract_tables","title":"PDF tables → structured rows (with schema alignment)","description":"Extract tables from a PDF into structured rows (JSON + CSV). Pass fields to force a fixed set of columns — that aligns a pile of documents that each name their headers differently into one consistent table. Rows the model was unsure about are flagged rather than guessed. Text-layer PDFs only.","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public URL of the PDF."},"fields":{"type":"string","description":"Optional comma-separated target columns, e.g. \"invoice_no,supplier,date,amount\". Omit to infer from the header."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"fetch_page","title":"Fetch a web page as clean Markdown","description":"Fetch a public URL and return clean LLM-ready Markdown from the server-rendered response. This tool does not execute browser JavaScript; for SPA or empty-text pages, use web_search, a browser, or the site's API. Use it after web_search to read a reachable public source, or to ingest a static page for analysis. Example — GET https://ainetcafe.com/t/fetch_page?url=https://example.com","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The page URL to fetch."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"get_app","title":"Get details of one application","description":"Full details of one hosted application: what it does, how to use it, measured benchmark scores, source repository, and the URL a human can open to run it. Example — GET https://ainetcafe.com/t/get_app?slug=<slug-from-list_apps>","input_schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Application slug, from list_apps."}}},"output_schema":{"type":"object","required":["slug","name"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"open_url":{"type":"string"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"get_task_runs","title":"See what a scheduled task has produced","description":"Recent runs of one scheduled task: what it returned, whether the result changed, and measured platform cost metadata. User charge is $0.00.","input_schema":{"type":"object","required":["task_id"],"properties":{"limit":{"type":"integer","description":"How many recent runs, max 20, default 5."},"task_id":{"type":"integer","description":"From create_task or list_tasks."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"json_yaml","title":"JSON ↔ YAML, either direction, auto-detected","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.","input_schema":{"type":"object","required":["text"],"properties":{"to":{"type":"string","description":"Optional: \"json\" or \"yaml\" to force the direction."},"text":{"type":"string","description":"The JSON or YAML content."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"jwt_decode","title":"See inside a JWT — header, payload, and whether it has expired","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.","input_schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string","description":"The JWT string."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"list_apps","title":"List hosted open-source AI applications","description":"List the open-source AI applications hosted and ready to run at AI NetCafé (ainetcafe.com). Each one normally requires local setup (Docker/Python + your own model API key); here they run pre-configured. Use this to find a tool for a task like translating a PDF with formulas intact, generating a PowerPoint file, polishing an academic paper, or running an autonomous research report. Do not call this first when the request already clearly matches compare_models, translate_pdf, deep_research, or make_slides; call that task tool directly. Example — GET https://ainetcafe.com/t/list_apps","input_schema":{"type":"object","properties":{"category":{"type":"string","description":"Optional filter, e.g. \"office\", \"research\", \"chat\"."}}},"output_schema":{"type":"object","required":["apps"],"properties":{"apps":{"type":"array","items":{"type":"object"}},"try_in_browser":{"type":"string"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"list_models","title":"List available models and capacity","description":"List every model currently available in the free beta with reference input/output rates and health metadata. Those rates are platform cost metadata only; every user charge is $0.00 during the beta. Example — GET https://ainetcafe.com/t/list_models","input_schema":{"type":"object","properties":{"tier":{"enum":["free","premium"],"type":"string","description":"Optional reference tier filter. All currently healthy tiers are available without a user key during the beta."}}},"output_schema":{"type":"object","required":["models"],"properties":{"models":{"type":"array","items":{"type":"object"}}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"list_tasks","title":"List your scheduled tasks","description":"Show scheduled tasks, next run times, run counts, and measured platform cost metadata. User charge is $0.00 during the beta.","input_schema":{"type":"object","required":[],"properties":{}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"merge_tables","title":"Several CSVs → one, columns unioned, row counts proven","description":"Combines up to 20 CSVs into a single table. Headers do not have to match: columns are unioned and a file missing a column contributes blanks for it, so rows never shift silently — the failure mode that makes hand-merged spreadsheets untrustworthy. Reports each source file row count and checks in code that they sum to the merged total. Use for monthly exports, per-store sheets, or any set of files with the same subject but drifting headers.","input_schema":{"type":"object","properties":{"urls":{"type":"string","description":"Comma-separated CSV links, at least two."},"texts":{"type":"array","items":{"type":"string"},"description":"Or pass the CSV contents directly as an array."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"model_costs","title":"Measured platform cost across models","description":"Measured platform cost metadata for one call on each model; your charge is $0.00 during the free beta. Vendors publish per-million-token list prices, but a call's cost depends on how many tokens the model chooses to emit — models differ by an order of magnitude on the same prompt. standard_bench sends an IDENTICAL prompt to every model, so the difference is the model, not the workload — use that to choose a model before bulk work. production_mixed is real traffic and is NOT comparable across models. Free to cite, CC BY 4.0. Example — GET https://ainetcafe.com/t/model_costs","input_schema":{"type":"object","properties":{"days":{"type":"integer","description":"Measurement window in days (default 30)."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"pdf_to_markdown","title":"PDF or scanned page → structured Markdown","description":"Convert a PDF (or a scanned page image) into clean Markdown that keeps headings, lists and tables, and puts multi-column pages in the right reading order. Text-layer PDFs are read exactly and cost far less; images go through a vision model.","input_schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public URL of the PDF, or of a page image (png/jpg) for scanned documents."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"recall","title":"Recall stored memories","description":"Retrieve previously stored memories, optionally filtered by search query and/or project. Call at the start of work on a known project to restore context: why decisions were made, known fixes, preferences. Example — GET https://ainetcafe.com/t/recall?query=<what+to+remember>  (needs a workspace/key for durable memory)","input_schema":{"type":"object","properties":{"limit":{"type":"integer","description":"Max results (default 8, up to 20)."},"query":{"type":"string","description":"Optional search terms; omit to list the most recent."},"project":{"type":"string","description":"Optional project filter."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"reconcile_ledger","title":"Two tables → what does not match (the VLOOKUP job), with the arithmetic proof","description":"Reconciles two sets of records — your books against a bank, platform, or supplier statement. Matches rows on a key column, compares an amount column, and returns three lists: only in A, only in B, and same key but different amount. Amounts are compared in integer cents, so 0.1 + 0.2 never invents a phantom difference for someone to chase. The response also proves the result: the listed differences are re-added and must equal the gap between the two totals, checked in code. Use for month-end close, platform payouts vs orders, or any \"these two numbers should agree and do not\" problem. This is the job people do by hand with VLOOKUP or a groupby and then cannot prove they got right.","input_schema":{"type":"object","required":["key","amount"],"properties":{"key":{"type":"string","description":"Column name to match rows on, e.g. order_id."},"url_a":{"type":"string","description":"Link to side A (e.g. your books)."},"url_b":{"type":"string","description":"Link to side B (e.g. the statement)."},"amount":{"type":"string","description":"Numeric column to compare, e.g. amount."},"text_a":{"type":"string","description":"Or the CSV content of side A directly."},"text_b":{"type":"string","description":"Or the CSV content of side B directly."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"regex_test","title":"Does this regex match — and what does it capture?","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.","input_schema":{"type":"object","required":["pattern","text"],"properties":{"text":{"type":"string","description":"The text to test against."},"flags":{"type":"string","description":"Optional flags, e.g. \"gi\". Default \"g\"."},"pattern":{"type":"string","description":"The regular expression, without surrounding slashes."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"remember","title":"Store a memory (persists across sessions within your workspace)","description":"Persist a durable memory: an architecture decision, a stable user preference, a verified bug fix, or an important discovery. The free beta provides a bounded per-caller/workspace memory pool; no personal API key is required. Do not store secrets or raw logs. Example — tools/call remember {\"content\":\"Deploy key rotates monthly\"}","input_schema":{"type":"object","required":["content"],"properties":{"kind":{"enum":["decision","preference","bugfix","discovery","note"],"type":"string","description":"Category; default \"note\"."},"content":{"type":"string","description":"The memory itself, self-contained (≤2000 chars)."},"project":{"type":"string","description":"Optional project name to scope recall later."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"render_diagram","title":"Render a diagram from text","description":"Turn diagram-as-code into an image: Mermaid, PlantUML, Graphviz/DOT, C4, Excalidraw and 20+ more (self-hosted Kroki). Returns a hosted SVG/PNG URL you can embed directly in Markdown or HTML. Example — GET \"https://ainetcafe.com/t/render_diagram?source=graph TD;A--%3EB&format=png\"","input_schema":{"type":"object","required":["source"],"properties":{"type":{"type":"string","description":"Diagram language: mermaid (default), plantuml, graphviz, c4plantuml, excalidraw, blockdiag, erd…"},"format":{"type":"string","description":"\"svg\" (default) or \"png\"."},"source":{"type":"string","description":"The diagram source code (e.g. a Mermaid flowchart)."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"transpile_sql","title":"Translate SQL between dialects","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.","input_schema":{"type":"object","required":["sql","write"],"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\"."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"validate_json","title":"Is this JSON valid — and does it have the keys you need?","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.","input_schema":{"type":"object","required":["text"],"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."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"web_search","title":"Search the web (meta-search)","description":"Search the live web through a self-hosted SearXNG meta-search (aggregates dozens of engines, no tracking). Returns titles, URLs and snippets. Use when you need current information or sources. Example — GET https://ainetcafe.com/t/web_search?query=latest+MCP+spec","input_schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"The search query."},"max_results":{"type":"integer","description":"Max results (default 8, up to 20)."}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"},{"name":"what_can_you_do","title":"Find the right tool for a task","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.","input_schema":{"type":"object","required":["task"],"properties":{"task":{"type":"string","description":"What you are trying to do, e.g. \"reconcile a bank statement against my books\" or \"把一堆发票整理成能入账的表格\""}}},"output_schema":{"type":"object","additionalProperties":true},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-10T03:26:15.527Z"}],"next_cursor":null,"next_actions":[{"action":"get_connection","description":"Connection block to call these tools","href":"/v1/servers/com.ainetcafe%2Fai-netcafe/connection?target=mcpServers","arguments":{"name":"com.ainetcafe/ai-netcafe","target":"mcpServers"}},{"action":"get_server","description":"Full descriptor with trust and connectability","href":"/v1/servers/com.ainetcafe%2Fai-netcafe","arguments":{"name":"com.ainetcafe/ai-netcafe"}}]}