ai-netcafe
Tables and ledgers checked by arithmetic, not by a model. 24 tools. MCP 2026-07-28 ready.
사용해야 할까요
품질 및 안전성
발견 사항 (14)
- HIGH
- MEDIUMlist_apps에서
- MEDIUMget_app에서
- MEDIUMask_model에서
- MEDIUMcompare_models에서
- MEDIUMlist_models에서
- MEDIUMrecall에서
- MEDIUMweb_search에서
- MEDIUMfetch_page에서
- MEDIUMmodel_costs에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"ai-netcafe": {
"command": "npx",
"args": [
"ai-netcafe"
]
}
}
}실행 가능한 패키지
1.2.1streamable-http1.2.2streamable-http원격 엔드포인트
https://ainetcafe.com/mcpstreamable-httphttps://ainetcafe.com/mcp?s=registrystreamable-http할 수 있는 일
도구 목록
도구 (34)
🟢what_can_you_do(task)
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.
입력 스키마
{
"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"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢list_apps(category)
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
입력 스키마
{
"type": "object",
"properties": {
"category": {
"type": "string",
"description": "Optional filter, e.g. \"office\", \"research\", \"chat\"."
}
}
}출력 스키마
{
"type": "object",
"properties": {
"apps": {
"type": "array",
"items": {
"type": "object"
}
},
"try_in_browser": {
"type": "string"
}
},
"required": [
"apps"
]
}🟢get_app(slug)
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>
입력 스키마
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Application slug, from list_apps."
}
},
"required": [
"slug"
]
}출력 스키마
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"open_url": {
"type": "string"
}
},
"required": [
"slug",
"name"
]
}🟡ask_model(prompt, model, system, max_tokens)
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
입력 스키마
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The prompt to send."
},
"model": {
"type": "string",
"description": "Model id. Call list_models for available ids. Defaults to a cheap capable model."
},
"system": {
"type": "string",
"description": "Optional system instruction."
},
"max_tokens": {
"type": "integer",
"description": "Optional output cap."
}
},
"required": [
"prompt"
]
}출력 스키마
{
"type": "object",
"properties": {
"model": {
"type": "string"
},
"answer": {
"type": "string"
},
"cost_usd": {
"type": "number"
},
"latency_ms": {
"type": "number"
}
}
}🟢compare_models(prompt, models, system)
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
입력 스키마
{
"type": "object",
"properties": {
"prompt": {
"type": "string",
"description": "The prompt to send to every model."
},
"models": {
"type": "array",
"items": {
"type": "string"
},
"description": "Model ids to compare (2-5). Defaults to a cheap/mid/strong spread."
},
"system": {
"type": "string",
"description": "Optional system instruction applied to all."
}
},
"required": [
"prompt"
]
}출력 스키마
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object"
}
},
"summary": {
"type": [
"object",
"null"
]
}
},
"required": [
"results"
]
}🟢list_models(tier)
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
입력 스키마
{
"type": "object",
"properties": {
"tier": {
"type": "string",
"enum": [
"free",
"premium"
],
"description": "Optional reference tier filter. All currently healthy tiers are available without a user key during the beta."
}
}
}출력 스키마
{
"type": "object",
"properties": {
"models": {
"type": "array",
"items": {
"type": "object"
}
}
},
"required": [
"models"
]
}⚪remember(content, kind, project)
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"}
입력 스키마
{
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "The memory itself, self-contained (≤2000 chars)."
},
"kind": {
"type": "string",
"enum": [
"decision",
"preference",
"bugfix",
"discovery",
"note"
],
"description": "Category; default \"note\"."
},
"project": {
"type": "string",
"description": "Optional project name to scope recall later."
}
},
"required": [
"content"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢recall(query, project, limit)
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)
입력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Optional search terms; omit to list the most recent."
},
"project": {
"type": "string",
"description": "Optional project filter."
},
"limit": {
"type": "integer",
"description": "Max results (default 8, up to 20)."
}
}
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢web_search(query, max_results)
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
입력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query."
},
"max_results": {
"type": "integer",
"description": "Max results (default 8, up to 20)."
}
},
"required": [
"query"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢fetch_page(url)
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
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The page URL to fetch."
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢model_costs(days)
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
입력 스키마
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"description": "Measurement window in days (default 30)."
}
}
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢ai_visibility(url)
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.
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Page to audit, e.g. https://example.com"
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢pdf_to_markdown(url)
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.
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Public URL of the PDF, or of a page image (png/jpg) for scanned documents."
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢extract_tables(url, fields)
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.
입력 스키마
{
"type": "object",
"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."
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢extract_statement(url)
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).
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Public URL of the statement PDF."
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢json_yaml(text, to)
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.
입력 스키마
{
"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"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢validate_json(text, schema)
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.
입력 스키마
{
"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"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢diff_text(a, b)
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.
입력 스키마
{
"type": "object",
"properties": {
"a": {
"type": "string",
"description": "The first (before) text."
},
"b": {
"type": "string",
"description": "The second (after) text."
}
},
"required": [
"a",
"b"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢jwt_decode(token)
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.
입력 스키마
{
"type": "object",
"properties": {
"token": {
"type": "string",
"description": "The JWT string."
}
},
"required": [
"token"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢regex_test(pattern, text, flags)
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.
입력 스키마
{
"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"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢diff_tables(url_a, url_b, text_a, text_b, key)
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.
입력 스키마
{
"type": "object",
"properties": {
"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."
},
"key": {
"type": "string",
"description": "Column that identifies a row, e.g. id."
}
},
"required": [
"key"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢clean_table(url, text, ops, keep, split_column, ...)
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.
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Link to the CSV. Provide this or text."
},
"text": {
"type": "string",
"description": "The CSV content itself. Provide this or url."
},
"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)."
},
"keep": {
"type": "string",
"description": "For wide_to_long: comma-separated id columns to keep as-is. Defaults to the first column."
},
"split_column": {
"type": "string",
"description": "Column name to split (requires ops to include split_column)."
},
"split_by": {
"type": "string",
"description": "Separator to split on, default a single space."
}
}
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢merge_tables(urls, texts)
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.
입력 스키마
{
"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."
}
}
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢reconcile_ledger(url_a, url_b, text_a, text_b, key, ...)
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.
입력 스키마
{
"type": "object",
"properties": {
"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)."
},
"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."
},
"key": {
"type": "string",
"description": "Column name to match rows on, e.g. order_id."
},
"amount": {
"type": "string",
"description": "Numeric column to compare, e.g. amount."
}
},
"required": [
"key",
"amount"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢extract_invoices(urls)
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.
입력 스키마
{
"type": "object",
"properties": {
"urls": {
"type": "string",
"description": "Invoice URLs — comma-separated, or pass an array. Up to 20 per call."
}
},
"required": [
"urls"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟡create_task(kind, input, interval_seconds, notify_url)
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.
입력 스키마
{
"type": "object",
"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."
},
"interval_seconds": {
"type": "integer",
"description": "How often to run. Minimum 900 (15 min), default 3600."
},
"notify_url": {
"type": "string",
"description": "Optional https webhook to POST results to when they change."
}
},
"required": [
"kind",
"input"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢list_tasks
Show scheduled tasks, next run times, run counts, and measured platform cost metadata. User charge is $0.00 during the beta.
입력 스키마
{
"type": "object",
"properties": {},
"required": []
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢get_task_runs(task_id, limit)
Recent runs of one scheduled task: what it returned, whether the result changed, and measured platform cost metadata. User charge is $0.00.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"description": "From create_task or list_tasks."
},
"limit": {
"type": "integer",
"description": "How many recent runs, max 20, default 5."
}
},
"required": [
"task_id"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🔴delete_task(task_id)
Stop and remove a scheduled task and its run history.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"description": "From list_tasks."
}
},
"required": [
"task_id"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢transpile_sql(sql, read, write)
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.
입력 스키마
{
"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"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢china_reachability(url)
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.
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full URL to test, e.g. https://example.com"
}
},
"required": [
"url"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢render_diagram(source, type, format)
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"
입력 스키마
{
"type": "object",
"properties": {
"source": {
"type": "string",
"description": "The diagram source code (e.g. a Mermaid flowchart)."
},
"type": {
"type": "string",
"description": "Diagram language: mermaid (default), plantuml, graphviz, c4plantuml, excalidraw, blockdiag, erd…"
},
"format": {
"type": "string",
"description": "\"svg\" (default) or \"png\"."
}
},
"required": [
"source"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}🟢check_job(job_id)
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>
입력 스키마
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"description": "The job_id returned when the task was started."
}
},
"required": [
"job_id"
]
}출력 스키마
{
"type": "object",
"properties": {
"job_id": {
"type": "string"
},
"kind": {
"type": "string"
},
"status": {
"type": "string"
},
"is_terminal": {
"type": "boolean"
},
"retry_after_seconds": {
"type": "integer"
},
"next_action": {
"type": [
"object",
"null"
]
},
"result": {},
"structured_result": {},
"error": {
"type": "string"
}
},
"required": [
"job_id",
"status"
]
}🟢build_app(description, name, visibility, refine)
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
입력 스키마
{
"type": "object",
"properties": {
"description": {
"type": "string",
"description": "What the tool should do, in any language. Be specific about inputs/outputs."
},
"name": {
"type": "string",
"description": "Optional short app name (defaults to the description)."
},
"visibility": {
"type": "string",
"description": "\"public\" (default, listed in the store) or \"unlisted\" (URL-only, not in the store)."
},
"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`."
}
},
"required": [
"description"
]
}출력 스키마
{
"type": "object",
"additionalProperties": true
}커뮤니티
증거