본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 06. 15. 06:32

LLM 에이전트를 위한 인도네시아 조달 데이터 실시간 제공

요약

PyProc MCP는 인도네시아의 공공 조달 데이터를 LLM 에이전트와 자동화 워크플로우가 실시간으로 활용할 수 있도록 MCP 도구로 변환해주는 솔루션입니다. MCP 서버, Python 라이브러리, CLI 등 다양한 인터페이스를 통해 조달 데이터에 대한 직접적인 접근과 심층 분석을 지원합니다.

핵심 포인트

  • MCP 도구를 통해 Claude Desktop, Cursor 등 AI 에이전트에서 실시간 조달 데이터 검색 가능
  • 공고, 참여자, 낙찰자 등 조달 패키지의 포괄적인 세부 정보 제공
  • Python 라이브러리 및 CLI를 지원하여 사용자 정의 자동화 파이프라인 구축 용이
  • 속도 제한 및 캐싱 가이드라인을 포함하여 책임 있는 데이터 사용 지원

LLM 에이전트를 위한 인도네시아 조달 데이터 실시간 제공

PyProc MCP는 공개된 SPSE/Inaproc 조달 데이터를 LLM 클라이언트(Claude Desktop, Continue, Cursor), AI 에이전트, 자동화 워크플로우, Python 스크립트 및 커맨드 라인(CLI) 사용자가 사용할 수 있는 **MCP 도구 (MCP tools)**로 변환합니다.

인도네시아의 공공 조달 시스템(SPSE/Inaproc)은 수백 개의 정부 기관(LPSE)에 걸쳐 수천 개의 입찰(tender) 및 비입찰(non-tender) 패키지를 처리합니다. 이 데이터는 공개되어 있지만, AI 에이전트와 자동화 도구가 접근하기에는 쉽지 않습니다.

PyProc MCP는 이 격차를 해소합니다:

LLM 네이티브 액세스 (LLM-native access)— MCP 도구를 통해 AI 에이전트가 조달 데이터를 직접 검색하고 분석할 수 있습니다.
실시간 데이터 (Real-time data)— 오래된 스냅샷이 아닌 SPSE/Inaproc에서 실시간 데이터를 가져옵니다.
포괄적 정보 (Comprehensive)— 공고, 참여자, 평가 결과, 낙찰자, 일정 등 패키지의 전체 세부 정보를 제공합니다.
경량화 (Lightweight)— 단일 명령 pyproc-mcp로 작동하며, 모든 MCP 호환 클라이언트와 함께 사용할 수 있습니다.
다중 인터페이스 (Multi-interface)— MCP 서버, Python 라이브러리 또는 CLI 도구로 사용 가능하며, 동일한 코드베이스를 사용하여 종속성(lock-in)이 없습니다.
존중하는 기본 설정 (Respectful defaults)— 내장된 속도 제한(rate limiting), 캐싱 가이드라인 및 책임 있는 사용 정책을 포함합니다.

기회 발견 (Discover opportunities)— 모든 LPSE 호스트에 걸쳐 입찰 및 비입찰 패키지를 검색합니다.
심층 분석 (Deep-dive analysis)— 요구 사항, HPS(예정 가격) 값, 위치, 일정 등 패키지의 전체 세부 정보를 검색합니다.
경쟁 정보 (Competitive intelligence)— 누가 입찰하고, 누가 낙찰받으며, 어떤 가격인지 확인합니다.
타임라인 추적 (Timeline tracking)— 공고부터 계약까지 조달 일정을 모니터링합니다.
공급업체 조사 (Vendor research)— 어떤 회사가 어디에서 어떤 유형의 계약을 수주하는지 찾습니다.
AI 기반 통찰력 (AI-powered insights)— LLM이 조달 패턴을 분석하고, 패키지를 비교하며, 보고서를 생성하도록 합니다.
내보내기 및 자동화 (Export and automate)— Python 라이브러리나 CLI를 사용하여 자동화된 조달 모니터링 파이프라인을 구축합니다.

PyProc는 세 가지 방식으로 사용할 수 있습니다. 귀하의 워크플로우에 맞는 방식을 선택하세요:

MCP 도구를 통해 LLM에 인도네시아 조달 데이터에 대한 직접적인 액세스 권한을 부여합니다.

pip install pyproc[mcp]
pyproc-mcp

MCP 클라이언트 설정 (MCP Client Configuration):

MCP 클라이언트의 설정 파일(예: claude_desktop_config.json)에 추가하세요:

{
"mcpServers": {
"pyproc": {
...

MCP 클라이언트를 재시작하세요. PyProc 도구들이 도구 목록에 나타날 것입니다.

사용자 정의 자동화 및 데이터 분석을 위해 PyProc를 Python 라이브러리로 사용하세요.

from pyproc import Lpse, JenisPengadaan
from pyproc.lpse import By
# 특정 LPSE 호스트를 위한 클라이언트 초기화
...

전체 API 문서는 Python Library Usage를 참조하세요.

커맨드 라인(Command Line)에서 조달 데이터를 대량으로 다운로드하세요.

# Kemenkeu LPSE에서 입찰(tender) 데이터를 다운로드하여 JSON으로 내보내기
pyproc kemenkeu --keyword "mobil dinas" --tahun-anggaran 2025 --output-format json
# 여러 LPSE 호스트에서 비입찰(non-tender) 데이터를 다운로드
...

전체 인자(argument) 참조는 CLI Usage를 참조하세요.

MCP 서버는 다음과 같은 도구들을 제공합니다:

도구설명
search_lpse_hosts"kementerian keuangan"과 같은 기관 명칭으로부터 LPSE 호스트 슬러그(slug)를 찾습니다
get_lpse_host_detail알려진 LPSE 호스트 슬러그에 대한 메타데이터 및 정규 URL(canonical URL)을 확인합니다
get_procurement_search_options직접 키워드 검색(direct keyword search)과 로컬 전체 텍스트 인덱싱(local full-text indexing)의 차이를 설명합니다
search_tender_packages하나 이상의 정확한 SPSE 키워드로 입찰(tender) 조달 패키지를 검색합니다
search_non_tender_packages하나 이상의 정확한 SPSE 키워드로 비입찰(non-tender) 패키지를 검색합니다
search_pencatatan_non_tender_packages별도의 /dt/nonspk 엔티티인 pencatatan 비입찰 패키지를 검색합니다
search_swakelola_packagesswakelola 패키지를 검색합니다
search_pengadaan_darurat_packagespengadaan darurat 패키지를 검색합니다
get_tender_detail입찰 패키지의 전체 상세 정보 — 공고, 참여자, 평가, 낙찰자, 일정 — 를 가져옵니다
get_non_tender_detail비입찰 패키지의 전체 상세 정보를 가져옵니다
get_pencatatan_non_tender_detailpencatatan 비입찰 패키지의 상세 정보를 가져옵니다
get_swakelola_detailswakelola 패키지의 상세 정보를 가져옵니다
get_pengadaan_darurat_detailpengadaan darurat 패키지의 상세 정보를 가져옵니다

get_tender_details_bulk |
한 번의 도구 호출로 여러 tender (입찰) 패키지의 상세 정보를 가져옵니다 |
get_non_tender_details_bulk |
한 번의 도구 호출로 여러 non-tender (비입찰) 패키지의 상세 정보를 가져옵니다 |
get_pencatatan_non_tender_details_bulk |
여러 pencatatan non-tender 패키지의 상세 정보를 가져옵니다 |
get_swakelola_details_bulk |
여러 swakelola 패키지의 상세 정보를 가져옵니다 |
get_pengadaan_darurat_details_bulk |
여러 pengadaan darurat 패키지의 상세 정보를 가져옵니다 |
get_procurement_categories |
지원되는 조달 카테고리 목록을 나열합니다 (네트워크 호출 없음) |
validate_lpse_host |
LPSE 호스트에 접근 가능한지 확인합니다 |
create_procurement_search_index |
제한된 패키지 세트를 로컬 SQLite 전문 검색 인덱스 (full-text index)로 다운로드합니다 |
search_procurement_index |
로컬 SQLite 전문 검색 인덱스 (full-text index)를 검색합니다 |
list_procurement_indexes |
로컬 전문 검색 인덱스 목록을 나열합니다 |
delete_procurement_index |
로컬 전문 검색 인덱스를 삭제합니다 |

각 도구에는 매개변수 문서, 속도 제한 (rate limit) 참고 사항 및 데이터 소스 출처가 포함된 LLM 친화적인 설명이 포함되어 있습니다.

사용자는 LPSE 호스트 슬러그 (slug)를 사전에 알 필요가 없습니다. 사용자가 기관명을 언급하면, LLM은 먼저 호스트를 확인한 다음 조달 패키지를 검색해야 합니다.

두 가지 조달 실행 범위 (scope)가 있습니다:

  • kemenkeu, jakarta, 또는 pu와 같은 기관별 호스트
  • 전국 단위/기관 간 (lintas instansi) 데이터 및 pencatatan nasional 소스에 사용되는 전국 호스트 nasional

사용자가 national, nationwide, all-Indonesia, lintas instansi 또는 pencatatan nasional 데이터를 요청하면, lpse_host="nasional"을 직접 사용하십시오.

호스트 검색은 유지 관리되는 Gist 호스트 메타데이터와 기관 호스트의 newUrlPath 필드를 사용합니다. nasional 호스트는 내장되어 있으며 Gist 메타데이터에 의존하지 않습니다. 레거시 oldUrl 값은 무시됩니다. 정규 URL (Canonical URL)은 항상 다음과 같이 생성됩니다:

사용자 요청 예시:

cari data lelang pengadaan laptop pada kementerian keuangan

예상되는 MCP 흐름:

  • query="kementerian keuangan"와 함께 search_lpse_hosts 호출

  • 가장 적절하게 반환된 host를 선택합니다 (보통 kemenkeu).

  • lpse_host="kemenkeu"keyword="laptop"와 함께 search_tender_packages를 호출합니다.

만약 여러 개의 호스트 후보가 타당해 보인다면, LLM은 패키지 데이터를 검색하기 전에 사용자에게 의도한 LPSE를 선택하도록 요청해야 합니다.

SPSE/Inaproc 패키지 검색은 키워드 기반입니다. 따라서 PyProc MCP는 두 가지 검색 전략을 제공합니다:

직접 키워드 검색 (Direct keyword search): 빠르고 가볍습니다. keyword 또는 keywords (예: ["laptop", "notebook", "komputer"])와 함께 search_tender_packages 또는 search_non_tender_packages를 사용합니다. MCP 서버는 제한된 범위의 SPSE 검색을 실행하고 중복된 패키지 ID를 병합합니다.

로컬 전체 텍스트 검색 (Local full-text search): 범위는 더 넓지만 속도는 느립니다. 사용자가 제한된 패키지 세트를 로컬에 다운로드하고 인덱싱하는 것에 동의한 후에만 create_procurement_search_index를 사용해야 하며, 이 도구는 confirm_download=true를 필요로 합니다. 그 다음 search_procurement_index를 사용하여 SQLite FTS (Full-Text Search)로 다운로드된 패키지 상세 정보를 검색합니다.

LLM은 직접 키워드 검색으로 시작해야 합니다. 결과가 미흡하거나 사용자가 더 넓은 범위의 전체 텍스트 검색을 요청하는 경우, 로컬 인덱스를 생성하기 전에 트레이드오프 (tradeoff)를 설명해야 합니다.

다음은 PyProc MCP 도구가 연결되었을 때 LLM에게 요청할 수 있는 예시입니다:

"Cari data lelang pengadaan laptop pada kementerian keuangan" (재무부의 노트북 조달 입찰 데이터를 찾아줘)
→ LLM은 search_lpse_hosts를 사용하여 "kementerian keuangan"을 kemenkeu로 식별한 다음, ["laptop", "notebook", "komputer"]와 같은 키워드로 search_tender_packages를 호출합니다.

"Kalau keyword biasa kurang lengkap, cari full text di detail paket" (일반 키워드로 부족하면 패키지 상세 정보에서 전체 텍스트를 검색해줘)
→ LLM은 로컬 인덱싱이 패키지 상세 정보를 다운로드한다는 점을 설명한 후, 사용자가 동의하면 create_procurement_search_index를 사용하고 이어서 search_procurement_index를 사용합니다.

"Find active procurement packages related to cybersecurity in 2025" (2025년에 사이버 보안과 관련된 활성 조달 패키지를 찾아줘)
→ LLM은 관련 LPSE 호스트 전반에 걸쳐 "keamanan siber" 또는 "cybersecurity" 키워드로 search_tender_packages를 사용합니다.

"kemenkeu의 tender package 10080116000을 요약해줘 — HPS는 무엇이고, 누가 낙찰되었으며, 언제인가요?"
→ LLM은 get_tender_detail을 사용하여

전체 패키지를 검색하고 주요 필드를 요약합니다.

"검색 결과에서 처음 5개 tender 패키지의 상세 정보를 가져와줘"
→ LLM은 get_tender_details_bulk를 사용하여

get_tender_detail을 반복적으로 호출하는 대신 선택된 패키지 ID들을 전달합니다.

"pu LPSE의 상위 5개 인프라 tender를 HPS 값 기준으로 비교해줘"
→ LLM은 search_tender_packages를 사용하여

kategori=PEKERJAAN_KONSTRUKSI 옵션과 함께 호출하고, HPS 순으로 정렬하여 비교 표를 제시합니다.

"IT 조달에 입찰하려는 기업을 위한 벤더 조사 체크리스트를 생성해줘"
→ LLM은 최근 IT 관련 tender를 분석하여 요구 사항, 인증 및 일반적인 입찰 금액에 대한 체크리스트를 생성합니다.

pip install pyproc

pip install pyproc[mcp]

pip install git+https://github.com/wakataw/pyproc.git

pip uninstall pyproc

MCP 서버는 환경 변수를 통해 설정됩니다:

변수기본값설명
PYPROC_TIMEOUT30HTTP 요청 타임아웃 (초)
PYPROC_RATE_LIMIT_DELAY1.0요청 간 최소 간격 (초)
PYPROC_LOG_LEVELINFO로깅 레벨 (DEBUG, INFO, WARNING, ERROR, CRITICAL)

MCP 서버: 영구적인 캐싱 (persistent caching)을 사용하지 않습니다. 각 도구 호출은 SPSE/Inaproc에 새로운 요청을 보냅니다. SPSE 서버를 존중하기 위해 요청 간 최소 1초의 지연을 강제하는 속도 제한 (Rate limiting)이 적용됩니다. CLI 도구: 다운로드 진행 상황 추적 및 재개 지원을 위해 로컬 SQLite 데이터베이스 (.idx 파일)를 사용합니다. 캐시는 다운로드별로 폐기 가능합니다. Python 라이브러리: 내장된 캐싱이 없습니다. Lpse 클래스 메서드를 통해 요청 라이프사이클을 직접 제어합니다.

데이터의 최신성은 SPSE/Inaproc 소스의 가용성에 따라 달라집니다. 가장 최신의 정보를 확인하려면 spse.inaproc.id를 방문하십시오.

from pyproc import Lpse
lpse = Lpse('kemenkeu', timeout=30) # 타임아웃 단위: 초

Lpse 클래스는 컨텍스트 매니저 (context manager) 사용을 지원합니다:

with Lpse('kemenkeu') as lpse:
pakages = lpse.get_paket_tender(length=10)
from pyproc import Lpse, JenisPengadaan
from pyproc.lpse import By
lpse = Lpse('kemenkeu')
...

packages = lpse.get_paket_non_tender(start=0, length=25)

Pencatatan non-tender는 일반적인 non-tender와 별개의 개체입니다.

pakages = lpse.get_paket_pencatatan_non_tender(
kategori=JenisPengadaan.JASA_LAINNYA,
rekanan='PT Test',
...
detail = lpse.detil_paket_tender('10080116000')
detail.get_all_detil()
...
detail = lpse.detil_paket_non_tender('10080116000')
detail.get_all_detil()
detail = lpse.detil_paket_pencatatan_non_tender('10942236000')
detail.get_all_detil()
swakelola = lpse.detil_paket_swakelola('10336514000')
...
from pyproc import JenisPengadaan
# 모든 카테고리 목록 가져오기
for cat in JenisPengadaan:
...

pyproc kemenkeu

이 명령어는 Kemenkeu LPSE에서 입찰 데이터를 다운로드하여 kemenkeu.csv로 내보냅니다.

.

ArgumentExampleDefaultDescription
lpse_hostpyproc kemenkeuRequiredLPSE 호스트 또는 호스트 목록이 담긴 텍스트 파일
-k, --keyword`--keyword

--index-download-delay 5 |
1 |
인덱스 페이지 간 지연 시간 (초) |
-o, --output-format |
--output-format json |
csv |
출력 형식: csv 또는 json |
--keep-index |
--keep-index |
False |
다운로드 후 SQLite 인덱스 파일 유지 |
-r, --resume |
--resume |
False |
실패한 다운로드 재개 |
-s, --separator |
--separator " | " | ; |
--log |
--log DEBUG |
INFO |
로그 레벨 |

# 여러 LPSE 호스트로부터 다운로드
pyproc jakarta,kemenkeu,sumbarprov
# 사용자 정의 출력 파일명 사용
...
# Gist 메타데이터로부터 LPSE 호스트 목록을 CSV로 내보내기
pyproc daftarlpse
# 정제된 Gist 기반 JSON으로 LPSE 호스트 목록 내보내기
...

이 프로젝트는 LKPP, LPSE, SPSE, Inaproc 또는 인도네시아 정부 기관과 관련이 없습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0