分页和限制
代理在执行广泛查询时可能会出乎意料地积极。您的服务器应该不那么积极。
使用:
- 确定性排序,例如
filed_at desc, filing_id desc
- 尽可能使用基于游标的分页
- 合理的页面大小上限
- 明确的
has_more 和 next_cursor
这不仅仅是操作上的规范。它还可以防止代理将部分结果集总结为完整结果集。
Claude, Cursor 和 Windsurf 的 MCP 工具调用示例
协议客户端因环境而异,但概念流程相似。代理发现工具,解析实体,调用检索工具,然后可选地调用聚合工具。
以下是通用 JSON-RPC 风格的示例。确切的封装器将因客户端实现而异。
示例 1:从模糊提示中解析发行人
用户提示:
查找 LVMH 最新的内部人购买记录。
首先,代理应解析发行人。
工具调用
{
"tool": "resolve_issuer",
"arguments": {
"query": "LVMH",
"market": "FR",
"limit": 5
}
}
工具响应
{
"query": "LVMH",
"matches": [
{
"issuer_id": "fr_issuer_12345",
"name": "LVMH Moet Hennessy Louis Vuitton SE",
"ticker": "MC",
"isin": "FR0000121014",
"lei": "969500S6OI5FOBDZ2J08",
"market": "FR",
"confidence": 0.98
}
],
"schema_version": "2026-01"
}
然后检索最近的收购。
工具调用
{
"tool": "get_filings",
"arguments": {
"filters": {
"market": "FR",
"issuer_id": "fr_issuer_12345",
"transaction_type": ["ACQUISITION"],
"filing_date_from": "2026-01-01",
"limit_to_primary_disclosures": true
},
"sort": [
{"field": "filed_at", "direction": "desc"}
],
"page_size": 20
}
}
工具响应
{
"rows": [
{
"filing_id": "fr_filing_998877",
"transaction_id": "fr_tx_112233",
"issuer_id": "fr_issuer_12345",
"issuer_name": "LVMH Moet Hennessy Louis Vuitton SE",
"insider_id": "fr_insider_456",
"insider_name": "n/a",
"role_normalized": "DIRECTOR",
"transaction_date": "2026-02-14",
"filed_at": "2026-02-17T08:12:00Z",
"transaction_type": "ACQUISITION",
"security_type": "EQUITY",
"quantity": 1000,
"price": 712.5,
"currency": "EUR",
"gross_value": 712500,
"ownership_nature": "DIRECT",
"source_url": "https://..."
}
],
"page_info": {
"has_more": false,
"next_cursor": null
}
}
代理现在可以提供证据、日期和来源链接进行回复。
示例 2:筛选集群购买
用户提示:
显示过去 90 天内有集群购买行为的法国发行人。
这不应强迫代理重新发明散文定义。给它一个工具。
工具调用
{
"tool": "screen_cluster_buying",
"arguments": {
"filters": {
"market": "FR",
"transaction_date_from": "2026-02-16",
"transaction_date_to": "2026-05-17",
"transaction_type": ["ACQUISITION"],
"security_type": ["EQUITY"]
},
"min_insiders": 3,
"window_days": 30,
"min_total_value": null
}
}
工具响应
{
"definition": {
"transaction_type": "ACQUISITION",
"security_type": "EQUITY",
"min_distinct_insiders": 3,
"window_days": 30
},
"results": [
{
"issuer_id": "fr_issuer_222",
"issuer_name": "Example SA",
"window_start": "2026-03-10",
"window_end": "2026-04-08",
"distinct_insiders": 4,
"transaction_count": 5,
"total_gross_value": 1850000,
"currency": "EUR"
}
],
"as_of": "2026-05-17T00:00:00Z"
}
该响应是机器可读且自文档化的。这比许多投资者演示文稿要好得多。
示例 3:请求摘要而非行数据
用户提示:
按行业总结本季度法国的董事抛售情况。
工具调用
{
"tool": "summarize_activity",
"arguments": {
"filters": {
"market": "FR",
"transaction_type": ["DISPOSAL"],
"insider_role": ["DIRECTOR"],
"transaction_date_from": "2026-04-01",
"transaction_date_to": "2026-06-30"
},
"group_by": ["sector"],
"metrics": ["filing_count", "transaction_count", "distinct_issuers", "gross_value_sum"]
}
}
工具响应
{
"rows": [
{
"sector": "Consumer Discretionary",
"filing_count": 12,
"transaction_count": 15,
"distinct_issuers": 7,
"gross_value_sum": 9400000,
"currency": "EUR"
},
{
"sector": "Financials",
"filing_count": 9,
"transaction_count": 11,
"distinct_issuers": 5,
"gross_value_sum": 6100000,
"currency": "EUR"
}
],
"methodology": {
"group_by": ["sector"],
"metrics": ["filing_count", "transaction_count", "distinct_issuers", "gross_value_sum"],
"normalization_notes": "Sector classification based on issuer master as of query date"
}
}
再次强调,重点不仅仅是回答问题。而是以一种能够经受后续追问的方式来回答。
架构应遵循的监管背景
如果您的MCP服务器覆盖多个市场,那么一个比较层会很有用。这并非因为每个用户都要求它,而是因为服务器应该知道它所处的环境。