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 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
DATACORE_SKILLS envDATACORE_TIMEOUT env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过域名 datacore.vn 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:DATACORE_A2A_URL, DATACORE_API_KEY, DATACORE_MANDATE
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.2.5)于10天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 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
只显示了开头部分;其余内容请在仓库中阅读