Finance Toolkit
500+ transparent financial methods calculated from raw statements, not third-party endpoints.
제작자가 쓴 설명(영어 원문)
Normalise Vietnamese addresses and look up companies by name or tax code, through DataCore A2A.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
DATACORE_A2A_URL, DATACORE_API_KEY, DATACORE_MANDATE, DATACORE_SKILLS, DATACORE_TIMEOUT비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"datacore-a2a": {
"command": "uvx",
"args": [
"datacore-a2a-mcp"
],
"env": {
"DATACORE_A2A_URL": "your-value",
"DATACORE_API_KEY": "your-value",
"DATACORE_MANDATE": "your-value",
"DATACORE_SKILLS": "your-value",
"DATACORE_TIMEOUT": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add datacore-a2a --env DATACORE_A2A_URL=your-value --env DATACORE_API_KEY=your-value --env DATACORE_MANDATE=your-value --env DATACORE_SKILLS=your-value --env DATACORE_TIMEOUT=your-value -- uvx datacore-a2a-mcp실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"datacore-a2a": {
"command": "uvx",
"args": [
"datacore-a2a-mcp"
],
"env": {
"DATACORE_A2A_URL": "your-value",
"DATACORE_API_KEY": "your-value",
"DATACORE_MANDATE": "your-value",
"DATACORE_SKILLS": "your-value",
"DATACORE_TIMEOUT": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"datacore-a2a": {
"type": "stdio",
"command": "uvx",
"args": [
"datacore-a2a-mcp"
],
"env": {
"DATACORE_A2A_URL": "your-value",
"DATACORE_API_KEY": "your-value",
"DATACORE_MANDATE": "your-value",
"DATACORE_SKILLS": "your-value",
"DATACORE_TIMEOUT": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
DATACORE_SKILLS envDATACORE_TIMEOUT env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 6일 점검
레지스트리 이름이 도메인 datacore.vn 기준으로 확인되었어요(레지스트리가 도메인 소유를 확인해요)
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: DATACORE_A2A_URL, DATACORE_API_KEY, DATACORE_MANDATE
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.2.5)은 10일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Finance Toolkit, SolidInvoice, Korea Tax Calculator
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
500+ transparent financial methods calculated from raw statements, not third-party endpoints.
Create and send invoices and quotes, manage clients, and track payments in SolidInvoice.
Korean tax calculation and tax-audit judgment MCP: 96 tools with statutory citations.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
English · Tiếng Việt
Lets an MCP client (Claude Code, Claude Desktop, VS Code, Cursor…) use DataCore's data skills as native tools: normalise Vietnamese addresses, validate an address, look up a company, generate embeddings.
MCP client (stdio) ──► datacore-mcp ──HTTPS──► DataCore gateway
Zero dependencies, Python 3.9+.
This server is a client, not a service. It needs a DataCore endpoint and a credential to call it with. Missing either one, it starts, says which variable is absent, and exits.
You need an account on datacore.vn first.
pip install datacore-a2a-mcp
If you installed from GitHub while this was unreleased,
--upgradewill not
move you to the PyPI build — uninstall first, then install again.
Sign in at datacore.vn, then copy the token request header from any call to gateway.datacore.vn (DevTools → Network). 64 hex chars.
No curl equivalent: POST /auth/login RSA-decrypts the password and no endpoint publishes the public key, so only the web app can complete a login. A credential page will remove this step.
Ignore the jwt from the same login — the gateway rejects client-supplied Authorization with 409; token is the header it accepts.
curl -s -X POST https://gateway.datacore.vn/mcp/credentials \
-H "token: <64-character token>" \ -H 'Content-Type: application/json' \ -d '{"name":"claude-code"}' | jq .
201 with the credential, including api_key, key_prefix, allowed_skills, spend_cap_vnd and quota_period.
Copy api_key straight away — it is returned once. Only a hash is stored, so there is no way to read it back. Lose it and you create a new one.
A 409 here means you are already holding the maximum of 3 active credentials. Revoke one first (see Quotas and limits).
See Configuration below.
There is no web UI for steps 2–3 yet; curl is the way. When a management page exists, these commands keep working.
| Free tier | 500,000 VND of spend per credential per month |
| Price per call | 500 VND by default, so roughly 1,000 calls |
| Reset | 1st of the month, Asia/Ho_Chi_Minh |
| Credentials | at most 3 active per account |
| Credential lifetime | 90 days |
| Mandate issuance | at most 10 exchanges per minute per credential |
The cap is counted per credential, not per account — three credentials give an account three separate caps. The service meters in VND rather than in calls so that per-skill prices can be introduced later without rewriting stored caps.
A credential is not bound to a machine or an IP, so the same key works from another computer — on one shared quota, and one revocation kills both.
Check what a credential has spent, and revoke it:
curl -s https://gateway.datacore.vn/mcp/credentials/<id>/usage -H "token: <token>" | jq .
curl -s https://gateway.datacore.vn/mcp/credentials -H "token: " | jq . curl -X DELETE https://gateway.datacore.vn/mcp/credentials/ -H "token: "
/usage reports spent_vnd, spend_cap_vnd, quota_period and resets_at. Revocation returns 204, and 404 if the id is not yours — the two cases are deliberately indistinguishable.
| Variable | Required | Meaning |
|---|---|---|
DATACORE_A2A_URL | yes | Base URL of the DataCore gateway — https://gateway.datacore.vn, unless you were given your own endpoint |
DATACORE_API_KEY | yes¹ | Long-lived credential, shaped dck_ _ . The server exchanges it for short-lived mandates and refreshes them itself |
DATACORE_MANDATE | yes¹ | A hand-issued AP2 mandate. Only for callers set up the old way — see below |
DATACORE_SKILLS | no | Comma-separated skill ids to narrow the tool list, or * for everything the endpoint returns. Empty uses the default four |
DATACORE_TIMEOUT | no | Per-request timeout in seconds, default 30 |
¹ One of the two is required. If both are set, DATACORE_MANDATE wins.
Use the URL DataCore gave you. A different endpoint will not recognise your credential and answers 401.
DATACORE_API_KEY is the one to useA mandate lives 15 minutes. With DATACORE_API_KEY, the server requests a fresh one a minute before the current one expires, so you never edit a config file because a token ran out. The mandate stays in process memory and is never written anywhere. If a call still comes back 401, the server forces one refresh and retries exactly once before reporting the failure.
DATACORE_MANDATE still works and is never refreshed — it is there for anyone configured before credentials existed. When it expires you replace it by hand and restart the MCP server.
claude mcp add datacore-a2a -s user \
-e DATACORE_A2A_URL=https://gateway.datacore.vn \ -e DATACORE_API_KEY= \ -- datacore-mcp
Replace with the api_key from step 3 — it looks like dck_<8 hex chars>_ .
-s user registers it for every project. Prefer this over a project-scope .mcp.json: that file tends to get committed, and the key is a 90-day bearer credential.
Merge the block below into the config — do not replace the file, it holds your app preferences.
| OS | Config path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
{
"mcpServers": { "datacore-a2a": { "command": " ", "env": { "DATACORE_A2A_URL": "https://gateway.datacore.vn", "DATACORE_API_KEY": " " } } } }
Both <...> values are yours to fill in — JSON has no comments, so nothing in the file will remind you:
| Placeholder | Where it comes from |
|---|---|
| which datacore-mcp (macOS/Linux) or where datacore-mcp (Windows). Something like /home/you/.local/bin/datacore-mcp or C:\Users\you\AppData\Roaming\Python\Scripts\datacore-mcp.exe |
| the api_key from step 3, shaped dck_<8 hex chars>_ |
It has to be an absolute path: the desktop app does not inherit your shell PATH, so a bare command name usually fails to start. python -m datacore_mcp.server works too. Then quit the app completely — closing the window is not enough.
Logs go to stderr, which the app keeps in the logs/ directory beside that config file.
The tool list is generated from the endpoint, not hardcoded here — so when DataCore adds a skill, restarting the server is enough to see a new tool.
Five skills are exposed by default, the ones wired to a real backend:
| Tool | Skill id | What it does |
|---|---|---|
address_normalize | address.normalize | Normalises a Vietnamese address into province / district / ward |
address_validate | address.validate | Checks an address against administrative data |
company_search | company.search | Looks a company up by name or tax code |
company_graph | company.graph | Returns the company's relationships — representative, province, industry, and anything else the graph holds |
company_embeddings | company.embeddings | Generates an embedding vector for a piece of text |
Every tool takes one required argument, text, a free-text string; no other properties are accepted. Every tool is read-only (readOnlyHint: true): nothing is written, deleted or created, and the same input gives the same result.
DataCore's two other skills (company.financial-sankey, company.news) are deliberately not exposed: they currently return mock/deterministic data. Setting DATACORE_SKILLS="*" lists them as tools, but a free-tier credential cannot call them — its allowlist holds only the five skills above, so every call returns 403. Asking for extra skills when creating a credential is not an error either; the request is silently narrowed to the five.
company.graphused to be on that list. It now reads real relationships, so
a credential created before this release does not include it — the allowed
skills are written into each credential when it is issued. Create a new one to
pick it up.
Three prompts that go through three different tools:
This server carries the mandate verbatim in the X-AP2-Mandate header for DataCore to verify, and declares no authorization header of its own. A client has no business authorizing itself — it forwards what it was given, and every allow or deny decision stays on the DataCore side.
The API key travels in X-Datacore-Credential when exchanged for a mandate, not in Authorization. DataCore's gateway keeps Authorization for itself — it signs and injects that header after authenticating the caller — so any request that arrives carrying one is rejected with 409 and an empty body. If you call /mandate/issue by hand and get a 409 with no message, that is why.
The API key is a bearer credential: whoever holds it can exchange it for a mandate and call the skills it allows until the cap runs out. Treat it like a password — do not commit a filled-in .mcp.json, and if your client supports it, read the key from a secret manager instead of inlining it. If it leaks, revoke it immediately with DELETE /mcp/credentials/ (see Quotas and limits); mandates already issued from it keep working for the rest of their 15 minutes — there is no instant revocation list.
The mandate is the opposite: 15 minutes of life, process memory only. It is not written to disk, never logged, and you should never need to look at it.
Issuance is rate-limited to 10 exchanges per minute per credential, so the endpoint cannot be used to walk the key space. Every rejection — unknown key, revoked key, expired key, wrong secret — returns the same 401 message for the same reason.
This package never logs a token, not even partially, and never logs the text you send. That is a promise about the process running on your machine — the service side is a separate matter, and PRIVACY.md says plainly what it stores.
Logs go to stderr, prefixed [datacore-mcp]. stdout is the JSON-RPC channel.
| S
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요