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

ClientConfig fileHosted URL works
Claude Code~/.claude.json · .mcp.jsonyes
Claude DesktopConnectors UI · claude_desktop_config.jsonyes
Cursor.cursor/mcp.jsonyes
OpenAI Codex CLI~/.codex/config.tomlyes
WorkBuddy / CodeBuddy~/.workbuddy/mcp.json · ~/.codebuddy/.mcp.jsonCodeBuddy only
Doubao Workin-app connectors, no fileyes
Devin Desktop%AppData%\devin\mcp_config.jsonyes
DeepSeek Harness (dsh)~/.dsh/profiles/<name>/cordis.patch.ymlyes
Gemini CLI~/.gemini/settings.jsonyes
OpenCode~/.config/opencode/opencode.jsonyes
Qoder~/.qoder/settings.json (CLI) · Settings → MCP (IDE)yes
Reasonixreasonix.toml · .mcp.jsonyes
Mobile (Kelivo / Joey / Systemprompt)in-app, no config fileyes
Any other clientcommand + args + envyes

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.

Full setup guide →

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.

Full setup guide →

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.

Full setup guide →

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.

Full setup guide →

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.

Full setup guide →

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.

Full setup guide →

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.

Full setup guide →

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: true

Keep failOnStartupError: true. The default is false, which connects to nothing and reports no error. Tools appear as mcp__datasinking__<tool>.

Full setup guide →

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.

Full setup guide →

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}.

Full setup guide →

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.

Full setup guide →

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>.

Full setup guide →

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.

Full setup guide →

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"]

Full setup guide →

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_exchangesWhich markets are covered, and how much
list_stocksCompanies on one exchange
list_reportsA company's filings — metadata only
get_reportOne filing, full text
list_sectionsA filing's chapter headings, with sizes
get_sectionOne 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 toolsRestart 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.