AI 에이전트에게 SEC EDGAR 데이터 제공: 내부자 거래 및 XBRL 재무 정보를 위한 무료 원격 MCP 서버
요약
본 게시물은 AI 에이전트가 복잡한 SEC EDGAR 금융 데이터(내부자 거래, XBRL)에 접근할 수 있도록 하는 무료 원격 MCP 서버를 소개합니다. 이 서버는 User-Agent 규칙 준수, CIK 조회, XML/XBRL 파싱 등 까다로운 과정을 처리하여 간결한 JSON 형태로 데이터를 제공합니다.
핵심 포인트
- MCP(Model Context Protocol)를 통해 AI 클라이언트가 외부 도구를 호출할 수 있게 함.
- SEC EDGAR 데이터의 복잡성(User-Agent, CIK, XML/XBRL)을 서버가 처리함.
- 내부자 거래 및 XBRL 재무 정보를 간결한 JSON 형태로 제공받을 수 있음.
- Cursor, VS Code 등 주요 AI 클라이언트에서 쉽게 연결하여 사용 가능함.
**MCP (Model Context Protocol)**는 Claude, Cursor 또는 VS Code와 같은 AI 클라이언트가 공통 인터페이스를 통해 외부 도구를 호출할 수 있게 해주는 오픈 표준입니다.
이 게시물에서는 미국 SEC EDGAR 데이터를 위한 무료 MIT 라이선스 MCP 서버에 대해 설명합니다. 이 서버는 원격으로 실행되므로 설치할 것이 없고 API 키도 필요하지 않습니다. 연결 방법, 실제 출력을 포함한 세 가지 호출 예시, 내부 작동 방식, 그리고 한계점까지 보여드리겠습니다.
- Endpoint (스트리밍 가능 HTTP, 키 없음):
https://sec-edgar-api.kidriahx.workers.dev/mcp - Source: https://github.com/monriah-studio/sec-edgar-mcp-remote
- MCP Registry name:
io.github.monriah-studio/sec-edgar-mcp
EDGAR에 래퍼(wrapper)가 필요한 이유
EDGAR는 최고의 무료 금융 데이터셋 중 하나입니다. 미국 상장 기업이 제출하는 모든 내부자 거래, 10-K, 8-K 및 XBRL 재무 사실을 포함합니다. 하지만 에이전트에게 사용하기에는 다소 불편한 점들이 있습니다.
- User-Agent 규칙. SEC의 공정 접근 정책은 모든 클라이언트가 연락처 이메일과 함께 선언된 User-Agent를 전송하고 초당 10회 요청을 넘지 않도록 요구합니다. 이를 건너뛰는 요청은 403 에러를 받습니다. 자체적으로 데이터를 가져오는 LLM(Large Language Model)은 이를 알지 못할 것입니다.
- CIK 조회. 대부분의 엔드포인트는 티커(ticker, 예:
AAPL)가 아닌 10자리 중앙 인덱스 키(Central Index Key, 예:0000320193)를 요구합니다. 먼저 약 1MB 크기의company_tickers.json파일에서 조회해야 합니다. - Form 4는 XML 형식입니다. 내부자 거래는 제출 건별로 하나의 XML 문서 형태로 제공되며, 여기에는 트랜잭션 코드(P, S, A, M, F, G), 파생 상품 테이블 및 각주가 가득합니다.
- XBRL은 복잡합니다.
companyconceptJSON은 여러 제출물에 걸쳐 동일한 기간을 반복하고 3개월, 9개월, 12개월 기간이 혼합되어 있습니다. 이 데이터에서 '회계 연도별 순이익'을 얻으려면 필터링과 중복 제거 과정이 필요합니다.
이 서버는 이러한 모든 과정을 처리하여 간결한 JSON 형태로 반환합니다.
일곱 가지 도구
| Tool | 반환 내용 |
|---|---|
get_insider_trades | 회사 또는 내부자(insider)에 대한 Form 4 거래 내역, 매수/매도 총액 및 10b5-1 플래그 포함 |
| ... | |
| 모든 도구는 티커(ticker) 또는 CIK를 사용하며, 모두 읽기 전용으로 표시됩니다. |
클라이언트 연결하기
Cursor: ~/.cursor/mcp.json에 추가합니다 (또는 프로젝트 내의 .cursor/mcp.json):
{
"mcpServers": {
"sec-edgar": {
...
VS Code (Copilot agent mode): .vscode/mcp.json에 추가합니다:
{
"servers": {
"sec-edgar": {
...
Claude Desktop: 사용자 지정 커넥터(custom connectors)를 지원하는 플랜에서 설정(Settings) → 커넥터(Connectors) 아래에 URL을 추가합니다. 또한 mcp-remote 패키지(Node.js 필요)를 사용하여 claude_desktop_config.json을 통해 브릿징할 수도 있습니다:
{
"mcpServers": {
"sec-edgar": {
...
Claude Code: claude mcp add --transport http sec-edgar https://sec-edgar-api.kidriahx.workers.dev/mcp를 실행합니다.
그런 다음 "NVIDIA의 최근 내부자 매각 내역과 그것이 10b5-1 플랜에 따른 것인지" 또는 "이번 주에 클러스터 규모의 내부자 매수세를 보인 회사는 무엇인가요?"와 같은 프롬프트를 시도해 보세요.
curl을 사용한 세 가지 실제 호출
서버는 상태 비저장(stateless)이므로 테스트를 위해 SDK가 필요하지 않습니다. 모든 요청은 단일 JSON-RPC POST입니다. initialize부터 시작합니다:
URL=https://sec-edgar-api.kidriahx.workers.dev/mcp
curl -s $URL \
-H 'content-type: application/json' \
...
{"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"sec-edgar-mcp","title":"SEC EDGAR 내부자 거래 및 재무 정보","version":"1.0.0"}, ...},"jsonrpc":"2.0","id":1}
각 도구의 결과는 result.content[0].text에 JSON 텍스트로 반환됩니다. 아래 출력물은 보기 좋게 포맷팅(pretty-printed)되고 잘린 것(...)입니다. 저는 이 데이터를 2026년 10월 23일에 실행했으므로, 귀하의 숫자는 다를 것입니다.
1. NVIDIA 내부자 거래
콜드 캐시(cold cache) 상태에서 해당 호출은 SEC에 총 7개의 요청을 보냈습니다: 티커 맵, 회사 제출물 인덱스, 그리고 다섯 개의 Form 4 XML 파일입니다. 응답 헤더 x-sec-requests: 7이 그 개수를 보고합니다.
2. XBRL을 사용한 애플의 순이익 (Apple net income from XBRL)
curl -s $URL -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_company_concept","arguments":{"ticker_or_cik":"AAPL","concept":"NetIncomeLoss","period":"annual","limit":4}}}'
{
"company": {"name": "Apple Inc.", "cik": "0000320193"},
"concept": "us-gaap:NetIncomeLoss",
...
}
fy를 살펴보세요. 이것은 기간의 회계연도가 아니라 값을 보고한 _제출물(filing)_의 SEC 회계연도입니다. 따라서 FY2024 수치는 fy: 2025로 표시됩니다. 값이 어떤 기간에 속하는지 알려면 start/end를 사용하세요.
3. 시장 전반의 클러스터 매수 (Cluster buys across the market)
curl -s $URL -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"get_market_insider_buys","arguments":{"days":7,"min_insiders":2,"limit":3}}}'
{
"window": {"days": 7, "from": "2026-10-17", "to": "2026-10-24"},
"dataUpdatedAt": "2026-10-24T04:40:38.877Z",
...
}
이 호출은 미리 구축된 저장소(pre-built store)에서 읽기 때문에 SEC 요청을 전혀 보내지 않았습니다(자세한 내용은 아래 참조). 날짜는 UTC이므로 창(window)이 24일에 끝납니다.
작동 방식 (How it works)
전체 과정은 무료 플랜의 단일 Cloudflare Worker로 구성되어 있습니다:
- MCP 전송(transport).
/mcp는 공식 MCP TypeScript SDK의 웹 표준 스트리밍 가능한 HTTP 전송을 상태 비저장(stateless) JSON 모드로 사용합니다. 클라이언트별 세션이나 고내구성 객체(Durable Object)가 없습니다. 각 POST 요청은 독립적이며, GET/DELETE는 405를 반환합니다. 각 도구는 하나의 REST 엔드포인트에 매핑되며,compact()함수는 모델의 컨텍스트를 채우지 않도록 REST JSON을 더 적은 필드와 제한된 행으로 간소화(trim)합니다. 동일한 Worker가 해당 REST API(v1/...,openapi.yaml에 문서화됨)도 제공합니다. - SEC 에티켓(etiquette). SEC로 보내는 모든 요청에는 연락처 이메일이 포함된 선언된 User-Agent가 첨부됩니다. 요청 간격은 최소 115ms를 유지하며, 전역적인 **고내구성 객체 속도 제한기(Durable Object rate limiter)**가 시간 슬롯을 할당하여 모든 Worker 격리가 함께 SEC의 10 req/s 상한선보다 낮은 약 8.7 req/s 수준을 유지하도록 합니다. 429/5xx 오류 발생 시, Worker는 (
Retry-After를 준수하며) 지연하고 최대 세 번까지 재시도합니다. 403 오류의 경우 한 번 재시도 후 명확한 오류가 발생합니다. - 캐싱(Caching). 조회는 세 가지 계층을 거칩니다: 격리 메모리(isolate memory), 그다음 Cloudflare Cache API, 그리고 선택된 키에 대한 KV입니다. TTL(Time To Live)은 데이터가 변경되는 빈도에 따라 결정됩니다. 티커 맵과 해상도는 24시간 동안 캐시되며, 파싱된 Form 4는 30일 동안 (제출 서류는 변경되지 않음), 제출물은 10분 동안, XBRL 스냅샷 및 개념은 6시간 동안, 전체 텍스트 검색은 15분 동안 캐시됩니다.
- 시장 전체 매수(Market-wide buys). 크론(cron)이 10분마다 실행됩니다. 이는 EDGAR 전체 텍스트 검색에서 새로운 Form 4를 조회하고, 실행당 최대 40개를 파싱하며, 공개 시장 매수(open-market purchases, 코드 P, 비파생상품)를 KV 스토어에 보관합니다.
get_market_insider_buys는 이 저장소를 발행사별로 그룹화합니다. - 티커 해상도(Ticker resolution). 티커 파일은
JSON.parse대신 정규 표현식(regex)으로 검색되어 무료 플랜의 CPU 예산 내에 머무르게 합니다.
제한 사항 및 주의점 (Limits and caveats)
- 호출당 깊이가 얕음 (Shallow per-call history).
get_insider_trades는 호출당 최근 Form 4 신고서 최대 25건을 파싱합니다(기본값 5). 무료 플랜은 호출당 약 50개의 서브 요청만 허용하므로, 이 도구로는 10년 치 기록을 가져오기 어렵습니다. - 시장 스캔 커버리지 (Market scan coverage). 클러스터 구매 데이터는 최대 30일치를 다루며, 저장소가 처음 채워진 시점부터만 시작됩니다. 신고서가 급증하는 경우 cron이 뒤처질 수 있습니다.
- XBRL은 신고서만큼 깨끗합니다 (XBRL is only as clean as the filings). 회사들은 서로 다른 태그(
Revenues대RevenueFromContractWithCustomerExcludingAssessedTax)를 선택하며, 일부 지표는 null로 반환될 것입니다. 스냅샷의tag필드를 확인하세요. - 공유 무료 엔드포인트 (Shared free endpoint). 공개 인스턴스는 키가 없고 SLA(서비스 수준 협약)도 없습니다. 부하가 심할 경우, 글로벌 SEC 제한에 따라 대기열에 밀리거나 재시도를 요청하는 503 오류를 받을 수 있습니다. 중요한 용도로는 자체 복사본을 배포하세요 (README에서 설명합니다: KV 네임스페이스, 사용자 지정
SEC_USER_AGENT, 그리고wrangler deploy)./mcp는MCP_API_KEYS로 보호할 수 있습니다. - 투자 조언이 아니며, SEC와 제휴되지 않았습니다 (Not investment advice, not affiliated with the SEC). 데이터는 공개 영역(public domain)이며 EDGAR에서 직접 가져온 것입니다. 해석은 사용자에게 달려 있습니다. 10b5-1 매각은 재량적 시장 개방 매수와 매우 다른 의미를 가집니다.
링크 (Links)
- 소스 코드 (MIT): https://github.com/monriah-studio/sec-edgar-mcp-remote
- 에이전트 루프 외부에서 예약되거나 대량의 Form 4 데이터를 가져오려면 Apify 액터가 있습니다: https://apify.com/monriah-studio/sec-form4-insider-trades
레포지토리에서 이슈 및 풀 리퀘스트를 환영합니다.
AI의 도움을 받아 작성되었으며 사람이 검토했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기