프로토타입 · 미리 보기: 공식 레지스트리의 모든 서버를 담고 있으며 30분마다 동기화해요. 리뷰와 계정 기능은 다음 단계에서 열려요.
PopNx MCPAI를 쓰는 사람을 위한 MCP 서버 · 쉬운 말로 설명해요

Liquid

제작자: ertad-family버전 0.2.0i★ –i내 컴퓨터에서 실행
레지스트리 이름io.github.ertad-family/liquid

설치

개요

제작자가 쓴 설명(영어 원문)

Connect your AI agent to anything — APIs, databases, and agents; read and write, auto-discovered.

PopNx MCP의 세 기둥

이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.

할 수 있는 일

이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.

  • 연결 방식: 내 컴퓨터에서 실행
  • 전송 방식: stdio
  • 카테고리: 데이터베이스 및 데이터셋
  • 입력해야 할 값: OPENAI_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY

설치

쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 내 컴퓨터에서 내 사용자 계정의 권한(파일, 네트워크, 앱)으로 실행돼요.
  • 직접 입력할 값: OPENAI_API_KEY, OPENAI_BASE_URL, GEMINI_API_KEY, ANTHROPIC_API_KEY, LIQUID_ALLOW_WRITES

비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.

필요한 것

  • PyPIPython의 uv 설치(uvx 명령어용)

어떤 앱을 쓰세요?

위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.

Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요

{
  "mcpServers": {
    "liquid": {
      "command": "uvx",
      "args": [
        "liquid-mcp"
      ],
      "env": {
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "GEMINI_API_KEY": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "LIQUID_ALLOW_WRITES": "your-value"
      }
    }
  }
}

터미널에서 이 명령어를 실행하세요

claude mcp add liquid --env OPENAI_API_KEY=your-value --env OPENAI_BASE_URL=your-value --env GEMINI_API_KEY=your-value --env ANTHROPIC_API_KEY=your-value --env LIQUID_ALLOW_WRITES=your-value -- uvx liquid-mcp

실행하기 전에 빈 값을 채워 주세요.

Cursor에서 열기

또는 설정을 직접 복사하기

프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요

{
  "mcpServers": {
    "liquid": {
      "command": "uvx",
      "args": [
        "liquid-mcp"
      ],
      "env": {
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "GEMINI_API_KEY": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "LIQUID_ALLOW_WRITES": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

VS Code에서 열기

또는 설정을 직접 복사하기

프로젝트의 .vscode/mcp.json에 붙여 넣으세요

{
  "servers": {
    "liquid": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "liquid-mcp"
      ],
      "env": {
        "OPENAI_API_KEY": "your-value",
        "OPENAI_BASE_URL": "your-value",
        "GEMINI_API_KEY": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "LIQUID_ALLOW_WRITES": "your-value"
      }
    }
  }
}

브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.

이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.

선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.

직접 입력할 값

  • OPENAI_API_KEY 비밀 env
    OpenAI (or compatible) API key for discovery
  • OPENAI_BASE_URL env
    OpenAI-compatible base URL, e.g. local Ollama/vLLM
  • GEMINI_API_KEY 비밀 env
    Google Gemini API key (alternative)
  • ANTHROPIC_API_KEY 비밀 env
    Anthropic API key (alternative)
  • LIQUID_ALLOW_WRITES env
    Set to 1 to expose the liquid_execute write tool (database insert/update/delete). Off by default — read-only.

이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.

할 수 있는 일

내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.

기본 점검i

누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 GitHub 계정 ertad-family 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요

  • … 아직 점검 안 함

    계속 관리되고 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • … 아직 점검 안 함

    라이선스 있음

    아직 GitHub에서 이 저장소를 읽어 오지 않았어요

  • – 해당 없음

    엔드포인트 응답

    내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요

  • – 해당 없음

    OAuth로 로그인

    내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요

  • … 아직 점검 안 함

    도구 설명에 숨겨진 지시 없음

    내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요

데이터베이스 및 데이터셋 카테고리의 다른 서버와 비교i

  • 이 카테고리의 다른 서버 1146개 중 0%보다 스타가 많아요
  • 이 카테고리의 다른 서버 1146개 중 12%보다 최근에 레지스트리에 공개됐어요
  • 기본 점검 결과가 이 카테고리의 다른 서버 1146개 중 100%와 같거나 더 좋아요

레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.

자주 묻는 질문

Liquid, 안전한가요?

해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.

어떤 키나 코드가 필요한가요?

입력해야 할 값: OPENAI_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY

내 컴퓨터에서 실행되나요, 클라우드에서 실행되나요?

내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).

아직 관리되고 있나요?

GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.2.0)은 5개월 전 레지스트리에 올라왔어요.

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.

대신 쓸 수 있는 건 뭐가 있나요?

같은 카테고리에는: Supabase, MongoDB MCP Server, Elasticsearch MCP Server

대안

같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.

카드 보는 법:↓ 주간 다운로드i★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i

Supabase

MCP server for interacting with the Supabase platform

제작자: supabase널리 사용됨↓ 23.5만/주★ 3천그저께 업데이트

컴퓨터 또는 클라우드✓ supabase.com

MongoDB MCP Server

MongoDB Model Context Protocol Server

제작자: mongodb-js널리 사용됨↓ 15.7만/주★ 1.2천4일 전 업데이트

내 컴퓨터에서 실행

Elasticsearch MCP Server

MCP server for interacting with Elasticsearch

제작자: cr7258성장 중↓ 2.7천/주★ 31514개월 전 업데이트

내 컴퓨터에서 실행

제작자의 README

README 열기

제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.

Liquid

Connect your AI agent to anything — with no connector to write or maintain.

Point Liquid at a URL or a database and it works out the interface for you: discovers its shape, maps it to the fields you asked for, and handles auth, pagination and normalization — typed records, no client code. When the upstream drifts, it re-maps and keeps going. The same small API — fetch · query · write · sense — reaches web APIs, databases, other agents (MCP/A2A), email, and even IoT and industrial systems (MQTT, Modbus, OPC UA, BACnet). An LLM does the learning at setup (and on drift); the data path itself makes no model call.


What an agent can reach through Liquid

One agent-facing API (fetch · query · write · sense) over everything an agent might need to touch — Liquid figures out *how to talk to it* so the agent doesn't have to. It's the agent's senses and hands: fetch/query probe, sense perceives a live event stream, write acts on the world.

  • Web APIs & messaging — REST/JSON, GraphQL, SOAP/WSDL, gRPC, WebSocket, SSE/NDJSON streams, MQTT (IoT pub/sub — subscribe to sense, publish to act)
  • Email — IMAP/SMTP (any provider, app-password or OAuth2 XOAUTH2) and the Gmail API (OAuth2): read a mailbox, sense new mail as it arrives, and send
  • Industrial / OT — Modbus (PLCs, sensors) and OPC UA (Industry-4.0 nodes, native subscriptions) for the factory floor; BACnet for buildings (HVAC/BMS) — read, write, and sense
  • Android devices — phones, TV boxes, kiosks via ADB: sense logcat, read shell, act with input/am
  • Other agents & tools — any MCP server, A2A agents, ChatGPT-plugin manifests
  • Databases — Postgres (+ pgvector), MySQL/MariaDB, SQLite, DuckDB, SQL Server, Neo4j (graph), MongoDB (documents), Redis (key-value)
  • People, places & things — a human, a home, or a car as a node via connectors: Telegram (perceive messages, send replies), Home Assistant (perceive a whole smart home's state changes, act via call_service — lights, locks, media), and Smartcar (perceive a connected vehicle across ~30 brands — location/battery/fuel — and act: lock/unlock, charge)

Point it at a https://… endpoint, a postgres://… / mongodb://… / redis://… DSN, a grpc://… target, or another MCP server — discovery identifies the interface, learns its shape, and hands your agent typed records. The same fetch/query/write works regardless of what's underneath. No per-service connector to hand-write; the integration maintains itself when the upstream changes.

# A web API it has never seen — no spec, no connector, no auth

adapter = await liquid.get_or_create( "https://api.openbrewerydb.org/v1/breweries", target_model={"name": "str", "city": "str", "country": "str"}, auto_approve=True, ) breweries = await liquid.fetch(adapter) # typed records

A database is just another interface — same API, and it writes too

db = await liquid.get_or_create("postgresql://reader@host/shop", target_model={"id": "int", "email": "str"}, auto_approve=True) orders = await liquid.fetch(db, "/public/orders") await liquid.write(db, "/public/orders", op="insert", values={"email": "a@b.com", "total_cents": 9900}, allow_write=True) # opt-in; mutates the store

You hand-write no connector and no schema: an LLM learns the interface once at setup (databases introspect themselves and skip even that), and the integration repairs itself when the upstream drifts. The runtime is plain deterministic transport — predictable cost, reproducible behavior, nothing to babysit.

Built for the constraints real agents hit

Reaching everything is half of it. The other half is that agents pay for every token, get confused by inconsistent shapes, and can't parse error prose. Liquid answers each with a concrete primitive — all shipped, all on PyPI.

Context-budget control
# Search / aggregate server-side instead of fetch-then-filter — 10-100x fewer tokens

orders = await liquid.search(adapter, "/orders", where={"total_cents": {"$gt": 10000}, "status": "paid"}, limit=20)

stats = await liquid.aggregate(adapter, "/orders", group_by="status", agg={"total_cents": "sum", "id": "count"})

hits = await liquid.text_search(adapter, "/tickets", "shipping delay") # BM25-lite

data = await liquid.fetch(adapter, "/orders", max_tokens=2000) # budget cap data = await liquid.fetch(adapter, "/customers", verbosity="terse") # id + 1-2 fields

Cross-source normalization
liquid = Liquid(..., normalize_output=True)

Stripe {amount:1000,currency:"usd"} · PayPal {value:"10.00",currency_code:"USD"}

→ Money(amount_cents=1000, currency="USD", amount_decimal=Decimal("10.00"))

Timestamps (Unix / ISO 8601 / RFC 2822) collapse to UTC datetime; pagination envelopes ({data:[…]} / {results:[…]} / Link headers) flatten; ID fields normalize across id / _id / uuid / *_id.

Canonical intents — one mental model across services
await liquid.execute_intent(adapter, "charge_customer",

{"customer_id": "cus_xyz", "amount_cents": 9999, "currency": "USD"})

Same intent on Stripe / Braintree / Square / Adyen — 71 canonical intents

Structured recovery — agents self-heal without parsing text
try:

await liquid.fetch(adapter, "/orders") except LiquidError as e: if e.recovery and e.recovery.next_action: await agent.call_tool(e.recovery.next_action.tool, e.recovery.next_action.args)

Every error carries a Recovery with next_action: ToolCall, retry_safe, and retry_after_seconds. 401 → store_credentials. 404/410 → repair_adapter. 429 → retry after the given delay. And when the upstream's schema drifts, adapters self-heal (repair_adapter) — the agent keeps working.

Predictable cost — know before you call
est = await liquid.estimate_fetch(adapter, "/orders")

FetchEstimate(expected_items=250, expected_tokens=52_000, confidence="high", …)

if est.expected_tokens < my_budget: data = await liquid.fetch(adapter, "/orders")

Tools emitted by to_tools() carry a metadata block (cost_credits, typical_latency_ms, cached, idempotent, side_effects, related_tools) so the agent can reason about which tool to pick — and ambient tools (liquid_check_quota, liquid_list_adapters, …) let it ask about state instead of memorizing it.


Measured impact

Deterministic benchmarks on realistic agent tasks (500-order, 200-ticket fixtures, mocked HTTP) — reproducible via python -m benchmarks.run:

TaskMetricBaselineWith LiquidDelta
Find 10 orders over $100tokens75,4821,519−98%
Revenue by status (aggregate)tokens75,482115−100%
Fetch customer (id+email only)tokens42412−97%
Recover from 401structured next_actionnoyes—
Find the shipping tickettokens14,588154−99%
Stripe↔PayPal consistencyfield overlap0.111.00+9×
Skip wasted call via estimatetokens14,9430−100%
max_tokens=2000 budget captokens14,9431,999−87%

Full methodology + per-task breakdown: benchmarks/RESULTS.md.

Install

pip install liquid-api                 # core + bundled MCP server (the `liquid-mcp` command)

pip install 'liquid-api[discovery]' # + an LLM for discovering spec-less REST APIs & field mapping

Do you need an LLM extra? Self-describing interfaces — OpenAPI, GraphQL, gRPC, MCP, A2A, WSDL — and all databases (introspection) discover with no LLM, and the whole runtime (fetch/query/write/sense) never calls a model. You only need an LLM backend to discover a REST API that has no machine-readable spec (heuristic + LLM) and to map its fields. [discovery] pulls LiteLLM, which reaches OpenAI / Gemini / Anthropic / local / 100+ providers; or pick one directly:

pip install 'liquid-api[gemini]'     # Google Gemini   (or [anthropic]; OpenAI/local work with no extra via base_url)

pip install 'liquid-api[grpc]' # gRPC transport (reflection) pip install 'liquid-api[ws]' # WebSocket transport pip install 'liquid-api[pg]' # Postgres / pgvector (asyncpg) pip install 'liquid-api[mysql]' # MySQL / MariaDB (aiomysql); SQLite needs no extra pip install 'liquid-api[neo4j]' # Neo4j graph (Bolt / Cypher) pip install 'liquid-api[duckdb]' # DuckDB (embedded analytics) pip install 'liquid-api[mssql]' # SQL Server (ODBC; needs a system ODBC driver) pip install 'liquid-api[mongodb]' # MongoDB (collections as endpoints) pip install 'liquid-api[redis]' # Redis (keyspace namespaces as endpoints) pip install 'liquid-api[mqtt]' # MQTT (IoT pub/sub) pip install 'liquid-api[modbus]' # Modbus (industrial registers) pip install 'liquid-api[opcua]' # OPC UA (Industry-4.0 nodes + subscriptions) pip install 'liquid-api[bacnet]' # BACnet (building automation; ADB needs the system adb binary)

Framework integration (LangChain / OpenAI / Anthropic / MCP) is built in — no extra package.

The core is dependency-free — every backend's library is an optional extra, imported only when used.

See it work — live, no pre-config

Point Liquid at an API it has never seen (no adapter, no OpenAPI spec, no auth) and get typed records back — you write no connector; discovery + mapping is the only place a model runs. Runnable end to end via examples/live_quickstart.py:

Connecting to an API Liquid has never seen:

https://api.openbrewerydb.org/v1/breweries

discovery method : rest_heuristic mapped fields : ['name', 'city', 'state', 'country'] LLM calls so far : 2 (discovery + mapping)

fetch() -> 50 typed records; first 3: {'name': '(405) Brewing Co', 'city': 'Norman', 'state': 'Oklahoma', 'country': 'United States'} {'name': '(512) Brewing Co', 'city': 'Austin', 'state': 'Texas', 'country': 'United States'} {'name': '1 of Us Brewing Company', 'city': 'Mount Pleasant', 'state': 'Wisconsin', 'country': 'United States'}

LLM calls during fetch : 0 LLM calls on 2nd fetch : 0

You wrote no connector, no schema, no auth glue — Liquid learned the interface for you, and will re-learn it if it changes. That's the point: integrations you don't build or babysit.

Run as an MCP server (open source, self-hosted)

Expose the engine to any MCP client (Claude Desktop, Cursor, Claude Code) — it runs in your own process, no cloud, no account, no lock-in:

One-click in Cursor (the button writes the server into your mcp.json; add your OPENAI_API_KEY in Cursor's MCP settings afterward). Or set it up manually:

pip install liquid-api

export OPENAI_API_KEY=sk-... # or GEMINI_API_KEY / ANTHROPIC_API_KEY,

or OPENAI_BASE_URL=http://localhost:11434/v1 for local (Ollama/vLLM)

liquid-mcp # or: python -m liquid.mcp_server

Zero-install with uvx (the liquid-mcp package makes the command run by name) — Claude Code:

claude mcp add liquid --scope user -e OPENAI_API_KEY=sk-... -- uvx liquid-mc

앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요

PopNx에게 묻기