Quick Start

3분 만에 moa-mcp API를 시작하세요. 가입, API 키 발급, 첫 호출까지 안내합니다.

1

회원가입

회원가입 페이지에서 이메일로 계정을 만드세요.

  1. 이메일 주소를 입력합니다.
  2. 이름과 비밀번호(8자 이상)를 설정합니다.
  3. "가입하기" 버튼을 클릭하면 즉시 계정이 생성됩니다.

가입 즉시 1,500P가 무료로 지급됩니다. 별도의 결제 정보 없이 시작할 수 있습니다.

2

API 키 발급

대시보드 → API Keys에서 API 키를 생성하세요. 키는 생성 직후에만 전체 값을 확인할 수 있습니다.

3

첫 번째 API 호출

cURL
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"
  }'
4

응답 확인

Response (200 OK)
{
  "success": true,
  "data": {
    "address": "서울특별시 강남구 테헤란로 123",
    "owner": "홍길동",
    "registryType": "소유권",
    "registeredAt": "2024-03-15",
    "details": { ... }
  },
  "usage": {
    "points_used": 5,
    "remaining": 1495
  }
}

Authentication

모든 API 요청에는 Bearer token 인증이 필요합니다.

API 키 발급

  1. 대시보드 → API Keys에서 "새 API 키 생성" 클릭
  2. 키 이름 입력 (예: Production, Development)
  3. 생성된 키를 즉시 복사 — 다시 확인 불가

요청 헤더

Authorization Header
Authorization: Bearer moa_sk_xxxxxxxxxxxxxxxxxxxxx

⚠️ 보안 가이드

  • • API 키를 클라이언트(브라우저) 코드에 포함하지 마세요
  • • 환경 변수 또는 시크릿 매니저로 관리하세요
  • • 키가 유출되면 즉시 삭제 후 재발급하세요
  • • 용도별로 키를 분리하세요 (Production / Dev / Test)

API Reference

POST/v1/registry/document

주소 또는 고유번호로 등기부등본을 조회합니다. 소유권, 근저당, 전세권 등 상세 권리 관계를 확인할 수 있습니다.

Request Body

파라미터타입필수설명
addressstring부동산 주소 (도로명 또는 지번)
registry_idstring아니오등기 고유번호 (있으면 우선 사용)
include_historyboolean아니오말소사항 포함 여부 (기본 false)
Request
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
  }'
Response (200 OK)
{
  "success": true,
  "data": {
    "address": "서울특별시 강남구 테헤란로 123",
    "owner": "홍길동",
    "registryType": "소유권",
    "registeredAt": "2024-03-15",
    "rights": [
      {
        "type": "근저당권",
        "holder": "○○은행",
        "amount": "300,000,000원"
      }
    ]
  },
  "usage": {
    "points_used": 5,
    "remaining": 1495
  }
}
Error Response (예시)
// 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
  }
}
비용:5P / 요청
POST/v1/building/ledger

주소로 건축물대장을 조회합니다. 건물 구조, 용도, 면적, 허가일 등 건축물 기본 정보를 확인할 수 있습니다.

Request Body

파라미터타입필수설명
addressstring건물 주소 (도로명 또는 지번)
ledger_typestring아니오"general" | "detail" (기본 general)
Request
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"
  }'
Response (200 OK)
{
  "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
  }
}
Error Response (예시)
// 404 DOCUMENT_NOT_FOUND
{
  "success": false,
  "error": {
    "code": "DOCUMENT_NOT_FOUND",
    "message": "해당 주소의 건축물대장을 찾을 수 없습니다.",
    "status": 404
  }
}
비용:5P / 요청
POST/v1/land/ledger

주소 또는 지번으로 토지대장을 조회합니다. 지목, 면적, 공시지가, 소유 관계 등을 확인할 수 있습니다.

Request Body

파라미터타입필수설명
addressstring토지 주소 (도로명 또는 지번)
pnu_codestring아니오필지고유번호 (19자리, 있으면 우선 사용)
Request
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"
  }'
Response (200 OK)
{
  "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
  }
}
Error Response (예시)
// 400 INVALID_REQUEST
{
  "success": false,
  "error": {
    "code": "INVALID_REQUEST",
    "message": "address 또는 pnu_code 중 하나는 필수입니다.",
    "status": 400
  }
}
비용:5P / 요청

CLI

터미널에서 직접 공공데이터를 조회할 수 있는 CLI 도구입니다.

설치

Terminal
npm install -g @moa-mcp/cli

설정

Terminal
# 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도움말 표시

사용 예시

Terminal
$ moa registry "서울특별시 강남구 테헤란로 123"

✓ 등기부등본 조회 완료

  주소      서울특별시 강남구 테헤란로 123
  소유자    홍길동
  유형      소유권
  등록일    2024-03-15

  포인트 사용: 5P (잔액: 1,495P)

옵션

옵션설명
--jsonJSON 형식으로 출력
--output <file>결과를 파일로 저장
--verbose상세 로그 출력

MCP Server

Claude, GPT 등 AI 에이전트에서 MCP tool로 직접 공공데이터를 조회할 수 있습니다.

Claude Desktop 연동

claude_desktop_config.json
{
  "mcpServers": {
    "moa": {
      "url": "https://api.moa-mcp.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

OpenAI (GPT) 연동

MCP Config
{
  "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를 호출할 수 있습니다.

설치

Terminal
npm install @moa-mcp/sdk

사용법

TypeScript
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 타입 정의

types.d.ts
/** 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;
}

에러 핸들링

TypeScript
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 에러 응답의 코드와 대응 방법입니다. 모든 에러는 동일한 형식으로 반환됩니다.

Error Response
{
  "success": false,
  "error": {
    "code": "INSUFFICIENT_POINTS",
    "message": "포인트가 부족합니다. 충전 후 다시 시도하세요.",
    "status": 402
  }
}
HTTP코드설명대응
400INVALID_REQUEST요청 형식 오류요청 바디 확인
401UNAUTHORIZED인증 실패API 키 확인
402INSUFFICIENT_POINTS포인트 부족포인트 충전
404ADDRESS_NOT_FOUND주소 미발견주소 정확성 확인
404DOCUMENT_NOT_FOUND문서 미발견해당 부동산 서류 존재 여부 확인
429RATE_LIMITED요청 한도 초과잠시 후 재시도 (Retry-After 헤더 참고)
500INTERNAL_ERROR서버 오류잠시 후 재시도, 지속 시 문의
503SERVICE_UNAVAILABLE공공데이터 소스 장애잠시 후 재시도

Rate Limits

요금제별 API 호출 한도입니다. 한도를 초과하면 429 RATE_LIMITED 에러가 반환됩니다.

요금제분당 요청일 요청동시 요청
Free101002
Pro605,00010
Enterprise300무제한50

429 대응 방법

Response Headers
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1706000000
Exponential Backoff (TypeScript)
async 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 이슈로 질문을 남겨주세요.

GitHub Issues