Fetch data by calling Wind's 7 MCP services through the local CLI,answer only based on the returned results: do not add common knowledge, do not add commentary, do not fill in blanks with numbers from memory.
Process each question in four steps:① Determine routing → ② Select tool → ③ Send command → ④ Read receipt。
Load on demand, do not read everything at once. The default path for selecting a tool is find(about five hundred characters each time, usually directly giving the unique hit and a usable example), not reading the entire catalog:
| What you want to know | Where to read | Approximately |
|---|---|---|
| Which server it belongs to | The routing table in Section 1 of this file | Already in context |
| Which tool it is and what the parameters look like | cli.mjs find <关键词> |
0.5 thousand characters |
| The full contract of this tool | cli.mjs describe <server> <tool> |
1 thousand characters |
| The values of certain fields | cli.mjs describe <server> <tool> <param ...> |
0.3–0.9 thousand characters |
What tools this server has (find when there are zero hits) |
Read directly references/<server>.md |
2–9 thousand characters |
| The full schema of all 132 tools | scripts/registry.json |
Do not read, that is for the CLI |
How to correct when an error occurs; the error envelope comes with a next field, just follow it, this file does not repeat it.
1. Determine routing
First, based onwhat is being askedchoose server. Once selected, only search for tools within this one server; parameters must always be based on the contract; do not read files of other servers, and do not fill in parameter names or field values from memory.
server |
Coverage | Tool catalog |
|---|---|---|
stock |
Company profile, financials, institutional expectations, valuation, company developments, capital flows, technicals, and real-time quotes for a single stock; intraday overview of the whole market and sectors, market narrative, industry corpus, stock screening | references/stock.md |
fund |
Public fund and ETF profiles, net asset value, scale, performance, subscription and redemption, financials, holdings details, asset/industry/security type allocation, Brinson and multi-factor attribution, style exposure, fund selection screening | references/fund.md |
edb |
EDB indicator retrieval and time series for macro, industry, regional, exchange rate, and interest rate data | references/edb.md |
futures |
Futures contract specifications and delivery rules, warehouse receipts, basis, capital flows, exchange seat position rankings, research report views, commodity supply and demand | references/futures.md |
options |
Term structure, option chain, volatility surface and cone, long-short sentiment for exchange-traded options; over-the-counter structured product pricing calculator | references/options.md |
company |
Domestic enterprises (including non-listed entities) business registration, equity penetration, personnel, qualifications, intellectual property, bidding, supply chain, as well as risk records such as judicial, dishonesty, penalties, tax anomalies, bankruptcy, and public opinion | references/company.md |
finance |
Cross-asset fallback when none of the six categories above covers it: global market snapshots and historical series, the Wind professional indicator library, report library, news/announcement/research report document library, investment research corpus, and natural language data retrieval | references/finance.md |
Four areas where the boundaries are easily confused; arbitrate in this order:
- Listed companies' operating data vs. enterprises' business registration and judicial records — financials, valuation, market data, and shareholder structure go to
stock; business registration, equity penetration, litigation, dishonesty, penalties, and public sentiment go tocompany. The same company can be queried on both sides; it depends on whether the user is asking aboutoperations or compliance。 - Bonds, foreign exchange, commodity spot, global indices ——
stock/fund/futures/optionshave no corresponding tools; go tofinance's market data and indicator tools. - Announcements, news, research reports — fora recent developments summary for a single stockgo to
stock.stock_get_company_updates; forfull text contentgo tofinance.general_query_documents(natural language search, returned body includes full text); tolist items precisely by type/security/datego tofinance.general_search_documents. Note thatgeneral_get_documentonly returns meta-information and the original text link, and文档内容was measured to be empty, so do not count on it to retrieve full text. - Fallback tools are ranked last ——
finance.general_query_data、finance.general_query_documentsis a natural language fallback, used only when no specialized tool covers it; they do not return reusable codes or ids, so the next step cannot be chained.
When the instrument type or intent does not fall into any row of the table above, directly reply OUT_OF_SCOPE and explain;do not use Web Search or fallback tools to pretend it is supported。
Out-of-scope determinationTake the routing table above as authoritative。find can assist, but itzero hits does not mean unsupported—the user's wording may not appear in the tool descriptions (find GDP simply cannot find the tool name, although edb fully covers it). On zero hits, find will give related_servers and a hint; follow the hint to recheck the routing table before deciding OUT_OF_SCOPE。
When an industry is involved and the user has not specified a classification system, default to the Wind industry classification.
2. Select tools
First cd to the directory where this SKILL.md resides (not the current project directory), then execute using relative paths. Everything below is offline: no network requests, no credit consumption.
node scripts/cli.mjs find <关键词> # 默认从这里开始
node scripts/cli.mjs describe <server> <tool> # 单个工具的完整契约
node scripts/cli.mjs describe <server> <tool> <param ...> # 只看指定几个参数的类型与枚举
find Each hit for summarycomes withboundary(【Boundary】first sentence),params(input parameter signature; short enums include their meaning, e.g. type*:integer(1=供需平衡/2=供应/3=需求/4=库存))、sample(measured examples), and possibly narrow_response(how to compress the returned body) and known_issue。Whether it is ready to call directly depends on these two:
boundarymatches the user's phrasing—not "did the user say the tool name," but whether this boundary descriptionexclusivelycovers what the user wants. If the user says "cases where the court cannot find property and enforcement cannot proceed," andcompany_get_final_case's boundary says "only checks records of termination of the current enforcement procedure," then it matches, and there is no need todescribe. When the boundaries of three candidates are mutually exclusive and only one fits, choose it.- Parameters do not need changing: copy
sample, replacing only obvious values such as the instrument name or code.
If even one does not hold, describe that tool. If you are just unsure about the values of a few fields, use describe <server> <tool> <param> [param ...](you can supply multiple at once; running it twice means paying the fixed overhead twice).
find A zero hit will return related_servers and a hint——zero hits does not mean unsupported(find GDP you will not find the tool name, even though edb fully covers it). In that case, read that server's references/<server>.md, which has the complete tool list and a section on "what this server is most likely to get wrong".
Do not guess parameters from tool names: the same field name has different meanings across servers (windCode in stock is a stock, in futures it is a variety, in options it is an underlying), and different types (futures_get_position_ranking.type is integer,futures_get_warehouse_receipt.type is string).
Troubleshooting commands (these send network requests):doctor(key + connectivity + registry drift + last self-update status),refresh [server](fetch the latest schema, write it back to the registry, and regenerate the catalog). Run node scripts/cli.mjs without parameters to see full usage.
3. Send the command
node scripts/cli.mjs call <server> <tool> '<params_json>'
node scripts/cli.mjs call stock stock_get_company_profile '{"windCode":"600519.SH"}'
Always get parameter values from the contract; do not extrapolate from this example.
First think clearly about whether you need the entire history. Response bodies are often much more expensive than the documentation:futures_get_supply_demand without disabling the historical series returns 16,000 characters; passing includeHistory:false leaves only 2,000 characters.find and describe of narrow_response the fields will list the parameters of that tool that can shrink the response body (includeHistory / limit / topK / observation / includeFields / indicators / strikeLevels , etc.). When the user only wants the latest value,be sure to narrow them。
Two-stage calls: for many tools, the input parameters must come from upstream return values (document number, indicator code, report id, sub-narrative ID, option contract code, etc.),do not make them up yourself. Which ones are two-stage and how the field names correspond at both ends are written in each server's "calling key points" (find after a hit, read references/<server>.md the "calling key points" at the top).
Parameter passing: POSIX shell passes inline <params_json>directly. In non-POSIX environments (PowerShell / cmd / wrapped by an executor), use a parameter file instead: write UTF-8 JSON to scripts/request-<唯一后缀>.json, pass @scripts/request-<唯一后缀>.json, delete it after the call, and do not reuse a shared file.
Key: you must not claim there is no API Key based only on checking the configuration file. You must actually run it once first; only returning AUTH_ERROR can determine that it is missing.
Batching and concurrency: default to serial. When calling item by item for 2 or more targets, first send only the first one as a probe; only continue if the probe succeeds. If the probe returns an error envelope, immediately terminate that batch, and do not spread the same call to other targets. Different server + tool or different parameter structures each group separately, each sending one probe. When the user explicitly requests concurrency, the upper limit is 5; once RATE_LIMIT_ERROR is returned, stop new requests and resume serial.
4. Read the receipt
stdout has only two forms.
Failure:{"ok":false,"code":"...","message":"...","next":"..."}。message explains what is wrong,next explains what to do next——follow next do, do not improvise on your own.code is PARAM_* when it has been blocked locally and no network request was sent; when it is backend_error , message is the backend's original text; if it also carries known_issue , do not retry. Retry the same tool with the same parameters at most once.
Success: data object, the backend result is in content[0].text (mostly a JSON string), and the CLI additionally appends a cli_meta. Before reading it, go through three checks:
- Verify that the returned security is the one you asked about(the security code / company name / indicator code in the response body). The backend's security identification may not error but may still identify the wrong one; see Section 5.
- If the structure is complete but a key field is an empty string, treat it as a failure. The envelope is
isError:false, and the text is valid JSON; the CLI's error sniffing cannot catch this form. - Units and magnitudes are governed by the metadata carried in the response body(for EDB in
meta.unit/meta.magnitude, for market data indata.unit); if the metadata does not provide them, keep the original values and state that the unit is unknown,do not convert on your own. There is one exception for EDB: whentargetCurrencyis passed,meta.unitdoes not change accordingly; the currency is always governed bymeta.currency, and copyingunitwill give a wrong answer that does not error.
5. Three pitfalls across servers
The pitfalls of a single server or a single tool are documented in their respective "Key points for calling" and in describe of known_issue . The following three can be encountered on any server:
- Business errors disguised as normal returns: the seven servers generally return "service temporarily unavailable" and "no valid financial security recognized" as plain text in
isError=false. The CLI has sniffed this and converted it intobackend_error, but if you see thatcontent[0].textin a success envelope is a short prompt rather than data, treat it as a failure as well. - Security identification is non-deterministic: for illegal or ambiguous codes/names, it mostly returns "no valid financial security recognized", but in testing there have also been cases ofreturning real data for an unrelated security without reporting any error(
999999.XXonce matched CSI 800). So the "verify the security first" rule in Section 4 is a hard requirement. - Descriptive text is not necessarily trustworthy: the schema descriptions for some fields give examples that are not in their own enum (
targetMagnitudesays "e.g. yuan, hundred million yuan", while the enum only accepts "hundred million" and "trillion"); conversely, the Chinese keys in thefuturesdescription ofsector/typeare not in the enum but are indeed accepted by the backend.Use thedescribeoutput ofenumandenum_aliasesas the standard, and the CLI allows or blocks based on the same determination.
6. Closing
When the security is not identified or NER fails, ask the user for the exact full name or the Wind standard code;do not add an exchange suffix on your own or guess a name as a code。
Authentication, quota, network, backend unavailable, routing errors: report them directly; do not take detours or substitute data from memory.
When data is returned successfully, append a source statement at the end, in the same language as the user's question:
The data comes from Wind, the financial data service.
Data sourced from Wind Financial Data Service.
Completion status:DONE、DONE_WITH_LIMITS、NO_RESULTS、BLOCKED_KEY、BLOCKED_QUOTA、BLOCKED_RUNTIME、OUT_OF_SCOPE。