Connect an AI agent (MCP)
DataSinking is an MCP server. Point your agent at it and it can search and read full-text filings from China, Korea, Japan and Taiwan in plain language — no code, six tools. Get a free key first. Part of the API reference.
Pick your client
| Client | Config file | Hosted URL works |
| Claude Code | ~/.claude.json, .mcp.json | yes |
| Claude Desktop | claude_desktop_config.json + Connectors UI | via the UI |
| Cursor | .cursor/mcp.json | yes |
| OpenAI Codex CLI | ~/.codex/config.toml | yes |
| WorkBuddy / CodeBuddy | ~/.workbuddy/mcp.json, ~/.codebuddy/.mcp.json | CodeBuddy only |
| Anything else | command + args + env | usually |
| DeepSeek (Harness dsh) | ~/.dsh/cordis.patch.yml (YAML) | yes |
| Windsurf / Devin | ~/.config/devin/mcp_config.json | yes |
The hosted endpoint
One URL, nothing to install, no Python or Node on your machine. Auth is a bearer header, or ?apikey= for clients that can't set headers.
https://api.datasink.ing/mcp Authorization: Bearer YOUR_KEY # or: https://api.datasink.ing/mcp?apikey=YOUR_KEY
Every client below shows the hosted form where it's supported. Where it isn't, the docs fall back to the local server — same six tools, run on your own machine via npx or uvx, still nothing to install.
Claude Code
.mcp.json · ~/.claude.json
One command — add the key when prompted, then check it connected:
claude mcp add --transport http datasinking https://api.datasink.ing/mcp \ --header "Authorization: Bearer YOUR_KEY" claude mcp list # → datasinking: ✔ Connected
Add --scope user to get it in every project instead of just this one. Claude Code health-checks the server itself, so claude mcp get datasinking tells you exactly why a connection failed.
Claude Desktop
claude_desktop_config.json
Settings → Connectors → Add → Add custom connector, paste https://api.datasink.ing/mcp, and complete the auth prompt. Don't edit the JSON file for this and don't use mcp-remote — that file is stdio-only and takes no url key.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"datasinking": {
"url": "https://api.datasink.ing/mcp",
"headers": { "Authorization": "Bearer ${env:DATASINK_API_KEY}" }
}
}
}Cursor interpolates ${env:NAME} — not ${NAME} like Claude Code. Restart Cursor after editing; connection errors show up under Output → MCP Logs.
OpenAI Codex CLI
~/.codex/config.toml
[mcp_servers.datasinking] url = "https://api.datasink.ing/mcp" bearer_token_env_var = "DATASINK_API_KEY"
Codex has no type field — transport is inferred from whether you wrote url or command. The header key is http_headers, not headers, and a bare bearer_token is rejected — use the env var.
WorkBuddy / CodeBuddy (Tencent)
~/.workbuddy/mcp.json · ~/.codebuddy/.mcp.json
These are two different products with two different config files — the most common reason a config “doesn't take effect”:
// WorkBuddy (desktop app) — ~/.workbuddy/mcp.json
{
"mcpServers": {
"datasinking": {
"command": "npx",
"args": ["-y", "datasinking-mcp"],
"env": { "DATASINK_API_KEY": "YOUR_KEY" }
}
}
}WorkBuddy's documented config is stdio-only; the type: "http" form works on CodeBuddy Code, which keeps its config in ~/.codebuddy/.mcp.json. Restart the app after editing either one.
Any other MCP client
command + args + env
Local, stdio, Node 18+ or Python 3.8+:
{
"mcpServers": {
"datasinking": {
"command": "npx",
"args": ["-y", "datasinking-mcp"],
"env": { "DATASINK_API_KEY": "YOUR_KEY" }
}
}
}
# Python instead of Node:
# "command": "uvx", "args": ["--from", "datasinking[mcp]", "datasinking-mcp"]What the agent gets
Six tools. They map onto the REST endpoints one-to-one, so anything in the API reference is reachable by asking.
| list_exchanges | Which markets are covered, and how much |
| list_stocks | Companies on one exchange |
| list_reports | A company's filings — metadata only |
| get_report | One filing, full text |
| list_sections | A filing's chapter headings, with sizes |
| get_section | One chapter only — token-efficient, best for RAG |
Ask “Which exchanges does DataSinking cover?” as a first test — the agent calling list_exchanges proves the whole chain works. Then try “What does Toyota's latest annual report say about risks?”
If it won't connect
The hosted endpoint is POST-only and stateless. Those two facts cause most failed connections, because clients tend to assume the opposite:
| 401 | {"detail":"Missing API key"} — nothing was sent. {"detail":"无效的 API key"} — the key isn't recognised. |
| 405 | GET was used. There is no SSE stream — POST only. |
| no tools | Restart the client. Every one of them reads MCP config at launch. |
| blank header | The env var wasn't set before the client launched, or you used the wrong interpolation syntax for that client. |
To tell “my client is misconfigured” apart from “my key is wrong”, skip the client entirely:
curl -s -X POST https://api.datasink.ing/mcp \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Per-client troubleshooting — including the errors each client actually prints — is in the guides linked above, under docs/mcp/.
Keep the attribution
Every response carries a source field naming the official platform the filing came from — cninfo.com.cn (China), DART (Korea), EDINET (Japan), MOPS (Taiwan). The MCP tool descriptions tell the model to keep it when citing. Please don't strip it when you redistribute.