Skip to content

capitalparser/public-data-opportunity-mcp

Repository files navigation

title Public Data Opportunity MCP
sdk docker
app_port 7860
pinned false

Public Data Opportunity MCP

공공데이터포털(data.go.kr)에 열린 데이터셋과 OpenAPI 접근 경로를 MCP tool로 제공하는 서버입니다.

핵심 질문은 하나입니다.

“공공데이터에 이런 내용이 있는가? 있다면 API인가, XML/JSON인가, 파일인가? 상세 링크는 무엇인가?”

이 프로젝트의 산출물은 MCP 서버 자체입니다. Claude, Codex, Cursor 같은 MCP 클라이언트가 이 서버에 연결하면 공공데이터 카탈로그 검색, 접근 방식 판별, 상세 링크 반환, 최근 변경 조회를 tool call로 수행할 수 있습니다.

무엇을 만드는가

이 저장소는 공공데이터포털을 대상으로 하는 Remote/Local MCP 서버를 구현합니다.

  • 로컬 stdio MCP 서버
  • 외부 공개용 Streamable HTTP MCP 서버
  • 공공데이터 카탈로그 로더
  • 원격 CSV 카탈로그 로더 (DATA_GO_KR_CATALOG_URL)
  • 데이터셋 검색 tool
  • API/파일/XML/JSON 접근 경로 판별 tool
  • 최근 등록/수정 데이터셋 조회 tool
  • 거래상대방 검증을 위한 공공데이터 source route 추천 tool

사용자는 “MCP를 만들려는 사람”이 아닙니다. 사용자는 이미 배포된 이 MCP 서버를 자신의 MCP 클라이언트에 연결해서 공공데이터포털 카탈로그를 조회하는 사람입니다.

현재 MVP가 하는 일

  • 공공데이터 카탈로그 CSV/JSON을 로드합니다.
  • 자연어 질문으로 관련 데이터셋을 조회합니다.
  • 후보별 접근 방식을 알려줍니다.
    • OpenAPI
    • 파일 다운로드
    • 표준데이터
    • XML
    • JSON
    • CSV
  • 데이터 상세 페이지 링크를 반환합니다.
  • agent/자동화 호출에 적합한 접근 방식인지 점수화합니다.
  • 최근 등록/수정된 데이터셋을 조회합니다.
  • 계약, 구매, 정산, 세일즈, 입찰, 감사 workflow에서 거래상대방 확인에 필요한 공공데이터 source route와 risk flag를 반환합니다.
  • 로컬 stdio MCP와 외부 공개용 HTTP MCP를 모두 지원합니다.

아직 하지 않는 일

  • 공공데이터포털 API 키를 대신 발급하지 않습니다.
  • 각 기관의 모든 하위 API를 직접 호출하지 않습니다.
  • 국세청/FSC/DART API를 실시간 호출해 거래상대방의 active/inactive 상태를 확정하지 않습니다.
  • 활용신청, 심의승인, 트래픽 제한을 우회하지 않습니다.
  • 영구 watchlist / Slack / Telegram 알림은 아직 없습니다.

현재 MVP는 공공데이터 접근 경로를 제공하는 MCP 서버입니다. 범용 정부 API 게이트웨이가 아닙니다.

MCP Tools

get_catalog_status

현재 MCP 서버가 로드한 카탈로그 출처, 로드 시각, 데이터셋 수를 반환합니다.

find_access_route

“이런 데이터 있어?”라는 질문에 답합니다.

예시 질문:

공공데이터에 나라장터 입찰공고 가져올 수 있는 데이터 있어?
agent에서 호출 가능한 방식이면 링크도 줘.

반환 내용:

  • 후보 데이터셋
  • OpenAPI / 파일 / 표준데이터 여부
  • JSON / XML / CSV 포맷
  • 활용신청 필요 가능성
  • 상세 페이지 URL
  • 문서 확인 힌트
  • 공공데이터포털 fallback 검색 URL

search_datasets

구조화된 검색 도구입니다.

필터:

  • keyword
  • service_type: openapi, file, standard, any
  • agency
  • category
  • updated_after
  • limit

get_dataset_detail

데이터셋 ID 또는 data.go.kr URL을 넣으면 정규화된 메타데이터와 접근 방식을 반환합니다.

match_datasets_for_context

프로젝트 또는 업무 설명을 입력하면 관련 공공데이터 후보를 반환합니다.

예시:

나라장터 입찰공고를 모니터링해서 회계법인 입찰 기회를 알려주는 agent

list_recent_updates

로드된 카탈로그 안에서 최근 등록/수정된 데이터셋을 조회합니다.

score_access_fit

특정 데이터셋이 agent / 자동화 호출에 적합한지 점수화합니다.

평가 신호:

  • OpenAPI 여부
  • JSON/XML 지원 여부
  • 갱신주기
  • 자동승인 여부
  • 무료 여부
  • 상세 URL 존재 여부
  • 프로젝트 설명과의 키워드 겹침

verify_counterparty

계약, 구매, 정산, 세일즈, 입찰, 감사 agent가 한국 거래상대방을 승인하기 전에 확인해야 할 공공데이터 source route, risk flag, evidence, next action을 반환합니다.

예시 입력:

{
  "business_no": "123-45-67890",
  "company_name": "테스트상사",
  "representative_name": "홍길동",
  "context": "purchase"
}

v1은 catalog-backed입니다. live agency API를 호출하지 않으며, 거래상대방이 실제 active 상태라는 최종 증거로 취급하면 안 됩니다. needs_review 응답은 관련 공공데이터 경로를 찾고 identity를 정규화했지만, 승인 전 국세청/FSC/DART live check가 아직 필요하다는 뜻입니다.

데이터 소스와 배포용 변환

기본 실행 시에는 샘플 카탈로그를 사용합니다.

실제 운영에서는 공공데이터포털 목록개방현황 CSV를 그대로 런타임에 읽지 말고, 배포용 compact catalog로 변환해서 연결하는 것을 권장합니다.

권장 원천:

변환 명령:

npm run catalog:prepare -- \
  /absolute/path/to/공공데이터포털_목록개방현황.csv \
  data/catalog.compact.jsonl.gz

현재 확인한 실제 파일 기준 결과:

원본 CSV: 127MB
compact JSONL gzip: 약 25MB
row 수: 95,623
서비스 유형: FILE 83,220 / API 12,103 / STD 300
서버 로드: 약 0.7초
검색: 약 0.08초
메모리 RSS: 약 330~360MB

로컬 파일로 연결:

export DATA_GO_KR_CATALOG_PATH=/absolute/path/to/catalog.compact.jsonl.gz

외부 배포 서버에서는 compact gzip 파일을 object storage에 올리고 URL로 연결하는 방식을 권장합니다.

export DATA_GO_KR_CATALOG_URL=https://your-storage.example.com/catalog.compact.jsonl.gz

관련 공식 API:

로컬 실행

npm install
npm run build

stdio MCP:

npm run start:stdio

HTTP MCP:

npm start

기본 HTTP 엔드포인트:

GET  /health
GET  /
GET  /catalog/status
POST /mcp

MCP 클라이언트 연결

이 서버는 두 가지 방식으로 MCP 클라이언트에 연결할 수 있습니다.

  • Remote HTTP MCP: 공개 HTTPS URL의 /mcp 엔드포인트에 연결합니다.
  • stdio MCP: 로컬 컴퓨터에서 서버 프로세스를 직접 실행합니다.

공개 서버에 연결하는 일반적인 endpoint 형식:

https://your-domain.example.com/mcp

서버가 Bearer token을 요구하는 경우 MCP 클라이언트에서 다음 인증 헤더를 함께 설정해야 합니다.

Authorization: Bearer <token>

Codex CLI 예시:

codex mcp add public-data-opportunity --url https://your-domain.example.com/mcp

등록 확인:

codex mcp get public-data-opportunity

stdio 방식

로컬에서 직접 실행할 때 사용합니다.

{
  "mcpServers": {
    "public-data-opportunity": {
      "command": "node",
      "args": [
        "/absolute/path/to/public-data-opportunity-mcp/dist/src/server.js"
      ],
      "env": {
        "DATA_GO_KR_CATALOG_PATH": "/absolute/path/to/catalog.compact.jsonl.gz"
      }
    }
  }
}

배포

HTTP MCP 서버는 Node.js가 실행되는 PaaS, VPS, 컨테이너 호스팅, Docker 기반 플랫폼에 배포할 수 있습니다.

배포 환경의 필수 조건:

  • 외부에서 접근 가능한 HTTPS URL
  • POST /mcp 요청 전달
  • 헬스체크용 GET /health
  • 실제 운영 시 인증 토큰 또는 네트워크 접근 제한

환경변수

기본값:

HOST=0.0.0.0
PORT=3000

권장값:

PUBLIC_BASE_URL=https://your-domain.example.com
MCP_BEARER_TOKEN=change-this-token

실제 카탈로그 연결:

DATA_GO_KR_CATALOG_PATH=/app/data/catalog.compact.jsonl.gz

또는:

DATA_GO_KR_CATALOG_URL=https://your-storage.example.com/catalog.compact.jsonl.gz

MCP_BEARER_TOKEN을 설정하면 /mcp 호출 시 Bearer 인증이 필요합니다.

Node.js 실행

npm ci
npm run build
npm start

npm start는 HTTP MCP 서버를 실행합니다.

GET  /
GET  /health
GET  /catalog/status
POST /mcp

Docker 실행

docker build -t public-data-opportunity-mcp .
docker run \
  -p 3000:3000 \
  -e HOST=0.0.0.0 \
  -e PORT=3000 \
  -e MCP_BEARER_TOKEN=change-this-token \
  -e DATA_GO_KR_CATALOG_URL=https://your-storage.example.com/catalog.compact.jsonl.gz \
  public-data-opportunity-mcp

배포 후 확인

헬스체크:

curl https://your-domain.example.com/health

예상 응답:

{
  "status": "ok",
  "datasetCount": 95623,
  "catalogSource": "https://your-storage.example.com/catalog.compact.jsonl.gz",
  "catalogLoadedAt": "2026-05-16T14:00:00.000Z"
}

카탈로그 상태:

curl https://your-domain.example.com/catalog/status

MCP endpoint:

https://your-domain.example.com/mcp

PaaS 설정값

PaaS에서 GitHub 저장소를 연결하는 경우 핵심 설정은 다음과 같습니다.

Build command: npm ci && npm run build
Start command: npm start
Health check path: /health
Environment:
  HOST=0.0.0.0
  PUBLIC_BASE_URL=https://your-service-domain
  MCP_BEARER_TOKEN=<원하는 토큰>
  DATA_GO_KR_CATALOG_URL=https://your-storage.example.com/catalog.compact.jsonl.gz

예시 프롬프트

공공데이터에 폐업 사업자 상태 조회할 수 있는 API 있어?
XML이나 JSON으로 호출 가능한 링크까지 줘.
부동산 임대차 리스크를 모니터링하는 agent를 만들고 싶어.
관련 공공데이터 후보와 접근 링크를 찾아줘.
최근 수정된 조달/입찰 관련 OpenAPI를 찾아줘.
이 데이터셋이 자동화 서비스로 수익화하기 좋은지 평가해줘:
https://www.data.go.kr/data/15129394/openapi.do

개발

npm test
npm run typecheck
npm run build

구조

src/
  catalog/
    load.ts        # CSV/JSON 로딩
    normalize.ts   # 한글 카탈로그 컬럼 정규화
    search.ts      # 검색, 필터, 최근 업데이트 조회
    types.ts       # 도메인 타입
  scoring/
    opportunity.ts # agent/자동화 접근 적합도 점수화
  tools/
    format.ts      # 응답 포맷
    register.ts    # MCP tool 등록
  http.ts          # 외부 공개용 Streamable HTTP 서버
  server.ts        # 로컬 stdio MCP 서버

로드맵

  • 공공데이터포털 최신 목록개방현황 자동 수집 명령 추가
  • DATA_GO_KR_SERVICE_KEY 기반 공식 검색/목록 API 연동
  • 신규/수정 데이터셋 diff snapshot
  • 프로젝트별 watchlist
  • Slack / Telegram 알림
  • 상세 페이지 enrich: Swagger, 참고문서, 샘플 요청 URL 추출
  • 도메인팩: 조달/입찰, 부동산, 정책지원사업, 상권, 회계/감사

라이선스

MIT

About

MCP server for finding Korean public-data access routes for AI agents and automation projects

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors