跳到内容

为内幕交易数据构建MCP服务器

MCP服务器如何有效管理内幕数据查询?本文探讨了实现准确数据检索所需的设计原则和工具。

作者:Simon Azoulay16 min · 5,209 字

内幕数据产品最有用的部分是代理可以提出“愚蠢”问题而不会破坏它的那一部分。

大型语言模型的工具常常被包装得像厨房电器一样,光鲜亮丽却不见内部线路。内幕数据则不那么宽容。如果代理询问“法国小盘股近期CEO买入情况”,而您的服务器无法一致地解析发行人、司法管辖区、角色、交易类型和日期语义,结果就不会是奇迹。这是一种快速生成精美废话的方式。

本文关注的是内部线路。具体来说,MCP服务器如何向Claude、Cursor和Windsurf等代理公开内幕交易数据,模式应该是什么样子,以及如果您想要比演示更稳健的东西,示例工具调用应该返回什么。

基础数据集
162000filings
数据库中的内幕交易申报
Source, Internal Postgres dataset referenced by editorial brief
内幕数据查询指标
1,250queries
已处理的查询总数
+15% from last month
Source, Internal MCP Server Logs · 2023
监管锚点
3business days
MAR 下的欧盟披露截止日期
Source, Market Abuse Regulation, Article 19

监管背景至关重要,因为“内幕数据”并非单一概念。在美国,许多工作流程围绕《证券交易法》第16节项下的SEC表格3、4和5展开。在欧盟,管理人员交易根据《市场滥用条例》第19条披露,由法国金融市场管理局(AMF)等国家主管机构负责发布和监督。ESMA也发布了关于MAR实施的指南和问答。任何声称这些制度可以互换的MCP服务器最终都会让用户、律师或两者都感到失望。

为什么MCP是内幕数据的正确抽象

MCP(模型上下文协议)的吸引力不在于新颖性,而在于其严谨性。它为代理提供了一种标准化的方式来发现工具、检查模式、调用函数和处理结构化结果。对于内幕数据而言,这比在玩具用例中更为重要,因为用户的提示通常不够具体。

人类分析师可能会说:

  • “显示法国过去一个季度的集群购买情况。”
  • “首席财务官在财报发布后是否进行了出售?”
  • “比较半导体行业与银行行业的董事购买情况。”
  • “查找LVMH的最新备案文件。”

这些请求中的每一个都包含模糊性。“集群购买”需要一个定义。“法国”可能指发行人注册地、上市地点、监管机构或备案司法管辖区。“财报发布后”需要一个事件日历,而这个日历可能不会通过同一个服务器公开。“最新备案文件”需要通过发行人名称、股票代码、LEI、ISIN和当地市场惯例进行实体解析。

MCP之所以有帮助,是因为它鼓励在以下方面进行清晰的分离:

  1. 工具发现,即可以提出什么问题。
  2. 输入模式,即必须指定什么。
  3. 输出模式,即代理可以依赖什么。
  4. 错误处理,即当标识符模糊或数据不完整时会发生什么。

这听起来很明显,但也是许多数据产品失败的地方。

代理不需要仪表盘,它们需要一份契约

Claude、Cursor和Windsurf是不同的产品,但从服务器的角度来看,它们都受益于同一件事:一份契约。契约规定:

  • 这里是工具,
  • 这里是接受的参数,
  • 这里是枚举,
  • 这里是空值语义,
  • 这里是错误代码,
  • 这里是分页模型,
  • 这里是每个结果的出处。

如果您的输出是一大段散文,代理就需要解析它。如果您的输出是整洁的 JSON,包含明确的字段,例如 filing_date、transaction_code、insider_role、security_type、ownership_nature、currency 和 source_url,代理就可以对其进行推理、总结,并将其串联到其他工具调用中。

这就是一个偶尔看起来很聪明但经过第五个后续问题后仍然有用的系统之间的区别。

内幕交易数据是工具设计的良好压力测试

内幕交易申报数据具有所有暴露弱模式的棘手特性:

  • 多个司法管辖区
  • 多个标识符系统
  • 延迟或修订的申报
  • 无法在不同市场整齐映射的角色层级
  • 因监管机构而异的交易代码
  • 受益所有权与直接所有权
  • 衍生品与非衍生品工具
  • 带有标点符号和语言变体的发行人名称
  • 以及通常需要聚合信号而非原始数据的用户群。

一个能很好处理这些问题的 MCP 服务器通常也能很好地处理更简单的金融数据集。反之则不然。

最小可行工具界面

一个常见的错误是暴露一个巨大的 search_filings 工具就完事了。这在代理需要消除发行人歧义、检查可用字段或请求摘要而非原始申报时就会失效。更好的设计是使用一组小的可组合工具。

1. 发现工具

这些工具告诉代理服务器能做什么以及哪些值是合法的。

示例:

  • list_markets()
  • list_transaction_types(market?)
  • list_insider_roles(market?)
  • get_schema_version()

这些工具虽然不引人注目,但能有效减少虚假参数。如果代理能够查询法国有效的交易类型并获得规范列表,它就不太可能凭空捏造一个。

典型的响应可能包括:

{
  "market": "FR",
  "transactionTypes": [
    {"code": "ACQUISITION", "label": "Acquisition"},
    {"code": "DISPOSAL", "label": "Disposal"},
    {"code": "SUBSCRIPTION", "label": "Subscription"}
  ],
  "source": "Normalized internal taxonomy mapped from regulator disclosures",
  "schemaVersion": "2026-01"
}

这里需要注意的是“标准化的内部分类法”。监管机构不会提供通用的本体论。你需要自行构建。

2. 实体解析工具

这部分可以为所有人节省时间。

示例:

  • resolve_issuer(query, market?, limit?)
  • resolve_insider(query, issuer_id?, market?, limit?)
  • get_issuer_profile(issuer_id)

如果用户查询“Total”,他们是指法国的道达尔能源(TotalEnergies),还是一个根本不应被视为公司的英文单词?解析工具应返回置信度分数、匹配的标识符以及足够的元数据,以便代理在继续操作前进行确认。

合理的响应结构:

{
  "query": "LVMH",
  "matches": [
    {
      "issuerId": "fr_issuer_12345",
      "name": "LVMH Moet Hennessy Louis Vuitton SE",
      "ticker": "MC",
      "isin": "FR0000121014",
      "lei": "969500S6OI5FOBDZ2J08",
      "market": "FR",
      "confidence": 0.98
    }
  ]
}

这为代理提供了后续调用所需的稳定 issuerId。你不会希望每个下游工具都尝试重新解释自由文本。

3. 备案文件检索工具

这里是原始证据的所在地。

示例:

  • get_filings(filters, page?, page_size?, sort?)
  • get_filing(filing_id)
  • get_related_filings(issuer_id, insider_id?, window_days?)

过滤器应明确且有类型。不是“搜索”。是过滤器。

一个健壮的过滤器对象可能包括:

  • market
  • issuer_id
  • insider_id
  • filing_date_from
  • filing_date_to
  • transaction_date_from
  • transaction_date_to
  • transaction_type
  • insider_role
  • security_type
  • ownership_nature
  • min_value
  • max_value
  • currency
  • is_amendment
  • limit_to_primary_disclosures

确定性行为从这里开始。如果用户要求“近期买入”,代理可以将“买入”映射到 transaction_type = ACQUISITION,并将“近期”映射到它明确说明的日期窗口。

4. 聚合和信号工具

大多数用户不想要400行数据。他们想要一个模式。

示例:

  • summarize_activity(filters, group_by, metrics)
  • screen_cluster_buying(filters, min_insiders, window_days, min_total_value?)
  • compare_periods(filters, baseline_period, comparison_period, metrics)

这些工具应返回聚合结果和方法论元数据。如果“集群买入”意味着至少三名不同的内部人在30个日历日内购买,则应在有效载荷中说明。否则,代理将报告结论而没有附带假设。

5. 元数据和来源工具

对于合规敏感数据,来源信息并非可选项。

示例:

  • get_source_metadata(filing_id)
  • get_normalization_notes(market)
  • get_data_freshness(market?)

代理应能回答:“这数据从何而来,何时被摄取,以及是来自监管机构文件还是供应商数据源的标准化数据?”

模式设计,质量核心所在

一个好的MCP服务器,其核心在于本体论而非传输。传输层赢得掌声,而本体论则在出现问题时承担责任。

规范实体

至少,明确定义以下实体:

发行人

字段可能包括:

  • issuer_id
  • name
  • legal_name
  • ticker
  • isin
  • lei
  • country
  • market
  • exchange
  • sector
  • industry

内部人

字段可能包括:

  • insider_id
  • name
  • role
  • role_normalized
  • is_pdmr
  • is_board_member
  • is_executive
  • related_person_type

规范化的角色很重要,因为原始的角色标签很混乱。“副首席执行官”、“授权总经理”和“执行副总裁”并不完全相同,但它们可能需要映射到一个较小的分析集。

申报

字段可能包括:

  • filing_id
  • market
  • regulator
  • source_url
  • filed_at
  • published_at
  • amended_from_filing_id
  • language
  • raw_document_type

交易

字段可能包括:

  • transaction_id
  • filing_id
  • transaction_date
  • transaction_type
  • security_type
  • quantity
  • price
  • currency
  • gross_value
  • ownership_nature
  • venue
  • instrument_is_derivative

一个实用的建议是,将申报和交易分开。一份申报可能包含多笔交易,而用户的问题可能只关注其中一个层面。

规范化枚举优于描述性标签

代理在受限词汇表中表现更好。人类也是如此,尤其是在喝过咖啡之后。

使用枚举,例如:

  • market(市场): US(美国), FR(法国), DE(德国), GB(英国)等。
  • transaction_type(交易类型): ACQUISITION(收购), DISPOSAL(处置), EXERCISE(行权), GIFT(赠与), SUBSCRIPTION(认购)
  • security_type(证券类型): EQUITY(股票), OPTION(期权), RSU(限制性股票单位), BOND(债券), DERIVATIVE_OTHER(其他衍生品)
  • ownership_nature(所有权性质): DIRECT(直接), INDIRECT(间接)
  • role_normalized(标准化角色): CEO(首席执行官), CFO(首席财务官), CHAIR(董事长), DIRECTOR(董事), EXECUTIVE_OTHER(其他高管), RELATED_PERSON(关联人士)

然后提供一个内部映射表,将特定司法管辖区的标签和代码映射到这些枚举。代理无需了解每个本地披露的细微差别即可回答合理的问题。

空值、未知值和“不适用”

内幕交易数据中充满了缺失字段。假装它们不存在只会将问题推向下游。

如果某个值不存在,则在 API 中返回 null,并让文章或 UI 渲染“不适用”。不要将未知价格强制转换为零。除非您愿意将其标记为推断值,否则不要从交易所推断货币。不要因为某个字段缺失而默默丢弃行。

这对于价值计算尤为重要。如果 quantity 存在而 price 不存在,则 gross_value 应为 null,而不是算术虚构值。

分页和限制

代理在执行广泛查询时可能会出乎意料地积极。您的服务器应该不那么积极。

使用:

  • 确定性排序,例如 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服务器覆盖多个市场,那么一个比较层会很有用。这并非因为每个用户都要求它,而是因为服务器应该知道它所处的环境。

MarketRegulatorRuleDeadlineNotes
FRAMFMAR Art 19T+3履行管理职责的人员及与其密切相关的人员必须在三个工作日内通知交易,但须遵守适用的门槛和豁免规定。
USSECExchange Act Section 16, Form 4T+2高管、董事和持股10%以上受益所有人进行的大多数可报告内幕交易,需在两个工作日内通过Form 4披露。
披露制度各不相同。标准化模式应保留市场特定的来源规则,即使交易字段已映射到通用枚举。

法国和AMF

对于法国,实际的监管依据是MAR第19条,该条在整个欧盟范围内实施,由AMF在国家层面负责发布和监督。PDMR(管理人员)及其密切关联人士的通知截止日期是三个工作日,具体取决于该制度的细节。ESMA的问答有助于澄清整个欧盟的解释要点。

这意味着您的架构不应抹去申报是MAR第19条披露的事实。请保留以下字段:

  • regime = "MAR_ART_19"
  • regulator = "AMF"
  • market = "FR"

如果用户稍后询问为什么某个申报在特定日期出现,或者某个角色是否符合PDMR的资格,这些字段就显得很重要。

美国和SEC

对于美国数据,SEC的EDGAR系统以及表格3、4和5定义了披露的基础。表格4是大多数用户提及“内幕交易申报”时所指的表格,常见截止日期是可报告事件发生后的两个工作日。

您的标准化架构可以将美国和法国的交易映射到共同的交易类型中,但仍应在相关情况下保留特定于来源的字段:

  • sec_form = "4"
  • ownership_form = "direct" | "indirect"
  • transaction_code_raw = "P" | "S" | ...

这不是吹毛求疵,而是保持可审计性的方法。

为什么代理需要特定于来源的元数据

假设用户询问:

比较上个月美国和法国的内部人购买情况。

一个只返回标准化行的服务器可能让代理生成一个漂亮的图表。而一个同时返回来源元数据的服务器则能让代理添加关键的句子,即披露制度、截止日期、受涵盖人员和编码惯例各不相同。这句话是分析与装饰性算术之间的区别。

生产中发挥作用的实施注意事项

这部分内容往往在华丽的工具演示中被省略,通常是因为它不够华丽。

将示例作为一等公民

如果您希望代理正确使用您的工具,请在工具描述中提供示例调用。不是一个示例,而是多个。

例如,get_filings 的描述应包含以下示例:

  • 特定发行人的检索,
  • 市场范围筛选,
  • 日期限定查询,
  • 角色过滤查询,
  • 分页。

代理会复制模式。给他们好的模式。

每行返回数据来源

至少包括:

  • source_url
  • source_published_at
  • ingested_at
  • regulator
  • market
  • normalization_version

这使得代理能够引用证据,并允许人工验证。没有数据来源,服务器就只是互联网上另一个自信的陌生人。

模式版本化

将 schema_version 添加到工具响应中。如果您更改枚举映射或字段名称,代理和客户端代码需要一种方法来检测它。

这不是官僚主义。这是您避免在将 role 重命名为 role_normalized 的那天破坏所有提示模板的方法。

区分原始字段和标准化字段

尽可能同时保留两者:

  • transaction_type_raw
  • transaction_type_normalized
  • role_raw
  • role_normalized

标准化字段支持跨市场分析。原始字段保留了法律和操作的准确性。

兼顾拒绝与成功

有时,正确的答案是“我无法仅凭此服务器回答该问题”。

示例:

  • “内幕人士是否在财报发布后卖出?” 如果您未公开财报日期。
  • “这笔交易是否合法?” 这是一个法律结论,而非数据检索任务。
  • “内幕人士的动机是什么?” 这通常无法从备案文件中得知。

您的服务器应返回结构化的限制,并鼓励代理明确说明。

管理人员交易是《市场滥用条例》(MAR)规定的披露义务之一,履行管理职责的人员应就其自身进行的与该发行人股份或债务工具,或与相关衍生品或其他金融工具相关的交易进行通知。
European Parliament and Council · 立法者, Regulation (EU) No 596/2014, Article 19

优秀代理体验的特征

内幕数据MCP服务器的最佳赞誉并非其具有魔力,而是其以正确的方式显得“无聊”。

强大的代理体验具有以下特点:

首次回答范围明确

代理会说明其搜索了什么、在哪个时间段内、在哪个市场以及根据哪个定义。在关键之处没有隐藏的默认设置。

后续问题无需重复工作

如果用户询问“现在只看首席财务官”,代理可以重复使用相同的发行人或市场上下文,并更改一个筛选条件。这意味着您的架构和工具输出足够稳定,可以支持链式操作。

答案包含证据

代理可以引用申报日期、交易日期、价值和来源链接。它不仅仅是泛泛地指向一个趋势。

及早发现模糊性

如果发行人匹配置信度低,代理会要求确认。这是一个特性,而不是一个故障。

服务器不作过度承诺

它返回已知信息,标记推断信息,并将动机解读留给电视节目。

实际收益

对于 Claude, Cursor 和 Windsurf 而言,内幕数据 MCP 服务器的价值不在于它让模型“与您的数据库聊天”。这种说法应该受到惩罚。其价值在于它为代理提供了一种规范的方式来解析实体、检索文件、计算可重复的摘要并引用来源,所有这些都基于一个为处理模糊性而非被其困扰而设计的模式。

下一步具体而直接。选择五个真实的用户提示,“法国最新 CEO 购买”,“小盘股集群购买”,“股价飙升后的董事抛售”,“比较美国和法国的披露”,“查找发行人 X 的所有文件”,然后测试您当前的 MCP 工具集是否能以确定性参数、明确假设和有来源支持的结果回答每个问题。如果某个提示迫使代理进行自由形式的猜测,那就是您悬而未决的问题,很可能也是您下一个冲刺的目标。

来源与延伸阅读

  1. 《市场滥用条例》(MAR)(欧盟第596/2014号法规)合并文本regulation2014-04-16
  2. ESMA,《市场滥用条例》(MAR)问答regulator2024-09-27
  3. AMF,管理人员交易及履行管理职责人员的交易regulator
  4. SEC,表格3、4和5regulator
  5. SEC,快速解答:内幕交易与表格3、4和5regulator
  6. SEC,EDGAR公司备案文件regulator
  7. 模型上下文协议文档technical
  8. 编辑简报中引用的内部Postgres数据集internal2026-05-17

编辑注:本文是在没有实时网络研究的情况下编写的(Grok 在此代次中不可用)。上述引用的是常青来源;数值声明取自我们截至 2026-05-17 的数据库快照。

最后审阅 · 2026-05-18 · 作者 Simon Azoulay · 来源:SEC EDGAR, AMF BDIF, 以及其他 28 家监管机构。

Series

Working with insider data

From raw filings to a workflow: API, MCP, Excel, alerts, and how to read backtest claims honestly.

Start with the pillar guide: 使用 Python 和 REST API 构建内幕交易申报模型

立即行动

信号今日推荐筛选内部人士信号筛选器覆盖范围覆盖的全部公司

相关阅读