mcp-kr-g2b
This MCP server provides AI assistants with natural language access to Korea's Public Procurement Service (G2B/조달청) and Nuri Jangteo (private procurement) OpenAPI, covering 14 services and 156 operations across the entire public procurement lifecycle.
Core Public Procurement Services
Bid Announcements — Search construction, services, goods, and foreign procurement notices, including change history and participation regions
Pre-specifications — Query pre-release specifications (사전규격) by category and institution
Bid Results — Access successful bid records, bid opening results, failed bids, and re-bids
Contract Information — Retrieve contract details, change history, and deletion history
Contract Process Disclosure — View the integrated full contract lifecycle
Order Plans — Explore planned procurements by goods, services, construction, or foreign categories
Price Information — Look up facility material prices, market construction prices, and standard unit prices (civil, architectural, mechanical, electrical)
Public Procurement Statistics — Analyze by institution, enterprise, contract method, region, and product/service
Data Standards — Retrieve bid, award, and contract data in open standard format
Industry & Legal Basis — Look up industry classifications and related laws
User Information — Query institution info, procurement company profiles, industry registrations, and debarred companies
Private Procurement (누리장터) Services
Private Bid Announcements, Bid Results, and Contracts — Full coverage of private-sector procurement data
Discovery & Utility Tools
list_g2b_services— Browse all 14 services and their operationsget_g2b_operation_info— Get detailed specs (parameters, response fields, example URLs) for any operationget_g2b_cache_data— Filter, paginate, search by substring, apply regex, or semantically re-rank cached API results
Key Features: automatic full pagination, results cached to JSON to protect LLM context, retry with exponential backoff, optional semantic re-ranking with Korean sentence embeddings, and support for both stdio and HTTP transports.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-kr-g2b2024년 1월에 올라온 공사 입찰공고를 찾아줘"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
한국어 | English
MCP 조달청 나라장터 (KR-G2B)
조달청 나라장터(국가종합전자조달, G2B) 및 누리장터(민간조달) OpenAPI를 위한 Model Context Protocol(MCP) 서버입니다. 공공데이터포털(data.go.kr)을 통해 제공되는 조달청 14개 서비스, 156개 오퍼레이션을 AI 어시스턴트가 자연어로 조회·분석할 수 있게 합니다.
입찰공고·사전규격·낙찰·계약·발주계획·가격정보·공공조달통계까지, 공공조달 전 과정의 데이터를 하나의 MCP로 연결합니다.
사용 예시
AI 어시스턴트에게 다음과 같은 요청을 할 수 있습니다:
📢 입찰공고 검색 — "2024년 1월에 올라온 공사 입찰공고를 찾아줘"
🏆 낙찰 분석 — "특정 수요기관의 최근 물품 낙찰 현황을 정리해줘"
📄 계약 조회 — "지난달 체결된 용역 계약 내역을 보여줘"
💰 가격정보 — "시설자재(토목) 가격정보를 조회해줘"
📊 조달통계 — "기관 구분별 공공조달 실적 통계를 알려줘"
🏗️ 사전규격 — "발주 예정인 사전규격(사전공개) 목록을 확인해줘"
Related MCP server: Prozorro MCP Server
지원 서비스
조달청 OpenAPI 14개 서비스를 모두 포함합니다. 각 서비스는 get_<module>_data 도구 하나로 호출하며, operation 파라미터로 세부 오퍼레이션을 지정합니다.
구분 | 서비스 | 도구 | 오퍼레이션 |
나라장터 | 입찰공고정보서비스 |
| 25 |
사전규격정보서비스 |
| 20 | |
낙찰정보서비스 |
| 23 | |
계약정보서비스 |
| 21 | |
계약과정 통합공개서비스 |
| 4 | |
발주계획 현황서비스 |
| 8 | |
가격정보 현황서비스 |
| 11 | |
공공데이터 개방표준서비스 |
| 3 | |
업종 및 근거법규서비스 |
| 1 | |
사용자정보서비스 |
| 5 | |
공공조달 | 공공조달통계정보서비스 |
| 14 |
누리장터 | 민간입찰공고서비스 |
| 10 |
민간낙찰정보서비스 |
| 7 | |
민간계약정보서비스 |
| 4 |
디스커버리·캐시 도구
도구 | 설명 |
| 14개 서비스와 오퍼레이션 개요 목록 (탐색 시작점) |
| 특정 오퍼레이션의 요청 파라미터·필수여부·응답 필드·예제 URL |
| 캐시 결과를 필드 필터/제외/정규식/의미 기반 재정렬/페이지로 상세 조회 |
총 17개 MCP 도구 = 서비스 디스패처 14개 + 디스커버리/캐시 3개. 오퍼레이션이 156개로 많아, "서비스당 도구 1개 +
operation파라미터" 방식으로 설계해 도구 수를 안정적으로 유지합니다.
권장 사용 흐름
1. list_g2b_services() → 어떤 서비스/오퍼레이션이 있는지 파악
2. get_g2b_operation_info("bid", "getBidPblancListInfoCnstwk")
→ 정확한 파라미터(필수/선택) 확인
3. get_bid_data(operation="getBidPblancListInfoCnstwk",
params={"inqryDiv": "1",
"inqryBgnDt": "202401010000",
"inqryEndDt": "202401312359"})
→ 전체 페이지 수집 + 캐시 저장 + 요약 반환
4. get_g2b_cache_data(cache_file="...", → 캐시에서 상세/필터 조회
field_name="dminsttNm",
field_value_substring="서울")대량 결과는 LLM 컨텍스트를 보호하기 위해 요약 + 미리보기 5건 + 캐시 파일 경로만 반환하며, 전체 데이터는 캐시 파일에 저장되어 get_g2b_cache_data 로 탐색합니다.
키워드 정밀도 보정 & 의미 기반 리랭커
조달청 검색 API의 공고명(bidNtceNm) 필터는 단순 부분일치라 노이즈가 섞입니다 — 예: 재활 → 재활용(폐기물), 투자 → 투자유치/투자설명회. get_g2b_cache_data 가 이를 보정합니다.
# 1) 어휘 필터 (의존성 없음, 기본 제공)
get_g2b_cache_data(cache_file, field_name="bidNtceNm",
exclude_substrings=["재활용","직업재활시설"]) # 노이즈 제거
get_g2b_cache_data(cache_file, field_value_regex="재활(?!용)") # 정밀 매칭
# 2) 의미 기반 재정렬 (선택 설치: pip install "mcp-kr-g2b[ml]")
get_g2b_cache_data(cache_file,
rerank_query="디지털 헬스케어 AI 근골격계 재활 동작분석")
# → 회사/사업 설명문과의 유사도(ko-sroberta 임베딩)로 적합도 순 정렬 + _relevance 점수리랭커는
sentence-transformers(torch 포함)가 필요해 기본 설치에서 제외했습니다. 미설치 시rerank_query호출은 설치 안내를 반환하고, 그 외 기능은 정상 동작합니다. 모델은G2B_RERANK_MODEL(기본jhgan/ko-sroberta-multitask)로 변경할 수 있습니다.
빠른 시작 가이드
1. 인증 설정 (서비스키 발급)
조달청 OpenAPI는 공공데이터포털을 통해 제공됩니다.
공공데이터포털 회원가입
사용할 조달청 서비스(예: "나라장터 입찰공고정보서비스")를 검색하여 활용신청
마이페이지 → 오픈API → 인증키에서 일반 인증키(Encoding) 확인
부동산(mcp-kr-realestate) 서버와 동일한 키를 공유할 수 있습니다.
참고: 서비스마다 활용신청 승인이 필요합니다. 승인되지 않은 서비스 호출 시
20 서비스 접근 거부에러가 반환됩니다.
2. 설치
# 저장소 복제
git clone https://github.com/ChangooLee/mcp-kr-g2b.git
cd mcp-kr-g2b
# Python 3.10 이상 필수
python3 -m venv .venv
source .venv/bin/activate
# 패키지 설치
python3 -m pip install --upgrade pip
pip install -e .
# (선택) 의미 기반 리랭커까지 설치하려면 — torch 포함, 용량 큼
pip install -e ".[ml]"3. 환경변수 설정
.env.example 을 복사하여 .env 를 만들고 서비스키를 입력합니다.
cp .env.example .env
# .env 편집: PUBLIC_DATA_API_KEY_ENCODED=발급받은_Encoding_키IDE 통합
Claude Desktop 설정
햄버거 메뉴(☰) > Settings > Developer > "Edit Config" 에서 추가:
{
"mcpServers": {
"mcp-kr-g2b": {
"command": "YOUR_LOCATION/.venv/bin/mcp-kr-g2b",
"env": {
"PUBLIC_DATA_API_KEY_ENCODED": "발급받은_Encoding_서비스키",
"TRANSPORT": "stdio",
"LOG_LEVEL": "INFO",
"MCP_SERVER_NAME": "mcp-kr-g2b"
}
}
}
}Streamable HTTP (선택)
{
"mcpServers": {
"mcp-kr-g2b": {
"command": "YOUR_LOCATION/.venv/bin/mcp-kr-g2b",
"env": {
"PUBLIC_DATA_API_KEY_ENCODED": "발급받은_Encoding_서비스키",
"HOST": "0.0.0.0",
"PORT": "8002",
"TRANSPORT": "streamable-http",
"LOG_LEVEL": "INFO",
"MCP_SERVER_NAME": "mcp-kr-g2b"
}
}
}
}YOUR_LOCATION: 가상환경이 설치된 실제 경로로 변경TRANSPORT="streamable-http"설정 시 엔드포인트는http://HOST:PORT/mcp
주요 환경 변수
변수 | 설명 | 기본값 |
| 공공데이터포털 서비스키(Encoding). | (필수) |
| 페이지당 결과 수(최대 999) | 500 |
| 전체 조회 시 최대 페이지 수 | 50 |
| 요청 타임아웃(초) | 60 |
| 일시적 오류(타임아웃/5xx/4xx) 재시도 횟수 | 3 |
| 재시도 지수 백오프 기준(초) | 0.6 |
| https 호스트 사용 시 TLS 인증서 검증 | true |
| 캐시 디렉토리 | 패키지 내부( |
| (선택) 리랭커 임베딩 모델 | jhgan/ko-sroberta-multitask |
| (선택) 리랭크 평가 후보 상한 | 2000 |
| 서버 호스트/포트 | 0.0.0.0 / 8002 |
|
| stdio |
| 로깅 레벨 | INFO |
잘못된 값(예: 숫자 환경변수에 문자)이 들어와도 서버가 죽지 않고 경고 후 기본값으로 폴백합니다.
Docker로 실행하기
# 이미지 빌드
docker build -t mcp-kr-g2b:latest .
# .env 파일 사용(권장)
docker run -d \
--name mcp-kr-g2b \
-p 8002:8002 \
--env-file .env \
-e TRANSPORT=streamable-http \
mcp-kr-g2b:latest
# 또는 환경변수 직접 전달
docker run -d \
--name mcp-kr-g2b \
-p 8002:8002 \
-e PUBLIC_DATA_API_KEY_ENCODED=your-encoded-key \
-e TRANSPORT=streamable-http \
mcp-kr-g2b:latest아키텍처
mcp-opendart 의 모듈 구조와 mcp-kr-realestate 의 공공데이터포털 호출/캐싱 전략을 결합했습니다.
src/mcp_kr_g2b/
├── server.py # FastMCP 엔트리, G2BContext(전역 컨텍스트), 도구 등록
├── config.py # G2BConfig / MCPConfig (환경변수)
├── apis/
│ ├── client.py # 공공데이터포털 클라이언트(curl 우선 + requests 폴백,
│ │ # serviceKey 처리, JSON/XML 자동판별, 페이지네이션)
│ └── service.py # G2BService: 번들 명세 기반 제네릭 서비스 호출
├── tools/
│ ├── <module>_tools.py # 서비스별 get_<module>_data 도구 (14개, 코드 생성)
│ ├── common_tools.py # list_g2b_services / get_g2b_operation_info / get_g2b_cache_data
│ └── _helpers.py # 디스패치·요약·설명 생성 공통 로직
├── specs/ # 조달청 OpenAPI 명세(JSON, 원본 .docx 파싱 결과)
└── utils/
├── cache.py # 조회 결과 캐싱(raw → JSON 파일, 원자적 기록) + 요약
├── reranker.py # (선택) 의미 기반 리랭커 — sentence-transformers 지연 임포트
└── ctx_helper.py # 컨텍스트 폴백, as_json_text호출·캐싱 흐름
graph TD
A["get_<module>_data(operation, params)"] --> B[G2BService.fetch]
B --> C[G2BClient.fetch_all<br/>numOfRows/pageNo 페이지네이션]
C --> D{JSON or XML?}
D --> E[items / totalCount 정규화]
E --> F[전체 결과 → 캐시 JSON 저장]
F --> G[요약 + 미리보기 5건 + cache_file 반환]
G --> H["get_g2b_cache_data 로 상세/필터 조회"]문제 해결 및 디버깅
조달청 OpenAPI는 공통 에러코드를 사용합니다:
코드 | 의미 | 조치 |
| 정상 | - |
| 데이터 없음 / 입력범위 초과 | 조회조건(기간 등) 확인 (빈 결과로 처리) |
| 잘못된 요청 / 필수 파라미터 누락 |
|
| 서비스 접근 거부 | 해당 서비스 활용신청 승인 여부 확인 |
| 요청 제한 초과 | 일일 트래픽 한도 확인 |
| 등록되지 않은/만료된 서비스키 | 키 값 및 인코딩(Encoding 키 사용) 확인 |
# 상세 로깅
export LOG_LEVEL=DEBUG인증키 인코딩: 본 서버는 어떤 키(Encoding/Decoding)를 넣어도 정규 인코딩 형식으로 변환해 사용하며, 서비스별로 동작하는 키 형식을 자동 탐지·캐시합니다.
%2B,%2F,%3D등이 포함된 Encoding 키를 그대로 넣는 것을 권장합니다.
신뢰성 & 품질
공용 배포를 위해 다음을 보강했습니다(라이브 156개 오퍼레이션 전수 검증 기반).
재시도 + 지수 백오프: 게이트웨이의 일시적 5xx/타임아웃/4xx 를 자동 재시도. 4xx 본문을 데이터로 오인하지 않도록
curl --fail적용.키 형식 자동 페일오버: Encoding/Decoding 차이를 흡수하고, 정상 응답 본문의 우연한 문자열에 오탐하지 않도록
resultCode우선 판정.정확한 페이지네이션:
totalCount미제공 시에도 "가득 찬 페이지" 기준으로 끝까지 수집(1페이지 조용한 종료 방지). 상한(max_pages) 도달 시truncated/missingCount로 절단을 명시.캐시 견고성: 호출 변형(전체조회 vs 페이지)을 키에 반영해 덮어쓰기 충돌 방지,
cachedAt(신선도) 기록, 임시파일+os.replace원자적 기록, 동시성 락.명확한 에러: HTML 점검페이지/깨진 응답을 graceful 처리하고, 비-bid 캐시에 없는 필드로 필터하면 무음 0건 대신
FIELD_NOT_FOUND를 반환.테스트:
pytest40종(명세 무결성·클라이언트 파싱·캐시·도구). 네트워크 없이 실행됩니다.
pip install -e ".[dev]"
pytest -q보안
서비스키를 절대 공유하지 마세요.
.env파일을 안전하게 보관하고 저장소에 커밋하지 마세요(.gitignore적용됨).API 사용량(일일 트래픽)을 모니터링하세요.
라이선스
이 프로젝트는 비상업적, 개인, 연구/학습, 비영리 목적에 한해 사용할 수 있습니다(CC BY-NC 4.0). 상업적 사용은 금지됩니다. 자세한 내용은 LICENSE를 참고하세요.
이 프로젝트는 공식 조달청 제품이 아닙니다. 데이터의 정확성·최신성은 공공데이터포털 및 조달청 원본을 기준으로 합니다.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ChangooLee/mcp-kr-g2b'
If you have feedback or need assistance with the MCP directory API, please join our Discord server