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 the US, China, the UK, Japan, Korea 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 | Connectors UI · claude_desktop_config.json | yes |
| Cursor | .cursor/mcp.json | yes |
| OpenAI Codex CLI | ~/.codex/config.toml | yes |
| WorkBuddy / CodeBuddy | ~/.workbuddy/mcp.json · ~/.codebuddy/.mcp.json | CodeBuddy only |
| Doubao Work | in-app connectors, no file | yes |
| Devin Desktop | %AppData%\devin\mcp_config.json | yes |
| DeepSeek Harness (dsh) | ~/.dsh/profiles/<name>/cordis.patch.yml | yes |
| Gemini CLI | ~/.gemini/settings.json | yes |
| OpenCode | ~/.config/opencode/opencode.json | yes |
| Qoder | ~/.qoder/settings.json (CLI) · Settings → MCP (IDE) | yes |
| Reasonix | reasonix.toml · .mcp.json | yes |
| Mobile (Kelivo / Joey / Systemprompt) | in-app, no config file | yes |
| Any other client | command + args + env | yes |
The endpoint
One URL, nothing to install. Auth is a bearer header, or ?apikey= in the URL for the clients that can't set one.
https://api.datasink.ing/mcp Authorization: Bearer YOUR_KEY # or: https://api.datasink.ing/mcp?apikey=YOUR_KEY
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, then paste the URL with your key already in it:
https://api.datasink.ing/mcp?apikey=YOUR_KEY
The key has to be in the URL. A bare URL makes the connector attempt OAuth, and this server has none — you get “Couldn't register with …'s sign-in service.” Then restart the app; connectors load at launch.
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
One command — it writes the config for you:
codex mcp add datasinking --url https://api.datasink.ing/mcp \ --bearer-token-env-var DATASINK_API_KEY codex mcp list # → datasinking
Set that environment variable before launching — Codex stores the variable's name, not the key itself.
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.
Doubao Work (ByteDance)
no file — configured in the app
ByteDance's counterpart to WorkBuddy. This one is configured entirely in the UI — there is no config file to edit, which is why it doesn't follow the pattern of the rows above:
技能 · 连接器 · 伙伴 → 新建 → 新建自定义连接器
- Transport: HTTP (STDIO is offered too, if you'd rather run the local server)
- URL:
https://api.datasink.ing/mcp - 自定义 Headers:
Authorization=Bearer YOUR_KEY
Save and confirm the toggle is on. Two things worth knowing: custom MCP connectors load only in the desktop client — the browser and mobile builds ignore them — and Doubao accepts the header directly, so the ?apikey= fallback isn't needed here.
Devin Desktop
%AppData%\devin\mcp_config.json
Formerly Windsurf. Get the right file via Cascade → MCP → Open MCP config file:
{
"mcpServers": {
"datasinking": {
"serverUrl": "https://api.datasink.ing/mcp",
"headers": { "Authorization": "Bearer ${env:DATASINK_API_KEY}" }
}
}
}The remote field is serverUrl, not url — the only client here that differs. On Windows the file is %AppData%\devin\mcp_config.json; on macOS and Linux, ~/.config/devin/mcp_config.json.
DeepSeek Harness (dsh)
~/.dsh/profiles/<name>/cordis.patch.yml
dsh has no MCP config file — servers are plugins. Install it into a profile first:
dsh plugin --profile web add @deepseek-ai/dsh-mcp-client
Then add this row to that profile's patch layer:
- insert:
- id: mcp-datasinking
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: datasinking
transport: streamable-http
url: https://api.datasink.ing/mcp
headers:
Authorization: !!js '`Bearer ${process.env.DATASINK_API_KEY}`'
failOnStartupError: trueKeep failOnStartupError: true. The default is false, which connects to nothing and reports no error. Tools appear as mcp__datasinking__<tool>.
Gemini CLI
~/.gemini/settings.json
One command, or edit the config:
gemini mcp add --transport http datasinking https://api.datasink.ing/mcp \ --header "Authorization: Bearer YOUR_KEY" gemini mcp list # → datasinking
The config-file field is httpUrl, not url — url means SSE:
{
"mcpServers": {
"datasinking": {
"httpUrl": "https://api.datasink.ing/mcp",
"headers": { "Authorization": "Bearer ${DATASINK_API_KEY}" }
}
}
}The consumer app (gemini.google.com → Connected Apps) is OAuth-only, so use the key-in-URL form ?apikey= there, or stick with the CLI.
OpenCode
~/.config/opencode/opencode.json
OpenCode merges config from ~/.config/opencode/opencode.json and a project opencode.json. Its MCP key is mcp — not mcpServers:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"datasinking": {
"type": "remote",
"url": "https://api.datasink.ing/mcp",
"oauth": false,
"headers": { "Authorization": "Bearer {env:DATASINK_API_KEY}" }
}
}
}Two settings do the real work. "oauth": false stops OpenCode from treating our 401 as an OAuth challenge — leave it out and you get an authorization error instead of a missing-key error. And note the interpolation syntax is {env:NAME}, where Claude Code and Cursor use ${NAME}.
Qoder
~/.qoder/settings.json (CLI) · Settings → MCP (IDE)
Qoder CLI and Qoder IDE read different configuration. For the CLI, add to mcpServers in ~/.qoder/settings.json:
{
"mcpServers": {
"datasinking": {
"type": "http",
"url": "https://api.datasink.ing/mcp",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
}stdio is the default type, so a URL without "http" fails as a launch error. Tools appear as mcp__datasinking__<tool>. In the IDE, open Settings (Ctrl Shift ,) → MCP → My Servers → + Add instead — the IDE does not read the CLI file.
Reasonix
reasonix.toml · .mcp.json
Reasonix reads the official MCP Registry, so there's a one-liner. Or declare the server yourself with a [[plugins]] entry in ./reasonix.toml (or ~/.reasonix/config.toml for every project):
reasonix mcp install io.github.heubme2020/datasinking
# or, by hand:
[[plugins]]
name = "datasinking"
type = "http"
url = "https://api.datasink.ing/mcp"
headers = { Authorization = "Bearer ${DATASINK_API_KEY}" }type defaults to stdio, so the "http" line is required. Cold servers connect in the background — if a tool isn't there yet, retry rather than re-checking your config. Tools appear as mcp__datasinking__<tool>.
Mobile (Kelivo / Joey / Systemprompt)
in-app, no config file
Any mobile app that speaks MCP over streamable HTTP works — nothing to install, no config file. Add the server in the app (Settings → MCP → Add):
URL: https://api.datasink.ing/mcp Authorization: Bearer YOUR_KEY # if the app can't set a header, put the key in the URL: # https://api.datasink.ing/mcp?apikey=YOUR_KEY
Known-working apps: Kelivo (kelivo.psycheas.top), Joey MCP Client (Android), Systemprompt (Android/iOS). It's the same endpoint the desktop clients use, so the six tools and the ?apikey= fallback behave identically.
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
Nearly every failure is one of these three:
| {"detail":"Missing API key"} | Nothing was sent — the environment variable wasn't set before the client launched. |
| {"detail":"无效的 API key"} | The key isn't recognised — check for a stray space or a missing Bearer . |
| no tools | Restart the client — all of them read MCP config at launch. |
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 — SEC EDGAR (US), cninfo.com.cn (China), filings.xbrl.org (UK), EDINET (Japan), DART (Korea), MOPS (Taiwan). The MCP tool descriptions tell the model to keep it when citing. Please don't strip it when you redistribute.