AI 에이전트 전용 API 설계 전략: LLM이 좋아하는 OpenAPI Spec은 따로 있다 (2026)
- 사람을 위한 API와 LLM을 위한 API는 설계 원칙이 다릅니다.
operationId,description은 프롬프트입니다. 의도를 서술형으로 적어야 합니다.- 에러 응답에 “다음 행동 힌트”를 담으면 LLM이 스스로 재요청(Self-Healing)합니다.
- 선택 파라미터를 줄이고 타입을 엄격하게 정의할수록 Function Calling 성공률이 올라갑니다.
2026년 현재, 많은 백엔드 팀이 기존 REST API를 그대로 AI 에이전트에게 노출시키고 있습니다. 그 결과로 나타나는 문제는 예측 가능합니다. LLM이 잘못된 파라미터로 반복 요청을 하거나, 에러가 나도 복구하지 못하고 멈춰버리는 것입니다.
AI-Native API란 LLM이 소비자가 되는 API입니다. 설계 철학 자체가 달라야 합니다.
AI-Native API란 무엇인가? 인간 API와의 비교
기존 REST API는 사람 개발자가 문서를 읽고 SDK를 통해 호출한다고 가정합니다. 네이밍이 짧고 직관적이면 충분합니다.
반면 LLM은 API Spec 전체를 컨텍스트로 받아 어떤 엔드포인트를 언제 호출할지 스스로 판단합니다. 이 판단의 품질은 Spec에 적힌 텍스트 — 특히 description 필드에 의해 결정됩니다.

아래 표에서 두 접근 방식의 핵심 차이를 확인할 수 있습니다.
| 항목 | 인간 타겟 API | AI 에이전트 타겟 API |
|---|---|---|
| 네이밍 선호 | 짧고 직관적 (createUser) | 의도가 명확한 서술형 (operationId) |
| description | 부가 설명 (생략 가능) | 호출 판단의 핵심 컨텍스트 (필수) |
| 선택 파라미터 | 유연성을 위해 권장 | 최소화 — 환각 유발 원인 |
| 에러 응답 | 에러 코드 + 짧은 메시지 | 다음 행동 힌트 포함 필수 |
| 인증 방식 | 세션, 쿠키 포함 다양 | API Key 또는 Bearer Token 단일화 권장 |
LLM이 읽기 편한 OpenAPI Spec 작성법 (2026년형)
operationId와 description — 프롬프트로 작성하세요
OpenAPI의 operationId는 LLM이 어떤 함수를 호출할지 선택할 때 가장 먼저 참고하는 필드입니다. 일반적인 개발 관례대로 getUser, createOrder처럼 짧게 쓰면 LLM은 컨텍스트를 파악하기 어렵습니다.
description 역시 마찬가지입니다. 아래 Before/After를 비교해 보세요.
❌ Before — LLM이 오해하기 쉬운 Spec
paths:
/orders:
post:
operationId: createOrder
summary: Create order
description: Creates a new order.
parameters: []
이 Spec을 받은 LLM은 “주문을 생성하는 엔드포인트”라는 것만 알 뿐, 언제 호출해야 하는지, 어떤 선행 조건이 필요한지, 응답으로 무엇을 기대해야 하는지 알 수 없습니다.
✅ After — LLM이 정확하게 호출하는 Spec
paths:
/orders:
post:
operationId: create_new_order_after_cart_confirmation
summary: 장바구니 확인 후 신규 주문을 생성합니다.
description: >
사용자가 장바구니를 최종 확인한 후 호출합니다.
이 엔드포인트는 재고 확인, 가격 검증, 결제 토큰 발급을 포함한
주문 생성 트랜잭션 전체를 처리합니다.
호출 전에 반드시 GET /cart/{cartId}/validate 를 먼저 실행하여
장바구니 유효성을 확인하세요.
성공 시 orderId를 반환하며, 이후 POST /payments/{orderId}/charge 로
실제 결제를 진행합니다.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOrderRequest'
operationId에 스네이크 케이스로 의도를 서술하고, description에 선행 조건과 후속 행동까지 명시했습니다. 이 Spec을 읽은 LLM은 장바구니 검증 → 주문 생성 → 결제 요청 순서를 정확히 따릅니다.
Enum과 Type의 엄격한 정의
LLM의 환각(Hallucination)을 막는 가장 효과적인 방법 중 하나는 허용 값의 범위를 Spec에서 미리 제한하는 것입니다.
components:
schemas:
OrderStatus:
type: string
enum:
- PENDING
- CONFIRMED
- SHIPPED
- DELIVERED
- CANCELLED
description: >
주문 상태 코드.
- PENDING: 결제 대기 중
- CONFIRMED: 결제 완료, 처리 중
- SHIPPED: 배송 시작
- DELIVERED: 배송 완료
- CANCELLED: 취소됨. 환불 처리는 별도 엔드포인트 사용
enum 목록에 각 값의 의미를 description으로 풀어두면, LLM이 "processing", "done" 같은 임의의 값을 만들어내는 실수를 방지할 수 있습니다.
AI의 환각을 막는 파라미터 구조화 — Payload 다이어트
OpenAPI Spec에서 선택 파라미터(Optional)가 많을수록 LLM이 어떤 조합을 써야 하는지 판단하기 어렵고, 잘못된 필드 조합으로 요청을 보낼 가능성이 높아집니다.
원칙 1 — 선택 파라미터를 최소화하고 관련 파라미터를 묶기
# ❌ 피해야 할 구조: 의존 관계가 있는 파라미터가 분산됨
schemas:
SearchRequest:
properties:
query: { type: string }
filterByDate: { type: boolean } # 선택
startDate: { type: string } # filterByDate가 true일 때만 유효
endDate: { type: string } # filterByDate가 true일 때만 유효
# ✅ 권장 구조: 의존 파라미터를 하위 객체로 묶기
schemas:
SearchRequest:
properties:
query:
type: string
description: 검색어. 비어있으면 전체 조회합니다.
dateRange:
$ref: '#/components/schemas/DateRange'
description: 날짜 필터. 생략 시 전체 기간을 조회합니다.
DateRange:
required: [startDate, endDate]
properties:
startDate:
type: string
format: date
description: "조회 시작일. ISO 8601 형식 (예: 2026-01-01)"
endDate:
type: string
format: date
description: "조회 종료일. startDate보다 이후여야 합니다."
의존성이 있는 파라미터를 별도 스키마로 분리하면, LLM은 dateRange 객체를 통째로 넣거나 통째로 생략하는 명확한 선택을 하게 됩니다.
원칙 2 — 컨텍스트 리미트를 고려한 응답 페이로드 압축
에이전트는 API 응답 전체를 컨텍스트로 보유합니다. 응답에 불필요한 필드가 많을수록 토큰 낭비가 심합니다. 에이전트 전용 엔드포인트를 별도로 만들거나, fields 파라미터로 필요한 필드만 선택해 반환받는 구조를 검토하세요.
에이전트의 Self-Healing을 돕는 에러 핸들링
이 부분이 기존 가이드들이 다루지 않는 핵심입니다.
일반적인 에러 응답은 HTTP 상태 코드와 짧은 메시지를 반환합니다. LLM이 이것을 받으면 “실패했다”는 사실만 알 뿐, 어떻게 수정해야 하는지 알 수 없습니다. 그 결과 LLM은 동일한 요청을 반복하거나 작업을 포기합니다.
AI Self-Healing 에러 응답 설계
LLM이 다음 행동을 추론할 수 있도록 에러 응답에 충분한 컨텍스트를 담아야 합니다.
// ❌ 기존 방식 — LLM이 다음 행동을 추론할 수 없음
{
"error": "Bad Request",
"message": "Invalid parameter"
}
// ✅ AI Self-Healing 방식 — LLM이 파라미터를 수정하여 재요청 가능
{
"error": {
"code": "VALIDATION_ERROR",
"message": "요청 파라미터 검증에 실패했습니다.",
"details": [
{
"field": "dateRange.endDate",
"issue": "MISSING_REQUIRED_FIELD",
"hint": "dateRange.startDate를 지정한 경우 endDate도 함께 제공해야 합니다. ISO 8601 형식을 사용하세요 (예: 2026-12-31)."
}
],
"retryable": true,
"suggestedAction": "dateRange.endDate 값을 추가하여 동일한 엔드포인트로 재요청하세요."
}
}

retryable 플래그와 suggestedAction 필드는 에이전트 프레임워크에서 자동 재시도 로직을 구현할 때도 활용할 수 있습니다. 아래는 상태 코드별 AI 대응 전략 가이드입니다.
| HTTP 상태 코드 | 의미 | AI 대응 전략 |
|---|---|---|
| 400 | 파라미터 오류 | details 기반 파라미터 수정 후 재요청 |
| 401 | 인증 실패 | 토큰 갱신 후 재요청 |
| 403 | 권한 없음 | 재시도 없음, 사용자에게 권한 요청 |
| 404 | 리소스 없음 | ID 확인 또는 목록 조회 후 재요청 |
| 409 | 충돌 (중복 등) | 기존 리소스 조회 후 재사용 또는 수정 |
| 422 | 비즈니스 로직 실패 | suggestedAction 힌트 기반 재처리 |
| 429 | 요청 한도 초과 | Retry-After 헤더 값만큼 대기 후 재요청 |
| 500 | 서버 오류 | 지수 백오프(Exponential Backoff) 재시도 |
2026년 MCP(Model Context Protocol) 연동 관점
AI 에이전트 MCP 서버 완벽 가이드: Gemini CLI로 나만의 코딩 에이전트 만들기
Model Context Protocol(MCP) 개념부터 Gemini CLI 설치, 커스텀 MCP 서버 JSON 설정, 최신 Gemini API Docs MCP 연동까지 — 보일러플레이트 코드와 트러블슈팅 가이드 제공
/blog/gemini-cli-mcp-server-setup-2026/MCP(Model Context Protocol)는 Anthropic이 제안한 LLM-Tool 연동 표준으로, 2026년에는 주요 AI 에이전트 프레임워크에서 사실상의 표준으로 자리잡았습니다.
MCP 환경에서도 위에서 다룬 원칙들은 동일하게 적용됩니다. MCP Tool Definition의 description이 곧 에이전트가 해당 도구를 언제 사용할지 결정하는 프롬프트이기 때문입니다.
# MCP Tool Definition 예시 — description이 핵심
{
"name": "search_products",
"description": """
사용자의 자연어 쿼리를 기반으로 상품을 검색합니다.
카테고리 필터, 가격 범위, 정렬 옵션을 조합할 수 있습니다.
검색 결과가 없을 경우 빈 배열을 반환하며, 재시도할 필요 없습니다.
페이지네이션은 cursor 기반으로 동작합니다.
""",
"inputSchema": {
"type": "object",
"required": ["query"],
"properties": {
"query": {
"type": "string",
"description": "검색어. 최소 2자 이상."
},
"cursor": {
"type": "string",
"description": "이전 응답의 nextCursor 값. 다음 페이지 조회 시 사용."
}
}
}
}
API 설계자가 곧 프롬프트 엔지니어입니다
2026년 AI 에이전트 시대에 백엔드 개발자의 역할이 달라지고 있습니다. OpenAPI Spec의 description을 어떻게 쓰느냐가 LLM의 동작 품질을 결정합니다. API 설계 단계에서부터 “이 Spec을 읽은 LLM이 올바르게 동작할 수 있는가?”를 기준으로 삼아야 합니다.
아래는 즉시 체크리스트로 활용할 수 있는 AI-Native API 설계 5계명입니다.
operationId에 동사+목적어+조건을 서술형으로 작성했는가?description에 “언제 호출하는가”, “선행 조건”, “후속 행동”이 포함되어 있는가?- 선택 파라미터를 최소화하고, 의존 관계 파라미터를 하위 객체로 묶었는가?
enum에 각 값의 의미 설명이 포함되어 있는가?- 에러 응답에
retryable,suggestedAction,details[].hint가 포함되어 있는가?
AI 에이전트 개발 최적 언어 Go(Golang): 전문가들이 선택하는 이유
Go가 AI 에이전트 개발 최적 언어로 부상한 5가지 이유. LLM 코드 생성 성공률, 빠른 컴파일, 단순한 문법 등 Python·TypeScript 대비 Go의 압도적 강점과 실전 도입 가이드.
/blog/golang-ai-agent-best-language-2026/OpenAPI 템플릿 — 바로 복사해서 쓰는 AI-Native 명세서
아래 YAML 템플릿은 이 글에서 다룬 모든 원칙을 적용한 출발점입니다. 사내 API 명세서를 업데이트하는 기준으로 사용하세요.
openapi: 3.1.0
info:
title: AI-Native API Template
version: 1.0.0
description: >
이 명세서는 LLM 에이전트가 소비자인 API를 위한 템플릿입니다.
모든 operationId와 description은 에이전트의 판단을 돕도록 작성되었습니다.
paths:
/resources/{resourceId}:
get:
operationId: get_specific_resource_by_id_for_detail_view
summary: ID로 특정 리소스의 상세 정보를 조회합니다.
description: >
단일 리소스의 전체 상세 정보를 반환합니다.
리소스 목록 조회 후 특정 항목의 세부 정보가 필요할 때 호출하세요.
존재하지 않는 ID 요청 시 404를 반환하며, 이 경우 목록을 다시 조회한 후
유효한 ID를 확인하세요.
parameters:
- name: resourceId
in: path
required: true
schema:
type: string
format: uuid
description: "리소스 고유 식별자. GET /resources 응답의 id 필드 값"
responses:
'200':
description: 성공적으로 리소스를 조회했습니다.
'404':
description: 리소스를 찾을 수 없습니다.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
ErrorResponse:
type: object
required: [error]
properties:
error:
type: object
required: [code, message, retryable]
properties:
code:
type: string
enum:
- VALIDATION_ERROR
- NOT_FOUND
- BUSINESS_RULE_VIOLATION
- RATE_LIMIT_EXCEEDED
message:
type: string
description: 사람이 읽을 수 있는 에러 설명
retryable:
type: boolean
description: true이면 파라미터 수정 후 재요청 가능
suggestedAction:
type: string
description: LLM에게 다음 행동을 안내하는 구체적인 지시
details:
type: array
items:
type: object
properties:
field:
type: string
description: 오류가 발생한 필드 경로 (예: dateRange.endDate)
issue:
type: string
hint:
type: string
description: 해당 필드의 올바른 값 형식 또는 수정 방법
자주 묻는 질문 (FAQ)
Q. 기존 API를 수정하지 않고 AI 에이전트에게 노출할 방법이 있나요?
API Gateway 레이어에서 AI 전용 Spec 오버레이(OpenAPI Overlay)를 적용하거나, 에이전트 전용 Wrapper 엔드포인트를 별도로 만드는 방법이 있습니다. 기존 서비스의 스키마를 변경하지 않고 description과 operationId만 AI 친화적으로 보강하는 것이 단기적으로 가장 빠른 접근입니다.
Q. MCP와 OpenAPI Spec은 어떤 관계인가요?
MCP는 LLM과 외부 도구 사이의 연동 프로토콜이고, OpenAPI는 HTTP API를 기술하는 Spec 형식입니다. MCP 서버를 통해 OpenAPI Spec을 에이전트에게 제공할 수 있으며, openapi-to-mcp 같은 도구로 자동 변환도 가능합니다. 단, 변환 후에도 description 품질은 사람이 직접 검토해야 합니다.
Q. description을 너무 길게 쓰면 컨텍스트 토큰을 낭비하지 않나요?
맞습니다. 자주 호출되는 핵심 엔드포인트에 집중하고, 나머지는 summary 수준으로 유지하는 것이 현실적입니다. 에이전트에 노출할 엔드포인트 수 자체를 최소화하는 것도 유효한 전략입니다.