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

Ekwo OS — open source accounting: ledger, invoices and VAT on your own Supabase…

제작자: Ekwo-ai버전 0.24.0i★ –i컴퓨터 또는 클라우드
레지스트리 이름ai.ekwo/mcp

설치

개요

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

Double-entry books an agent keeps as the user: invoices, VAT returns, 174 country packs.

PopNx MCP의 세 기둥

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

할 수 있는 일

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

  • 연결 방식: 컴퓨터 또는 클라우드
  • 전송 방식: stdio, Streamable HTTP
  • 카테고리: 회계, 재무 및 세금
  • 입력해야 할 값: SUPABASE_ANON_KEY, EKWO_PASSWORD, EKWO_ACCESS_TOKEN, EKWO_DB_URL

설치

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

설치하기 전에

  • 기본 점검: 1개 중 1개 통과
  • 제작자의 서버에서 실행돼요. 내가 요청한 내용은 제작자의 서버를 거쳐요.
  • 직접 입력할 값: SUPABASE_URL, SUPABASE_ANON_KEY, EKWO_EMAIL, EKWO_PASSWORD, EKWO_ACCESS_TOKEN, EKWO_DB_URL, EKWO_ACT_AS_USER_ID, EKWO_EINVOICE_DIRECTORY, EKWO_AGENT_POSTING

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

필요한 것

어떤 앱을 쓰세요?

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

웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:

  1. Settings → Connectors 열기
  2. Add custom connector 누르기
  3. 아래 주소를 붙여 넣고 Add 누르기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Add2https://…3
https://mcp.ekwo.ai/mcp

또는 내 컴퓨터에서 실행하기

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

{
  "mcpServers": {
    "ekwo": {
      "command": "npx",
      "args": [
        "-y",
        "@ekwo-ai/mcp"
      ],
      "env": {
        "SUPABASE_URL": "your-value",
        "SUPABASE_ANON_KEY": "your-value",
        "EKWO_EMAIL": "your-value",
        "EKWO_PASSWORD": "your-value",
        "EKWO_ACCESS_TOKEN": "your-value",
        "EKWO_DB_URL": "your-value",
        "EKWO_ACT_AS_USER_ID": "your-value",
        "EKWO_EINVOICE_DIRECTORY": "your-value",
        "EKWO_AGENT_POSTING": "your-value"
      }
    }
  }
}

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

claude mcp add --transport http ekwo https://mcp.ekwo.ai/mcp

또는 내 컴퓨터에서 실행하기

claude mcp add ekwo --env SUPABASE_URL=your-value --env SUPABASE_ANON_KEY=your-value --env EKWO_EMAIL=your-value --env EKWO_PASSWORD=your-value --env EKWO_ACCESS_TOKEN=your-value --env EKWO_DB_URL=your-value --env EKWO_ACT_AS_USER_ID=your-value --env EKWO_EINVOICE_DIRECTORY=your-value --env EKWO_AGENT_POSTING=your-value -- npx -y @ekwo-ai/mcp

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

Cursor에서 열기

또는 설정을 직접 복사하기

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

{
  "mcpServers": {
    "ekwo": {
      "url": "https://mcp.ekwo.ai/mcp"
    }
  }
}

또는 내 컴퓨터에서 실행하기

Cursor에서 열기

또는 설정을 직접 복사하기

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

{
  "mcpServers": {
    "ekwo": {
      "command": "npx",
      "args": [
        "-y",
        "@ekwo-ai/mcp"
      ],
      "env": {
        "SUPABASE_URL": "your-value",
        "SUPABASE_ANON_KEY": "your-value",
        "EKWO_EMAIL": "your-value",
        "EKWO_PASSWORD": "your-value",
        "EKWO_ACCESS_TOKEN": "your-value",
        "EKWO_DB_URL": "your-value",
        "EKWO_ACT_AS_USER_ID": "your-value",
        "EKWO_EINVOICE_DIRECTORY": "your-value",
        "EKWO_AGENT_POSTING": "your-value"
      }
    }
  }
}

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

VS Code에서 열기

또는 설정을 직접 복사하기

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

{
  "servers": {
    "ekwo": {
      "type": "http",
      "url": "https://mcp.ekwo.ai/mcp"
    }
  }
}

또는 내 컴퓨터에서 실행하기

VS Code에서 열기

또는 설정을 직접 복사하기

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

{
  "servers": {
    "ekwo": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@ekwo-ai/mcp"
      ],
      "env": {
        "SUPABASE_URL": "your-value",
        "SUPABASE_ANON_KEY": "your-value",
        "EKWO_EMAIL": "your-value",
        "EKWO_PASSWORD": "your-value",
        "EKWO_ACCESS_TOKEN": "your-value",
        "EKWO_DB_URL": "your-value",
        "EKWO_ACT_AS_USER_ID": "your-value",
        "EKWO_EINVOICE_DIRECTORY": "your-value",
        "EKWO_AGENT_POSTING": "your-value"
      }
    }
  }
}

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

ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:

  1. 웹에서 ChatGPT 열기 → Settings → Connectors (Apps)
  2. Create 또는 Add 누르기(일부 요금제는 먼저 Advanced에서 Developer mode를 켜야 해요)
  3. 아래 주소를 붙여 넣고 이름을 정한 뒤 저장하기
  4. 로그인하라고 하면 제작자의 서비스에 로그인하기
SettingsConnectors1+ Create2https://…3
https://mcp.ekwo.ai/mcp

메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.

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

직접 입력할 값

  • SUPABASE_URL env
    https:// .supabase.co of your own project
  • SUPABASE_ANON_KEY 비밀 env
    The anon (publishable) key. Never the service_role key: the server refuses it.
  • EKWO_EMAIL env
    The user the agent acts as
  • EKWO_PASSWORD 비밀 env
    That user's password
  • EKWO_ACCESS_TOKEN 비밀 env
    An access token, instead of email and password
  • EKWO_DB_URL 비밀 env
    Direct Postgres connection, for a self-hosted database without PostgREST
  • EKWO_ACT_AS_USER_ID env
    Required with EKWO_DB_URL: the auth.users id the server acts for
  • EKWO_EINVOICE_DIRECTORY env
    Optional: the folder electronic invoices are sent to. Unset, they are issued and kept, and not sent
  • EKWO_AGENT_POSTING env
    Optional: autopilot or review, how this session posts documents. Unset, each company's agent_posting decides

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

할 수 있는 일

아직 이 서버의 도구 목록을 읽지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요.

기본 점검i

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

  • ✓ 통과

    제작자와 저장소 일치

    레지스트리 이름이 도메인 ekwo.ai 기준으로 확인되었어요(레지스트리가 도메인 소유를 확인해요)

  • … 아직 점검 안 함

    계속 관리되고 있음

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

  • … 아직 점검 안 함

    라이선스 있음

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

  • … 아직 점검 안 함

    엔드포인트 응답

    아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요

  • … 아직 점검 안 함

    OAuth로 로그인

    아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요

  • … 아직 점검 안 함

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

    아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요

회계, 재무 및 세금 카테고리의 다른 서버와 비교i

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

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

자주 묻는 질문

Ekwo OS — open source accounting: ledger, invoices and VAT on your own Supabase…, 안전한가요?

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

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

입력해야 할 값: SUPABASE_ANON_KEY, EKWO_PASSWORD, EKWO_ACCESS_TOKEN, EKWO_DB_URL

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

둘 다 가능해요. 내 컴퓨터에 설치해도 되고, 클라우드 버전에 연결해도 돼요.

아직 관리되고 있나요?

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

어떤 앱에서 쓸 수 있나요?

Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.

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

같은 카테고리에는: Finance Toolkit, SolidInvoice, Korea Tax Calculator

대안

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

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

Finance Toolkit

제작자: JerBouma

500+ transparent financial methods calculated from raw statements, not third-party endpoints.

컴퓨터 또는 클라우드★ 5,496MIT어제 업데이트
설치

SolidInvoice

제작자: SolidInvoice

Create and send invoices and quotes, manage clients, and track payments in SolidInvoice.

클라우드에서 실행★ 981MIT7일 전 업데이트
설치

Korea Tax Calculator

제작자: UpstageAI

Korean tax calculation and tax-audit judgment MCP: 96 tools with statutory citations.

내 컴퓨터에서 실행★ 97MIT오늘 업데이트
설치

제작자의 README

README 열기

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

@ekwo-ai/mcp

The Model Context Protocol server for Ekwo OS. It lets an AI agent work on the books in your own Postgres: read the ledger, raise an invoice, post it, match a payment, prepare the VAT return — as you, under the row level security of your own installation.

There are two ways to reach it, and they are the same server.

Hosted, at https://mcp.ekwo.ai/mcp

For a client that adds remote servers rather than launching them — claude.ai, or any other that speaks Streamable HTTP. Nothing is installed, and no password or key is written into a configuration file.

https://mcp.ekwo.ai/mcp

Point a client at that address and it discovers the rest. An unauthenticated call is answered with 401 and a WWW-Authenticate header naming the server's protected-resource metadata (RFC 9728); the client follows it to the authorization server (RFC 8414), registers itself (RFC 7591, so it needs no credentials of its own) and sends the person to their browser to approve the connection. The scope asked for is books.

An agent reading this without a browser can start from /.well-known/oauth-protected-resource.

The books stay where they are: the hosted server holds none, and connects to the instance the person chooses when they approve it. On the same screen they decide whether the agent may write; otherwise it reads. The hosted server is operated by Ekwo Cloud, and signing in there needs an account — a free one, opened with an address and a six-digit code, which also gives the web application on the same books and a nightly backup of every company it links.

Locally, over stdio

npx -y @ekwo-ai/mcp@latest

For a client that launches its own servers — Claude Desktop, Claude Code, any editor that reads .mcp.json — against any installation, with no account. Keep @latest in the command: from inside a clone of the repository, a bare npx @ekwo-ai/mcp finds the unbuilt workspace package and answers ekwo-mcp: command not found.

With the command line installed, ekwo mcp starts the same server — the same entry point, runStdio(), the same flags (--autopilot, --review) and the same environment: "command": "ekwo", "args": ["mcp"].

What it is, and what it is not

The server holds no privileges of its own. It signs in as the person using it, or is handed their access token, and everything it can do afterwards is exactly what that person can do: a viewer reads and cannot write, a member of one company cannot see another, a locked period refuses a posting. None of that is checked in this package — the policies and the triggers in the schema decide, and this server reports what they answered.

Three things it will never do:

  • Write a ledger line. Every entry comes out of the schema's own functions, which carry the accounting rules. Direct inserts are for the objects a person types: contacts, draft documents and their lines, payments, bank transactions.
  • Delete or edit a posted entry. No tool removes one. A posted invoice is undone the one way its country allows — back to draft where nothing about it has left, otherwise by the credit note that names it — and an entry keyed by hand by its reversal.
  • Use a `service_role` key. It would work, and that is the objection: it bypasses every policy, so the agent would answer for companies its user was never invited to. The server refuses to start with one.

Configuration

The recommended route: PostgREST, as the signed-in user
{

"mcpServers": { "ekwo": { "command": "npx", "args": ["-y", "@ekwo-ai/mcp@latest"], "env": { "SUPABASE_URL": "https://YOURREF.supabase.co", "SUPABASE_ANON_KEY": "your anon (publishable) key", "EKWO_EMAIL": "you@example.com", "EKWO_PASSWORD": "your password" } } } }

That block goes in claude_desktop_config.json for Claude Desktop, or in .mcp.json at the root of a project for Claude Code. EKWO_ACCESS_TOKEN replaces the address and the password when you already hold a session; with the password, the session is kept in memory and refreshed, and nothing is written to disk.

The fallback: a direct Postgres connection

For a self-hosted installation with no PostgREST in front of the database, or for tests.

{

"env": { "EKWO_DB_URL": "postgresql://…", "EKWO_ACT_AS_USER_ID": "the auth.users id this server acts for" } }

EKWO_ACT_AS_USER_ID is required, and that is the whole point of this mode. A database connection is nobody: auth.uid() is null, row level security is bypassed rather than satisfied, and a server running that way would be a way round the policies rather than a client of them. So every query runs inside a transaction that sets request.jwt.claims to that user and switches to the authenticated role, and the policies bind exactly as they do over the API. This mode needs the postgres package installed alongside the server; the recommended route needs no driver at all.

VariableMeaning
SUPABASE_URLhttps:// .supabase.co
SUPABASE_ANON_KEYThe anon (publishable) key. A service_role key is refused.
EKWO_EMAIL / EKWO_PASSWORDThe user this agent acts as
EKWO_ACCESS_TOKENA session already in hand, instead of the two above
EKWO_DB_URLA direct Postgres connection, for a self-hosted installation
EKWO_ACT_AS_USER_IDRequired with EKWO_DB_URL: the auth.users id to act for
EKWO_NO_REGISTER_INVITEOptional. 1 leaves the invitation to register out of the instructions
EKWO_NO_CLOUD_OFFEROptional. 1 leaves the offer of a free Ekwo Cloud account out of the instructions; so does CI
EKWO_AGENT_POSTINGOptional. autopilot or review: how this session posts, as --autopilot and --review choose it. Unset, each company's agent_posting decides. See Review or autopilot
EKWO_EINVOICE_DIRECTORYOptional. The folder electronic invoices are sent to by einvoicing_issue with send. Unset, files are issued and kept, and sending is refused as no_transport
EKWO_MCP_TOOLSOptional. on_demand starts the session with the tools of a first session and lets the agent find and add the others; unset or all, every tool from the start. See Tools on demand
EKWO_FISCAL_SYSTEMOptional. The invoicing system einvoicing_fiscalise chains fiscal records under, as JSON: name, id, version, installation, producerName, producerTaxId, and the booleans a regime may ask (verifactuOnly, multipleTaxpayers, multipleTaxpayersNow). Unset, fiscalising is refused as no_fiscal_system; malformed, the server does not start
Started with nothing set

A client lists a server's tools as soon as it is added, and so do the directories that index MCP servers. So with none of the variables above — or with half of them — the server still starts, still answers the list of tools, and every tool call returns a not_configured error that names the variables to set and where. It connects nowhere until then, and it offers the tools of the socle only: which modules an installation carries is read from its database.

Only absence is forgiven. A service_role key, in either slot, and an EKWO_ACT_AS_USER_ID that is not a uuid are values somebody wrote, and the server still refuses to start with them.

npm run build -w @ekwo-ai/mcp

node packages/mcp/scripts/introspect.mjs # starts it with no environment and lists the tools

The Dockerfile at the root of the repository builds the same server from the checkout; docker run -i --rm speaks MCP over stdio, with the variables passed as -e.

Over HTTP: hosting it for others

The same server, reached by URL instead of started by a client: handleHttpRequest answers the Streamable HTTP transport of MCP. It is stateless — each request builds a server, answers in JSON and closes it, with no session id and nothing kept — so it runs on a function platform, behind a load balancer, or in one process. A GET is answered 405: this server never speaks first, so there is no stream to open.

It does not decide who is calling: the host authenticates the request its own way, then hands in the connection that request may use.

import { handleHttpRequest } from '@ekwo-ai/mcp';

export default async function (request: Request): Promise { const who = await yourOwnAuthentication(request); // a token you issued if (who === undefined) return new Response(null, { status: 401 }); return handleHttpRequest(request, { supabaseUrl: who.supabaseUrl, // https:// .supabase.co anonKey: who.publishableKey, // never the service_role key apiKey: who.ekwoKey, // or: accessToken: who.session }); }

A connection is one of two things, never both:

  • A person's access token on the instance. Row level security decides, exactly as for that person in a browser.
  • A key of Ekwo OS, as create_api_key() issues it. It travels in the X-Ekwo-Api-Key header with no Authorization beside it, the schema's pre-request hook presents it (decision 0062), and the caller is on that key's one company with that key's capabilities. A key issued without a capability that writes gives an agent that reads.

A service_role key is refused in all three slots, as on stdio. For node:http (or anything built on it), handleNodeRequest(req, res, connection, { origin }) is the same handler.

Putting it in front of people: authorization

A remote MCP client expects the server to follow the authorization part of the MCP specification: OAuth 2.1 with PKCE, protected resource metadata (RFC 9728), authorization server metadata (RFC 8414) and dynamic client registration (RFC 7591). That belongs to the host, not to this package: the host signs the person in, issues its own tokens, and maps each one to a connection above. The database stays the only place that decides what may be read or written.

The tools

Every write names its company explicitly.

ToolWhat it does
list_companiesThe companies you are a member of, with your role on each
get_companyFinancial years, lock dates, journals, default accounts
list_accountsThe accounts a company works with, by code prefix, type or name. include_all for the whole chart
search_contactsCustomers and suppliers, by name, type or VAT number
suggest_duplicate_contactsThe contacts that are probably one party, strongest first, one row per contact to absorb — the rows of one kept contact being one party: the contact to keep, a score, the evidence (the same VAT or registration number, the same bank account, the words of the name weighed by how few contacts carry them) and the simplest name the group carries, proposed for the kept contact. Writes nothing; merge_contacts joins a pair the user confirms
contact_statementThe statement of account of one contact over a period: the balance carried forward, each posted line of their receivable and payable accounts with its running balance and how far it is matched, and the closing balance
search_productsThe catalogue: code, unit, price, account and tax of what is sold and bought
list_documentsInvoices, credit notes and quotes, filtered
get_documentOne document with its lines and the entry it produced

| render_invoice_pdf | The PDF of a sale invoice or credit note, as a PDF resource (base64) b

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

PopNx에게 묻기