cn-intel-mcp
by lory69060
README.md
# cn-intel-mcp
**China hard-tech supply-chain intel, as a Model Context Protocol (MCP) server.**
`cn-intel-mcp` serves a **pre-registered, timestamped signal board** covering China's
hard-tech supply chain — memory/semiconductors, solid-state batteries, eVTOL / low-altitude
economy, and innovative drugs. Every signal carries a `predicted_on` date, a `verify_by`
deadline, and a `verify_event`, then gets publicly marked hit / partial / miss / delayed
when the date arrives. This is a **verifiable track record** (what the research actually
foresaw), not a dump of raw news.
- **Remote endpoint:** `https://cn-intel-mcp.lory69060.workers.dev/mcp`
- **Transport:** Streamable HTTP + Bearer token
- **Runtime:** Cloudflare Workers (stateless) + Workers KV for call stats/tokens
- **SDK:** `@modelcontextprotocol/sdk` (TypeScript)
## Why it's different
Most data MCPs expose raw facts. This one exposes the **judgment layer** — *what a public
fact means*, with a falsifiable, date-stamped prediction history. The track record
(`get_track_record`) is the asset that accumulates over time and cannot be retroactively
generated by an LLM.
## Tools (6)
| Tool | Description |
|------|-------------|
| `read_signal_board` | The signal board: high information-gap signals, each with `predicted_on` / `verify_by` / `verify_event` / `result`. Filter by `industry`, `result`, or `limit`. |
| `read_earnings_tracker` | Earnings verification tracker: companies the board predicted vs. their actual reported results vs. verification status. |
| `get_track_record` | The track record: hit-rate stats, verified vs. pending counts, per-signal outcomes from `predicted_on` to `verify_by`. |
| `ask_edge` | Q&A edge query: ask a natural-language industry question, get the most relevant signals + the reasoning behind them (judgment layer, not raw data). |
| `list_articles` | List deep-research articles on China hard-tech supply chain (title / topic / link). |
| `read_article` | Read a full research article (Chinese) by title, fuzzy-matched. |
### Signal industries
- 存储/半导体 (memory & semiconductors)
- 固态电池 (solid-state batteries)
- 低空经济/eVTOL (low-altitude economy / eVTOL)
- 创新药 (innovative drugs)
- 消费/白酒 (consumer / baijiu)
## Quick start (connect an MCP client)
The remote server requires a Bearer token. Point any Streamable-HTTP MCP client
(Claude Desktop, Cursor, etc.) at the endpoint:
```json
{
"mcpServers": {
"cn-intel": {
"url": "https://cn-intel-mcp.lory69060.workers.dev/mcp",
"headers": { "Authorization": "Bearer <YOUR_TOKEN>" }
}
}
}
```
No token → `401`. Health check (no auth): [`/health`](https://cn-intel-mcp.lory69060.workers.dev/health).
## Self-host on Cloudflare Workers
```bash
npm install
npm run dev # local dev at :8787
npm run deploy # deploy to your own Cloudflare account (wrangler deploy)
# Set / rotate the access token (stored as a Workers Secret, hashed in KV)
npx wrangler secret put MCP_ACCESS_TOKEN
# End-to-end MCP SDK client test (6 tools, track record, filters)
node mcp_sdk_test.mjs
```
Requires two Workers KV namespaces (`MCP_STATS` for call stats, `MCP_TOKENS` for hashed
tokens) — see [`wrangler.jsonc`](wrangler.jsonc). If `MCP_ACCESS_TOKEN` is unset, the
server runs open (no auth), which is convenient for local testing.
## Architecture
```
MCP client (Claude / Cursor / agents)
│ Streamable HTTP + Bearer token
▼
Cloudflare Worker (stateless, @modelcontextprotocol/sdk, 300s Cache API)
│
▼
Public data layer (JSON feeds: signal board, earnings tracker, articles)
```
The Worker is stateless: it serves cached JSON data from a public data layer. Tokens are
SHA-256 hashed before storage and compared at request time — no plaintext secrets at rest.
## License
[MIT](LICENSE)
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues