API AI Agent
API Agent - Spring Boot MCP server for natural language API queries (ported from Python FastMCP)
Ask AI about API AI Agent
Powered by Claude Β· Grounded in docs
I know everything about API AI Agent. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
API AI Agent
μμ°μ΄ μ§μλ₯Ό GraphQL/REST API νΈμΆλ‘ λ³ννλ MCP(Model Context Protocol) μλ²μ λλ€. Agodaμ μ€νμμ€ νλ‘μ νΈ api-agentμμ μκ°μ λ°μ, Spring Boot μνκ³μ λ§κ² μ¬μ€κ³ν νλ‘μ νΈμ λλ€.
κΈ°μ μ€ν
| λΆλ₯ | κΈ°μ |
|---|---|
| Runtime | Java 21 (Corretto), Virtual Threads |
| Framework | Spring Boot 3.4.4, Spring AI 1.0.3 |
| MCP | Spring AI MCP Server (WebMVC, Streamable HTTP) |
| LLM | OpenAI ChatClient (gpt-4o κΈ°λ³Έ) |
| SQL νμ²λ¦¬ | DuckDB JDBC 1.2.1 |
| νΌμ§ λ§€μΉ | FuzzyWuzzy 1.4.0 |
| Observability | Micrometer + OpenTelemetry |
| Build | Gradle 8.12 (Kotlin DSL) |
μ£Όμ κΈ°λ₯
- MCP μλ² β Streamable HTTP μ μ‘ λ°©μμΌλ‘ MCP λꡬλ₯Ό μ 곡
- λ©ν°ν΄ μμ΄μ νΈ β LLM κΈ°λ° μ΅λ 30ν΄ λν 루ν (AgentRunner)
- GraphQL μ§μ β μ€ν€λ§ μΈνΈλ‘μ€νμ , 쿼리 μ€ν (mutation μ°¨λ¨)
- REST μ§μ β OpenAPI μ€ν€λ§ λ‘λ©, API νΈμΆ (unsafe λ©μλ μ°¨λ¨)
- DuckDB SQL νμ²λ¦¬ β API μλ΅μ DuckDBμ λ‘λνμ¬ SQLλ‘ κ°κ³΅
- λ μνΌ μΊμ± β λ°λ³΅ μ§μλ₯Ό fuzzy λ§€μΉμΌλ‘ μΊμ±/μ¬μ¬μ©
- λμ λꡬ λ€μ΄λ° β μμ² μ»¨ν μ€νΈ κΈ°λ° MCP λꡬ μ΄λ¦ μλ μμ±
ν¨ν€μ§ ꡬ쑰
src/main/java/com/apiagent/
βββ config/ # μ€μ (Properties, CORS, RestClient, MCP, GlobalExceptionHandler)
βββ context/ # μμ² μ»¨ν
μ€νΈ (RequestContext record, Filter, ThreadLocal holder)
βββ client/
β βββ graphql/ # GraphQL ν΄λΌμ΄μΈνΈ (mutation μ°¨λ¨)
β βββ rest/ # REST ν΄λΌμ΄μΈνΈ + OpenAPI μ€ν€λ§ λ‘λ
βββ executor/ # DuckDB SQL μ€νκΈ°
βββ agent/ # μμ΄μ νΈ μμ€ν
(AgentRunner, GraphQL/REST μλΉμ€, λꡬ)
βββ mcp/ # MCP λꡬ μ 곡 (McpToolProvider, ToolNamingService)
βββ recipe/ # λ μνΌ μΊμ± (Store, Extractor, Runner, TemplateRenderer)
βββ util/ # CSV λ³ν, μλ΅ μ μ
βββ tracing/ # OpenTelemetry μ€μ
μ¬μ μꡬμ¬ν
- Java 21+
- Gradle 8.x (λλ ν¬ν¨λ Gradle Wrapper μ¬μ©)
- OpenAI API ν€
λΉλ & μ€ν
# λΉλ
./gradlew build
# μ€ν
./gradlew bootRun
# JAR μ§μ μ€ν
java --enable-preview -jar build/libs/api-ai-agent-0.1.0.jar
Docker
# λΉλ ν Docker μ΄λ―Έμ§ μμ±
./gradlew build
docker compose up --build
# λλ μ§μ
docker build -t api-ai-agent .
docker run -p 3000:3000 \
-e OPENAI_API_KEY=sk-... \
api-ai-agent
νκ²½ λ³μ
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
OPENAI_API_KEY | OpenAI API ν€ (νμ) | β |
OPENAI_BASE_URL | OpenAI API λ² μ΄μ€ URL | https://api.openai.com/v1 |
API_AGENT_PORT | μλ² ν¬νΈ | 3000 |
API_AGENT_MCP_NAME | MCP μλ² μ΄λ¦ | API Agent |
API_AGENT_MODEL_NAME | μ¬μ©ν LLM λͺ¨λΈ | gpt-4o |
API_AGENT_REASONING_EFFORT | μΆλ‘ λ Έλ ₯ μμ€ | β |
API_AGENT_MAX_AGENT_TURNS | μ΅λ μμ΄μ νΈ ν΄ μ | 30 |
API_AGENT_MAX_RESPONSE_CHARS | μ΅λ μλ΅ λ¬Έμ μ | 50000 |
API_AGENT_MAX_SCHEMA_CHARS | μ΅λ μ€ν€λ§ λ¬Έμ μ | 32000 |
API_AGENT_MAX_PREVIEW_ROWS | 미리보기 μ΅λ ν μ | 10 |
API_AGENT_MAX_TOOL_RESPONSE_CHARS | λꡬ μλ΅ μ΅λ λ¬Έμ μ | 32000 |
API_AGENT_MAX_POLLS | μ΅λ ν΄λ§ νμ | 20 |
API_AGENT_DEFAULT_POLL_DELAY_MS | ν΄λ§ μ§μ°(ms) | 3000 |
API_AGENT_DEBUG | λλ²κ·Έ λͺ¨λ | false |
API_AGENT_CORS_ALLOWED_ORIGINS | CORS νμ© μ€λ¦¬μ§ | * |
API_AGENT_ENABLE_RECIPES | λ μνΌ μΊμ± νμ±ν | true |
API_AGENT_RECIPE_CACHE_SIZE | λ μνΌ μΊμ ν¬κΈ° | 64 |
API_AGENT_LOG_LEVEL | λ‘κ·Έ λ 벨 | INFO |
MCP ν΄λΌμ΄μΈνΈ μ°κ²°
Claude Desktop μ€μ μμ
claude_desktop_config.jsonμ μΆκ°:
{
"mcpServers": {
"api-agent": {
"url": "http://localhost:3000/mcp"
}
}
}
μμ² ν€λ
MCP μμ² μ λ€μ HTTP ν€λλ₯Ό ν΅ν΄ λμ APIλ₯Ό μ§μ ν©λλ€:
| ν€λ | νμ | μ€λͺ |
|---|---|---|
X-Target-URL | O | λμ API μλν¬μΈνΈ URL |
X-API-Type | O | API μ ν (graphql λλ rest) |
X-Target-Headers | λμ APIλ‘ μ λ¬ν ν€λ (JSON) | |
X-Allow-Unsafe-Paths | REST unsafe λ©μλ νμ© κ²½λ‘ λͺ©λ‘ (JSON λ°°μ΄) | |
X-Base-URL | REST API λ² μ΄μ€ URL | |
X-Include-Result | κ²°κ³Ό ν¬ν¨ μ¬λΆ (true/false) | |
X-Poll-Paths | ν΄λ§ λμ κ²½λ‘ λͺ©λ‘ (JSON λ°°μ΄) |
ν μ€νΈ
./gradlew test
ν μ€νΈ νμΌ 11κ°, μ΄ 52κ° ν μ€νΈ μΌμ΄μ€κ° ν¬ν¨λμ΄ μμ΅λλ€.
λΌμ΄μ μ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ₯Ό λ°λ¦ λλ€.
κ°μ¬μ κΈ
μ΄ νλ‘μ νΈλ Agodaμ api-agentμμ μκ°μ λ°μμ΅λλ€.
