Quick Start
3분 만에 moa-mcp API를 시작하세요. 가입, API 키 발급, 첫 호출까지 안내합니다.
회원가입
회원가입 페이지에서 이메일로 계정을 만드세요.
- 이메일 주소를 입력합니다.
- 이름과 비밀번호(8자 이상)를 설정합니다.
- "가입하기" 버튼을 클릭하면 즉시 계정이 생성됩니다.
가입 즉시 1,500P가 무료로 지급됩니다. 별도의 결제 정보 없이 시작할 수 있습니다.
API 키 발급
대시보드 → API Keys에서 API 키를 생성하세요. 키는 생성 직후에만 전체 값을 확인할 수 있습니다.
첫 번째 API 호출
curl -X POST https://api.moa-mcp.dev/v1/registry/document \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "서울특별시 강남구 테헤란로 123"
}'응답 확인
{
"success": true,
"data": {
"address": "서울특별시 강남구 테헤란로 123",
"owner": "홍길동",
"registryType": "소유권",
"registeredAt": "2024-03-15",
"details": { ... }
},
"usage": {
"points_used": 5,
"remaining": 1495
}
}Authentication
모든 API 요청에는 Bearer token 인증이 필요합니다.
API 키 발급
- 대시보드 → API Keys에서 "새 API 키 생성" 클릭
- 키 이름 입력 (예: Production, Development)
- 생성된 키를 즉시 복사 — 다시 확인 불가
요청 헤더
Authorization: Bearer moa_sk_xxxxxxxxxxxxxxxxxxxxx⚠️ 보안 가이드
- • API 키를 클라이언트(브라우저) 코드에 포함하지 마세요
- • 환경 변수 또는 시크릿 매니저로 관리하세요
- • 키가 유출되면 즉시 삭제 후 재발급하세요
- • 용도별로 키를 분리하세요 (Production / Dev / Test)
API Reference
/v1/registry/document주소 또는 고유번호로 등기부등본을 조회합니다. 소유권, 근저당, 전세권 등 상세 권리 관계를 확인할 수 있습니다.
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| address | string | 예 | 부동산 주소 (도로명 또는 지번) |
| registry_id | string | 아니오 | 등기 고유번호 (있으면 우선 사용) |
| include_history | boolean | 아니오 | 말소사항 포함 여부 (기본 false) |
curl -X POST https://api.moa-mcp.dev/v1/registry/document \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "서울특별시 강남구 테헤란로 123",
"include_history": true
}'{
"success": true,
"data": {
"address": "서울특별시 강남구 테헤란로 123",
"owner": "홍길동",
"registryType": "소유권",
"registeredAt": "2024-03-15",
"rights": [
{
"type": "근저당권",
"holder": "○○은행",
"amount": "300,000,000원"
}
]
},
"usage": {
"points_used": 5,
"remaining": 1495
}
}// 404 ADDRESS_NOT_FOUND
{
"success": false,
"error": {
"code": "ADDRESS_NOT_FOUND",
"message": "주소를 찾을 수 없습니다. 정확한 도로명 또는 지번 주소를 입력하세요.",
"status": 404
}
}
// 402 INSUFFICIENT_POINTS
{
"success": false,
"error": {
"code": "INSUFFICIENT_POINTS",
"message": "포인트가 부족합니다. 충전 후 다시 시도하세요.",
"status": 402
}
}/v1/building/ledger주소로 건축물대장을 조회합니다. 건물 구조, 용도, 면적, 허가일 등 건축물 기본 정보를 확인할 수 있습니다.
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| address | string | 예 | 건물 주소 (도로명 또는 지번) |
| ledger_type | string | 아니오 | "general" | "detail" (기본 general) |
curl -X POST https://api.moa-mcp.dev/v1/building/ledger \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "서울특별시 강남구 테헤란로 123",
"ledger_type": "general"
}'{
"success": true,
"data": {
"address": "서울특별시 강남구 테헤란로 123",
"buildingName": "테헤란 타워",
"mainUse": "업무시설",
"structure": "철근콘크리트",
"floors": { "above": 20, "below": 5 },
"totalArea": "45,230.5㎡",
"approvalDate": "2015-06-20"
},
"usage": {
"points_used": 5,
"remaining": 1490
}
}// 404 DOCUMENT_NOT_FOUND
{
"success": false,
"error": {
"code": "DOCUMENT_NOT_FOUND",
"message": "해당 주소의 건축물대장을 찾을 수 없습니다.",
"status": 404
}
}/v1/land/ledger주소 또는 지번으로 토지대장을 조회합니다. 지목, 면적, 공시지가, 소유 관계 등을 확인할 수 있습니다.
Request Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| address | string | 예 | 토지 주소 (도로명 또는 지번) |
| pnu_code | string | 아니오 | 필지고유번호 (19자리, 있으면 우선 사용) |
curl -X POST https://api.moa-mcp.dev/v1/land/ledger \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "서울특별시 강남구 테헤란로 123"
}'{
"success": true,
"data": {
"address": "서울특별시 강남구 역삼동 123-4",
"landCategory": "대",
"area": "1,250.3㎡",
"officialPrice": "15,200,000원/㎡",
"owner": "홍길동",
"ownershipShare": "1/1"
},
"usage": {
"points_used": 5,
"remaining": 1485
}
}// 400 INVALID_REQUEST
{
"success": false,
"error": {
"code": "INVALID_REQUEST",
"message": "address 또는 pnu_code 중 하나는 필수입니다.",
"status": 400
}
}CLI
터미널에서 직접 공공데이터를 조회할 수 있는 CLI 도구입니다.
설치
npm install -g @moa-mcp/cli설정
# API 키 설정
moa config set api-key YOUR_API_KEY
# 설정 확인
moa config list명령어
| 명령어 | 설명 |
|---|---|
| moa registry <주소> | 등기부등본 조회 |
| moa building <주소> | 건축물대장 조회 |
| moa land <주소> | 토지대장 조회 |
| moa config set <key> <value> | 설정 변경 |
| moa --help | 도움말 표시 |
사용 예시
$ moa registry "서울특별시 강남구 테헤란로 123"
✓ 등기부등본 조회 완료
주소 서울특별시 강남구 테헤란로 123
소유자 홍길동
유형 소유권
등록일 2024-03-15
포인트 사용: 5P (잔액: 1,495P)옵션
| 옵션 | 설명 |
|---|---|
| --json | JSON 형식으로 출력 |
| --output <file> | 결과를 파일로 저장 |
| --verbose | 상세 로그 출력 |
MCP Server
Claude, GPT 등 AI 에이전트에서 MCP tool로 직접 공공데이터를 조회할 수 있습니다.
Claude Desktop 연동
{
"mcpServers": {
"moa": {
"url": "https://api.moa-mcp.dev/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}OpenAI (GPT) 연동
{
"tools": [
{
"type": "mcp",
"server_label": "moa",
"server_url": "https://api.moa-mcp.dev/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
]
}제공 Tool 목록
| Tool | 설명 | 비용 |
|---|---|---|
| get_registry | 등기부등본 조회 | 5P |
| get_building | 건축물대장 조회 | 5P |
| get_land | 토지대장 조회 | 5P |
💡 MCP 연동 시 AI가 자동으로 적절한 tool을 선택합니다. "테헤란로 123 등기부등본 조회해줘" 같은 자연어 요청이 가능합니다.
SDKs
TypeScript/JavaScript 프로젝트에서 타입 안전하게 API를 호출할 수 있습니다.
설치
npm install @moa-mcp/sdk사용법
import { MoaClient } from "@moa-mcp/sdk";
const moa = new MoaClient({
apiKey: process.env.MOA_API_KEY!,
});
// 등기부등본 조회
const registry = await moa.registry.getDocument({
address: "서울특별시 강남구 테헤란로 123",
includeHistory: true,
});
console.log(registry.data.owner);
// => "홍길동"
// 건축물대장 조회
const building = await moa.building.getLedger({
address: "서울특별시 강남구 테헤란로 123",
});
console.log(building.data.mainUse);
// => "업무시설"
// 토지대장 조회
const land = await moa.land.getLedger({
address: "서울특별시 강남구 테헤란로 123",
});
console.log(land.data.officialPrice);
// => "15,200,000원/㎡"TypeScript 타입 정의
/** API 공통 응답 */
interface MoaResponse<T> {
success: true;
data: T;
usage: { points_used: number; remaining: number };
}
/** 에러 응답 */
interface MoaErrorResponse {
success: false;
error: {
code: string; // e.g. "ADDRESS_NOT_FOUND"
message: string;
status: number; // HTTP status code
};
}
/** 등기부등본 */
interface RegistryDocument {
address: string;
owner: string;
registryType: string;
registeredAt: string;
rights: {
type: string;
holder: string;
amount: string;
}[];
}
/** 건축물대장 */
interface BuildingLedger {
address: string;
buildingName: string;
mainUse: string;
structure: string;
floors: { above: number; below: number };
totalArea: string;
approvalDate: string;
}
/** 토지대장 */
interface LandLedger {
address: string;
landCategory: string;
area: string;
officialPrice: string;
owner: string;
ownershipShare: string;
}에러 핸들링
import { MoaClient, MoaError } from "@moa-mcp/sdk";
try {
const result = await moa.registry.getDocument({
address: "잘못된 주소",
});
} catch (error) {
if (error instanceof MoaError) {
console.error(error.code); // "ADDRESS_NOT_FOUND"
console.error(error.message); // "주소를 찾을 수 없습니다"
console.error(error.status); // 404
}
}Error Codes
API 에러 응답의 코드와 대응 방법입니다. 모든 에러는 동일한 형식으로 반환됩니다.
{
"success": false,
"error": {
"code": "INSUFFICIENT_POINTS",
"message": "포인트가 부족합니다. 충전 후 다시 시도하세요.",
"status": 402
}
}| HTTP | 코드 | 설명 | 대응 |
|---|---|---|---|
| 400 | INVALID_REQUEST | 요청 형식 오류 | 요청 바디 확인 |
| 401 | UNAUTHORIZED | 인증 실패 | API 키 확인 |
| 402 | INSUFFICIENT_POINTS | 포인트 부족 | 포인트 충전 |
| 404 | ADDRESS_NOT_FOUND | 주소 미발견 | 주소 정확성 확인 |
| 404 | DOCUMENT_NOT_FOUND | 문서 미발견 | 해당 부동산 서류 존재 여부 확인 |
| 429 | RATE_LIMITED | 요청 한도 초과 | 잠시 후 재시도 (Retry-After 헤더 참고) |
| 500 | INTERNAL_ERROR | 서버 오류 | 잠시 후 재시도, 지속 시 문의 |
| 503 | SERVICE_UNAVAILABLE | 공공데이터 소스 장애 | 잠시 후 재시도 |
Rate Limits
요금제별 API 호출 한도입니다. 한도를 초과하면 429 RATE_LIMITED 에러가 반환됩니다.
| 요금제 | 분당 요청 | 일 요청 | 동시 요청 |
|---|---|---|---|
| Free | 10 | 100 | 2 |
| Pro | 60 | 5,000 | 10 |
| Enterprise | 300 | 무제한 | 50 |
429 대응 방법
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1706000000async function withRetry<T>(
fn: () => Promise<T>,
maxRetries = 3
): Promise<T> {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error: any) {
if (error.status === 429 && i < maxRetries - 1) {
const retryAfter = error.headers?.["retry-after"];
const delay = retryAfter
? parseInt(retryAfter) * 1000
: Math.pow(2, i) * 1000;
await new Promise((r) => setTimeout(r, delay));
continue;
}
throw error;
}
}
throw new Error("Max retries exceeded");
}FAQ
더 궁금한 점이 있나요?
GitHub 이슈로 질문을 남겨주세요.