design-all-api-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/tools/search-api.ts","../src/catalog/apis.json","../src/catalog/intents.json","../src/catalog/loader.ts","../src/tools/get-api-details.ts","../src/tools/check-api-key.ts","../src/tools/generate-api-code.ts","../src/tools/test-api-connection.ts","../src/resources/guide-content.ts","../src/resources/setup-guides.ts","../src/prompts/discover-api.ts","../src/prompts/setup-api-key.ts","../src/prompts/integrate-api.ts","../src/prompts/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { searchApiSchema, searchApi } from \"./tools/search-api.js\";\nimport { getApiDetailsSchema, getApiDetails } from \"./tools/get-api-details.js\";\nimport { checkApiKeySchema, checkApiKey } from \"./tools/check-api-key.js\";\nimport { generateApiCodeSchema, generateApiCode } from \"./tools/generate-api-code.js\";\nimport { testApiConnectionSchema, testApiConnection } from \"./tools/test-api-connection.js\";\nimport { registerResources } from \"./resources/setup-guides.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\n\nconst server = new McpServer({\n name: \"design-all-api-mcp\",\n version: \"0.1.0\",\n});\n\n// Tool 1: Search APIs by intent or filters\nserver.tool(\n \"search_api\",\n \"의도나 키워드로 AI API를 검색합니다. 디자이너의 자연어 표현(한국어/영어)을 이해합니다. Search AI APIs by intent or keywords. Understands natural language in Korean and English.\",\n searchApiSchema,\n async (params) => searchApi(params),\n);\n\n// Tool 2: Get API details\nserver.tool(\n \"get_api_details\",\n \"특정 API의 상세 정보를 조회합니다 (인증, 가격, 엔드포인트, 사용 사례 등). Get detailed information about a specific API including auth, pricing, endpoints, and use cases.\",\n getApiDetailsSchema,\n async (params) => getApiDetails(params),\n);\n\n// Tool 3: Check API key\nserver.tool(\n \"check_api_key\",\n \"API 키 설정 여부를 확인하고, 선택적으로 유효성을 검증합니다. 미설정 시 발급 가이드를 안내합니다. Check if an API key is configured and optionally validate it. Provides setup guide if not configured.\",\n checkApiKeySchema,\n async (params) => checkApiKey(params),\n);\n\n// Tool 4: Generate API code\nserver.tool(\n \"generate_api_code\",\n \"선택한 API에 대한 TypeScript 코드를 생성합니다 (fetch 또는 SDK 방식). 패키지 설치 명령어도 포함됩니다. Generate TypeScript code for the selected API (fetch or SDK style). Includes package install commands.\",\n generateApiCodeSchema,\n async (params) => generateApiCode(params as any),\n);\n\n// Tool 5: Test API connection\nserver.tool(\n \"test_api_connection\",\n \"실제 API를 호출하여 연결을 테스트합니다. 최소 비용으로 인증과 네트워크 상태를 확인합니다. Test API connection with a real API call. Verifies auth and network with minimal cost.\",\n testApiConnectionSchema,\n async (params) => testApiConnection(params),\n);\n\n// Register resources (setup guides)\nregisterResources(server);\n\n// Register prompts (workflow prompts)\nregisterPrompts(server);\n\n// Start server\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n process.stderr.write(\"[design-all-api-mcp] Server started\\n\");\n}\n\nmain().catch((error) => {\n process.stderr.write(`[design-all-api-mcp] Fatal error: ${error}\\n`);\n process.exit(1);\n});\n","import { z } from \"zod/v3\";\nimport { searchApis } from \"../catalog/loader.js\";\n\nexport const searchApiSchema = {\n query: z.string().optional().describe(\"자연어로 원하는 기능을 설명하세요 (예: '이미지로 영상 만들기', 'image to video')\"),\n provider: z.enum([\"google\", \"openai\"]).optional().describe(\"API 제공자로 필터링 (google 또는 openai)\"),\n category: z.string().optional().describe(\"카테고리로 필터링 (예: video-generation, image-generation, text-generation, vision, audio)\"),\n inputType: z.enum([\"text\", \"image\", \"audio\", \"video\"]).optional().describe(\"입력 타입으로 필터링\"),\n outputType: z.enum([\"text\", \"image\", \"video\"]).optional().describe(\"출력 타입으로 필터링\"),\n};\n\nexport async function searchApi(params: {\n query?: string;\n provider?: string;\n category?: string;\n inputType?: string;\n outputType?: string;\n}) {\n const results = searchApis({\n query: params.query,\n provider: params.provider as any,\n category: params.category,\n inputType: params.inputType as any,\n outputType: params.outputType as any,\n });\n\n if (results.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"조건에 맞는 API를 찾을 수 없습니다. 다른 키워드나 조건으로 검색해보세요.\\n\\n💡 검색 예시:\\n- \\\"이미지로 영상 만들기\\\"\\n- \\\"이미지 생성\\\"\\n- \\\"텍스트 생성\\\"\\n- outputType: \\\"video\\\"\",\n }],\n };\n }\n\n const text = results.map((api) => {\n const inputs = api.inputTypes.join(\"+\");\n return `**${api.name.ko}** (${api.name.en})\\n ID: \\`${api.id}\\`\\n ${api.provider} / ${api.model} | ${inputs} → ${api.outputType} | 난이도: ${api.difficulty}\\n ${api.description.ko}`;\n }).join(\"\\n\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text: `${results.length}개의 API를 찾았습니다:\\n\\n${text}\\n\\n---\\n💡 상세 정보를 보려면 \\`get_api_details\\` 도구에 API ID를 전달하세요.`,\n }],\n };\n}\n","[\n {\n \"id\": \"google-veo-text-to-video\",\n \"provider\": \"google\",\n \"model\": \"Veo 3.1\",\n \"name\": {\n \"ko\": \"Veo 텍스트→영상 생성\",\n \"en\": \"Veo Text-to-Video\"\n },\n \"description\": {\n \"ko\": \"텍스트 프롬프트로 고품질 영상을 생성합니다. 8초까지 가능하며, 1080p 해상도를 지원합니다.\",\n \"en\": \"Generate high-quality videos from text prompts. Up to 8 seconds, supports 1080p resolution.\"\n },\n \"category\": \"video-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"video\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-second\",\n \"detail\": {\n \"ko\": \"생성된 영상 초당 과금. 8초 영상 약 $0.35\",\n \"en\": \"Charged per second of generated video. ~$0.35 for 8s video\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/veo-3.1:predictLongRunning\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"formats\": [\"mp4\"],\n \"resolutions\": [\"720p\", \"1080p\"],\n \"maxDuration\": \"8s\"\n },\n \"useCases\": [\n { \"ko\": \"소셜 미디어 쇼트 영상\", \"en\": \"Social media short videos\" },\n { \"ko\": \"제품 프로모션 클립\", \"en\": \"Product promotion clips\" },\n { \"ko\": \"컨셉 영상 프로토타입\", \"en\": \"Concept video prototyping\" }\n ],\n \"tags\": [\"video\", \"text-to-video\", \"generative\", \"google\", \"veo\"],\n \"relatedApis\": [\"google-veo-image-to-video\", \"google-veo-video-extend\"]\n },\n {\n \"id\": \"google-veo-image-to-video\",\n \"provider\": \"google\",\n \"model\": \"Veo 3.1\",\n \"name\": {\n \"ko\": \"Veo 이미지→영상 생성\",\n \"en\": \"Veo Image-to-Video\"\n },\n \"description\": {\n \"ko\": \"이미지와 텍스트 프롬프트를 조합해 영상을 생성합니다. 이미지를 움직이게 만들 수 있습니다.\",\n \"en\": \"Generate videos from an image + text prompt. Animate still images into video.\"\n },\n \"category\": \"video-generation\",\n \"inputTypes\": [\"image\", \"text\"],\n \"outputType\": \"video\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-second\",\n \"detail\": {\n \"ko\": \"생성된 영상 초당 과금. 8초 영상 약 $0.35\",\n \"en\": \"Charged per second of generated video. ~$0.35 for 8s video\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/veo-3.1:predictLongRunning\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"formats\": [\"mp4\"],\n \"resolutions\": [\"720p\", \"1080p\"],\n \"maxDuration\": \"8s\"\n },\n \"useCases\": [\n { \"ko\": \"이미지 보간 영상 생성\", \"en\": \"Image interpolation video\" },\n { \"ko\": \"사진을 움직이는 영상으로\", \"en\": \"Animate photos into video\" },\n { \"ko\": \"제품 이미지 모션 그래픽\", \"en\": \"Product image motion graphics\" }\n ],\n \"tags\": [\"video\", \"image-to-video\", \"generative\", \"google\", \"veo\", \"animation\"],\n \"relatedApis\": [\"google-veo-text-to-video\", \"google-veo-video-extend\"]\n },\n {\n \"id\": \"google-veo-video-extend\",\n \"provider\": \"google\",\n \"model\": \"Veo 3.1\",\n \"name\": {\n \"ko\": \"Veo 영상 연장\",\n \"en\": \"Veo Video Extension\"\n },\n \"description\": {\n \"ko\": \"기존 영상을 텍스트 프롬프트로 연장합니다. 영상의 다음 장면을 AI가 생성합니다.\",\n \"en\": \"Extend existing videos with text prompts. AI generates the next scene.\"\n },\n \"category\": \"video-generation\",\n \"inputTypes\": [\"video\", \"text\"],\n \"outputType\": \"video\",\n \"difficulty\": \"intermediate\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-second\",\n \"detail\": {\n \"ko\": \"연장된 영상 초당 과금\",\n \"en\": \"Charged per second of extended video\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/veo-3.1:predictLongRunning\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"formats\": [\"mp4\"],\n \"resolutions\": [\"720p\", \"1080p\"],\n \"maxDuration\": \"8s\"\n },\n \"useCases\": [\n { \"ko\": \"영상 클립 길이 연장\", \"en\": \"Extend video clip length\" },\n { \"ko\": \"스토리 연결 영상 제작\", \"en\": \"Create story continuation videos\" }\n ],\n \"tags\": [\"video\", \"video-extend\", \"generative\", \"google\", \"veo\"],\n \"relatedApis\": [\"google-veo-text-to-video\", \"google-veo-image-to-video\"]\n },\n {\n \"id\": \"google-gemini-text\",\n \"provider\": \"google\",\n \"model\": \"Gemini 2.0 Flash\",\n \"name\": {\n \"ko\": \"Gemini 텍스트 생성\",\n \"en\": \"Gemini Text Generation\"\n },\n \"description\": {\n \"ko\": \"텍스트 프롬프트로 텍스트를 생성합니다. 카피라이팅, 아이디어 생성, 코드 작성 등에 활용.\",\n \"en\": \"Generate text from prompts. Use for copywriting, ideation, code generation, and more.\"\n },\n \"category\": \"text-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"text\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-token\",\n \"detail\": {\n \"ko\": \"입력 100만 토큰당 ~$0.10, 출력 100만 토큰당 ~$0.40. 매우 저렴.\",\n \"en\": \"~$0.10/1M input tokens, ~$0.40/1M output tokens. Very affordable.\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/gemini-2.0-flash:generateContent\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"maxTokens\": 8192\n },\n \"useCases\": [\n { \"ko\": \"마케팅 카피 생성\", \"en\": \"Generate marketing copy\" },\n { \"ko\": \"디자인 컨셉 텍스트 작성\", \"en\": \"Write design concept text\" },\n { \"ko\": \"다국어 번역\", \"en\": \"Multilingual translation\" }\n ],\n \"tags\": [\"text\", \"text-to-text\", \"generative\", \"google\", \"gemini\", \"llm\"],\n \"relatedApis\": [\"google-gemini-vision\", \"google-gemini-image-gen\", \"openai-gpt-text\"]\n },\n {\n \"id\": \"google-gemini-vision\",\n \"provider\": \"google\",\n \"model\": \"Gemini 2.0 Flash\",\n \"name\": {\n \"ko\": \"Gemini 이미지 분석\",\n \"en\": \"Gemini Vision Analysis\"\n },\n \"description\": {\n \"ko\": \"이미지를 분석하고 텍스트로 설명합니다. 디자인 피드백, UI 분석, 이미지 설명 등에 활용.\",\n \"en\": \"Analyze images and describe in text. Use for design feedback, UI analysis, image descriptions.\"\n },\n \"category\": \"vision\",\n \"inputTypes\": [\"image\", \"text\"],\n \"outputType\": \"text\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-token\",\n \"detail\": {\n \"ko\": \"이미지당 약 258~1032 토큰 소모. 매우 저렴.\",\n \"en\": \"~258-1032 tokens per image. Very affordable.\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/gemini-2.0-flash:generateContent\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"maxTokens\": 8192\n },\n \"useCases\": [\n { \"ko\": \"디자인 시안 피드백 받기\", \"en\": \"Get feedback on design mockups\" },\n { \"ko\": \"UI 스크린샷 분석\", \"en\": \"Analyze UI screenshots\" },\n { \"ko\": \"이미지 캡션 자동 생성\", \"en\": \"Auto-generate image captions\" }\n ],\n \"tags\": [\"vision\", \"image-to-text\", \"analysis\", \"google\", \"gemini\"],\n \"relatedApis\": [\"google-gemini-text\", \"openai-gpt-vision\"]\n },\n {\n \"id\": \"google-gemini-image-gen\",\n \"provider\": \"google\",\n \"model\": \"Gemini 2.0 Flash\",\n \"name\": {\n \"ko\": \"Gemini 이미지 생성\",\n \"en\": \"Gemini Image Generation\"\n },\n \"description\": {\n \"ko\": \"텍스트 프롬프트로 이미지를 생성합니다. Gemini의 네이티브 이미지 생성 기능.\",\n \"en\": \"Generate images from text prompts. Gemini's native image generation capability.\"\n },\n \"category\": \"image-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"image\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-image\",\n \"detail\": {\n \"ko\": \"이미지 생성 비용은 Gemini API 토큰 비용에 포함\",\n \"en\": \"Image generation cost included in Gemini API token pricing\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/gemini-2.0-flash:generateContent\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"formats\": [\"png\"],\n \"resolutions\": [\"1024x1024\"]\n },\n \"useCases\": [\n { \"ko\": \"컨셉 아트 생성\", \"en\": \"Generate concept art\" },\n { \"ko\": \"디자인 에셋 초안 생성\", \"en\": \"Create design asset drafts\" },\n { \"ko\": \"소셜 미디어 이미지 제작\", \"en\": \"Create social media images\" }\n ],\n \"tags\": [\"image\", \"text-to-image\", \"generative\", \"google\", \"gemini\"],\n \"relatedApis\": [\"openai-gpt-image\", \"openai-dall-e-3\"]\n },\n {\n \"id\": \"google-gemini-audio\",\n \"provider\": \"google\",\n \"model\": \"Gemini 2.0 Flash\",\n \"name\": {\n \"ko\": \"Gemini 오디오 분석\",\n \"en\": \"Gemini Audio Analysis\"\n },\n \"description\": {\n \"ko\": \"오디오 파일을 분석하고 텍스트로 변환합니다. 음성 전사, 오디오 설명 등에 활용.\",\n \"en\": \"Analyze audio files and convert to text. Use for transcription, audio description.\"\n },\n \"category\": \"audio\",\n \"inputTypes\": [\"audio\", \"text\"],\n \"outputType\": \"text\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"GOOGLE_AI_API_KEY\",\n \"setupGuide\": \"guide://setup/google-ai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-token\",\n \"detail\": {\n \"ko\": \"오디오 초당 약 25 토큰 소모. 저렴.\",\n \"en\": \"~25 tokens per second of audio. Affordable.\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://generativelanguage.googleapis.com\",\n \"path\": \"/v1beta/models/gemini-2.0-flash:generateContent\",\n \"method\": \"POST\",\n \"sdkPackage\": \"@google/genai\",\n \"sdkImport\": \"GoogleGenAI\"\n },\n \"output\": {\n \"maxTokens\": 8192\n },\n \"useCases\": [\n { \"ko\": \"회의 녹음 텍스트 전사\", \"en\": \"Transcribe meeting recordings\" },\n { \"ko\": \"팟캐스트 내용 요약\", \"en\": \"Summarize podcast content\" },\n { \"ko\": \"사운드 디자인 분석\", \"en\": \"Analyze sound design\" }\n ],\n \"tags\": [\"audio\", \"audio-to-text\", \"transcription\", \"google\", \"gemini\"],\n \"relatedApis\": [\"google-gemini-text\", \"google-gemini-vision\"]\n },\n {\n \"id\": \"openai-gpt-text\",\n \"provider\": \"openai\",\n \"model\": \"GPT-4o\",\n \"name\": {\n \"ko\": \"GPT-4o 텍스트 생성\",\n \"en\": \"GPT-4o Text Generation\"\n },\n \"description\": {\n \"ko\": \"GPT-4o 모델로 텍스트를 생성합니다. 카피라이팅, 코드, 분석 등 다양한 용도.\",\n \"en\": \"Generate text with GPT-4o. Versatile for copywriting, code, analysis, and more.\"\n },\n \"category\": \"text-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"text\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-token\",\n \"detail\": {\n \"ko\": \"입력 100만 토큰당 $2.50, 출력 100만 토큰당 $10.00\",\n \"en\": \"$2.50/1M input tokens, $10.00/1M output tokens\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/chat/completions\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"maxTokens\": 16384\n },\n \"useCases\": [\n { \"ko\": \"고품질 카피라이팅\", \"en\": \"High-quality copywriting\" },\n { \"ko\": \"복잡한 분석 작업\", \"en\": \"Complex analysis tasks\" },\n { \"ko\": \"코드 생성/리뷰\", \"en\": \"Code generation/review\" }\n ],\n \"tags\": [\"text\", \"text-to-text\", \"generative\", \"openai\", \"gpt\", \"llm\"],\n \"relatedApis\": [\"google-gemini-text\", \"openai-gpt-vision\"]\n },\n {\n \"id\": \"openai-gpt-vision\",\n \"provider\": \"openai\",\n \"model\": \"GPT-4o\",\n \"name\": {\n \"ko\": \"GPT-4o 이미지 분석\",\n \"en\": \"GPT-4o Vision Analysis\"\n },\n \"description\": {\n \"ko\": \"이미지를 분석하고 텍스트로 설명합니다. 디자인 리뷰, UI 분석 등에 활용.\",\n \"en\": \"Analyze images and describe in text. Use for design review, UI analysis.\"\n },\n \"category\": \"vision\",\n \"inputTypes\": [\"image\", \"text\"],\n \"outputType\": \"text\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-token\",\n \"detail\": {\n \"ko\": \"이미지 크기에 따라 토큰 소모. 일반적인 이미지 약 765 토큰.\",\n \"en\": \"Token usage varies by image size. ~765 tokens for typical image.\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/chat/completions\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"maxTokens\": 16384\n },\n \"useCases\": [\n { \"ko\": \"디자인 시안 리뷰\", \"en\": \"Review design mockups\" },\n { \"ko\": \"경쟁사 UI 분석\", \"en\": \"Analyze competitor UIs\" },\n { \"ko\": \"접근성 검토\", \"en\": \"Accessibility review\" }\n ],\n \"tags\": [\"vision\", \"image-to-text\", \"analysis\", \"openai\", \"gpt\"],\n \"relatedApis\": [\"openai-gpt-text\", \"google-gemini-vision\"]\n },\n {\n \"id\": \"openai-gpt-image\",\n \"provider\": \"openai\",\n \"model\": \"GPT Image 1\",\n \"name\": {\n \"ko\": \"GPT 이미지 생성\",\n \"en\": \"GPT Image Generation\"\n },\n \"description\": {\n \"ko\": \"GPT Image 1 모델로 이미지를 생성하거나 편집합니다. 텍스트 렌더링 품질이 뛰어남.\",\n \"en\": \"Generate or edit images with GPT Image 1. Excellent text rendering quality.\"\n },\n \"category\": \"image-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"image\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-image\",\n \"detail\": {\n \"ko\": \"1024x1024 이미지당 약 $0.04 (low quality) ~ $0.17 (high quality)\",\n \"en\": \"~$0.04 (low) to $0.17 (high) per 1024x1024 image\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/images/generations\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"formats\": [\"png\", \"webp\"],\n \"resolutions\": [\"1024x1024\", \"1536x1024\", \"1024x1536\"]\n },\n \"useCases\": [\n { \"ko\": \"텍스트 포함 이미지 생성\", \"en\": \"Generate images with text\" },\n { \"ko\": \"디자인 에셋 제작\", \"en\": \"Create design assets\" },\n { \"ko\": \"마케팅 배너 생성\", \"en\": \"Generate marketing banners\" }\n ],\n \"tags\": [\"image\", \"text-to-image\", \"generative\", \"openai\", \"gpt-image\"],\n \"relatedApis\": [\"openai-dall-e-3\", \"google-gemini-image-gen\"]\n },\n {\n \"id\": \"openai-dall-e-3\",\n \"provider\": \"openai\",\n \"model\": \"DALL-E 3\",\n \"name\": {\n \"ko\": \"DALL-E 3 이미지 생성\",\n \"en\": \"DALL-E 3 Image Generation\"\n },\n \"description\": {\n \"ko\": \"DALL-E 3 모델로 고품질 이미지를 생성합니다. 프롬프트 이해도가 높고 창의적 결과물.\",\n \"en\": \"Generate high-quality images with DALL-E 3. Excellent prompt understanding and creative results.\"\n },\n \"category\": \"image-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"image\",\n \"difficulty\": \"beginner\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-image\",\n \"detail\": {\n \"ko\": \"1024x1024 이미지당 $0.04 (standard) ~ $0.08 (hd)\",\n \"en\": \"$0.04 (standard) to $0.08 (hd) per 1024x1024 image\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/images/generations\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"formats\": [\"png\"],\n \"resolutions\": [\"1024x1024\", \"1792x1024\", \"1024x1792\"]\n },\n \"useCases\": [\n { \"ko\": \"컨셉 아트 생성\", \"en\": \"Generate concept art\" },\n { \"ko\": \"일러스트레이션 제작\", \"en\": \"Create illustrations\" },\n { \"ko\": \"소셜 미디어 비주얼\", \"en\": \"Social media visuals\" }\n ],\n \"tags\": [\"image\", \"text-to-image\", \"generative\", \"openai\", \"dall-e\"],\n \"relatedApis\": [\"openai-gpt-image\", \"google-gemini-image-gen\"]\n },\n {\n \"id\": \"openai-sora-text-to-video\",\n \"provider\": \"openai\",\n \"model\": \"Sora\",\n \"name\": {\n \"ko\": \"Sora 텍스트→영상 생성\",\n \"en\": \"Sora Text-to-Video\"\n },\n \"description\": {\n \"ko\": \"텍스트 프롬프트로 영상을 생성합니다. 최대 20초 길이, 1080p 해상도 지원.\",\n \"en\": \"Generate videos from text prompts. Up to 20 seconds, supports 1080p resolution.\"\n },\n \"category\": \"video-generation\",\n \"inputTypes\": [\"text\"],\n \"outputType\": \"video\",\n \"difficulty\": \"intermediate\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-video\",\n \"detail\": {\n \"ko\": \"해상도와 길이에 따라 과금. 480p 5초 약 $0.25, 1080p 20초 약 $2.00\",\n \"en\": \"Priced by resolution & duration. ~$0.25 for 480p 5s, ~$2.00 for 1080p 20s\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/video/generations\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"formats\": [\"mp4\"],\n \"resolutions\": [\"480p\", \"720p\", \"1080p\"],\n \"maxDuration\": \"20s\"\n },\n \"useCases\": [\n { \"ko\": \"광고/프로모션 영상\", \"en\": \"Ad/promotion videos\" },\n { \"ko\": \"소셜 미디어 콘텐츠\", \"en\": \"Social media content\" },\n { \"ko\": \"스토리보드 영상화\", \"en\": \"Storyboard to video\" }\n ],\n \"tags\": [\"video\", \"text-to-video\", \"generative\", \"openai\", \"sora\"],\n \"relatedApis\": [\"openai-sora-image-to-video\", \"google-veo-text-to-video\"]\n },\n {\n \"id\": \"openai-sora-image-to-video\",\n \"provider\": \"openai\",\n \"model\": \"Sora\",\n \"name\": {\n \"ko\": \"Sora 이미지→영상 생성\",\n \"en\": \"Sora Image-to-Video\"\n },\n \"description\": {\n \"ko\": \"이미지와 텍스트 프롬프트로 영상을 생성합니다. 정지 이미지를 동적 영상으로 변환.\",\n \"en\": \"Generate videos from image + text prompt. Transform still images into dynamic video.\"\n },\n \"category\": \"video-generation\",\n \"inputTypes\": [\"image\", \"text\"],\n \"outputType\": \"video\",\n \"difficulty\": \"intermediate\",\n \"auth\": {\n \"type\": \"api-key\",\n \"envVar\": \"OPENAI_API_KEY\",\n \"setupGuide\": \"guide://setup/openai-api-key\"\n },\n \"pricing\": {\n \"model\": \"per-video\",\n \"detail\": {\n \"ko\": \"해상도와 길이에 따라 과금. 이미지 입력 추가 비용 없음.\",\n \"en\": \"Priced by resolution & duration. No extra cost for image input.\"\n }\n },\n \"endpoint\": {\n \"baseUrl\": \"https://api.openai.com\",\n \"path\": \"/v1/video/generations\",\n \"method\": \"POST\",\n \"sdkPackage\": \"openai\",\n \"sdkImport\": \"OpenAI\"\n },\n \"output\": {\n \"formats\": [\"mp4\"],\n \"resolutions\": [\"480p\", \"720p\", \"1080p\"],\n \"maxDuration\": \"20s\"\n },\n \"useCases\": [\n { \"ko\": \"제품 사진 애니메이션\", \"en\": \"Product photo animation\" },\n { \"ko\": \"디자인 시안 모션화\", \"en\": \"Animate design mockups\" },\n { \"ko\": \"이미지 보간 영상\", \"en\": \"Image interpolation video\" }\n ],\n \"tags\": [\"video\", \"image-to-video\", \"generative\", \"openai\", \"sora\", \"animation\"],\n \"relatedApis\": [\"openai-sora-text-to-video\", \"google-veo-image-to-video\"]\n }\n]\n","[\n {\n \"id\": \"create-video-from-text\",\n \"intent\": {\n \"ko\": [\"텍스트로 영상 만들기\", \"글로 영상 생성\", \"프롬프트로 동영상\", \"텍스트 기반 영상\", \"AI 영상 생성\"],\n \"en\": [\"text to video\", \"create video from text\", \"generate video from prompt\", \"AI video generation\"]\n },\n \"matchingApis\": [\"google-veo-text-to-video\", \"openai-sora-text-to-video\"]\n },\n {\n \"id\": \"create-video-from-image\",\n \"intent\": {\n \"ko\": [\"이미지로 영상 만들기\", \"사진으로 동영상 생성\", \"이미지 보간 영상\", \"사진을 움직이게\", \"이미지 애니메이션\"],\n \"en\": [\"image to video\", \"animate image\", \"create video from image\", \"photo to video\", \"image animation\"]\n },\n \"matchingApis\": [\"google-veo-image-to-video\", \"openai-sora-image-to-video\"]\n },\n {\n \"id\": \"extend-video\",\n \"intent\": {\n \"ko\": [\"영상 연장\", \"동영상 늘리기\", \"영상 길이 연장\", \"비디오 확장\"],\n \"en\": [\"extend video\", \"lengthen video\", \"continue video\", \"video extension\"]\n },\n \"matchingApis\": [\"google-veo-video-extend\"]\n },\n {\n \"id\": \"generate-text\",\n \"intent\": {\n \"ko\": [\"텍스트 생성\", \"글 작성\", \"카피라이팅\", \"문구 생성\", \"AI 글쓰기\"],\n \"en\": [\"generate text\", \"write copy\", \"copywriting\", \"text generation\", \"AI writing\"]\n },\n \"matchingApis\": [\"google-gemini-text\", \"openai-gpt-text\"]\n },\n {\n \"id\": \"analyze-image\",\n \"intent\": {\n \"ko\": [\"이미지 분석\", \"사진 분석\", \"디자인 피드백\", \"UI 분석\", \"이미지 설명\"],\n \"en\": [\"analyze image\", \"image analysis\", \"design feedback\", \"UI analysis\", \"describe image\"]\n },\n \"matchingApis\": [\"google-gemini-vision\", \"openai-gpt-vision\"]\n },\n {\n \"id\": \"generate-image\",\n \"intent\": {\n \"ko\": [\"이미지 생성\", \"그림 생성\", \"이미지 만들기\", \"AI 이미지\", \"일러스트 생성\"],\n \"en\": [\"generate image\", \"create image\", \"image generation\", \"AI image\", \"create illustration\"]\n },\n \"matchingApis\": [\"google-gemini-image-gen\", \"openai-gpt-image\", \"openai-dall-e-3\"]\n },\n {\n \"id\": \"transcribe-audio\",\n \"intent\": {\n \"ko\": [\"음성 전사\", \"오디오 텍스트 변환\", \"녹음 텍스트화\", \"음성 인식\"],\n \"en\": [\"transcribe audio\", \"speech to text\", \"audio transcription\", \"voice recognition\"]\n },\n \"matchingApis\": [\"google-gemini-audio\"]\n },\n {\n \"id\": \"design-review\",\n \"intent\": {\n \"ko\": [\"디자인 리뷰\", \"디자인 검토\", \"시안 피드백\", \"디자인 평가\"],\n \"en\": [\"design review\", \"design critique\", \"mockup feedback\", \"design evaluation\"]\n },\n \"matchingApis\": [\"google-gemini-vision\", \"openai-gpt-vision\"]\n },\n {\n \"id\": \"create-concept-art\",\n \"intent\": {\n \"ko\": [\"컨셉 아트 생성\", \"컨셉 이미지 제작\", \"무드보드 이미지\"],\n \"en\": [\"concept art\", \"create concept image\", \"moodboard images\"]\n },\n \"matchingApis\": [\"openai-gpt-image\", \"openai-dall-e-3\", \"google-gemini-image-gen\"]\n },\n {\n \"id\": \"create-marketing-visual\",\n \"intent\": {\n \"ko\": [\"마케팅 이미지 제작\", \"배너 생성\", \"광고 이미지\", \"소셜 미디어 이미지\"],\n \"en\": [\"marketing visuals\", \"create banner\", \"ad images\", \"social media images\"]\n },\n \"matchingApis\": [\"openai-gpt-image\", \"openai-dall-e-3\", \"google-gemini-image-gen\"]\n },\n {\n \"id\": \"product-promo-video\",\n \"intent\": {\n \"ko\": [\"제품 홍보 영상\", \"프로모션 비디오\", \"광고 영상 제작\"],\n \"en\": [\"product promo video\", \"promotion video\", \"ad video creation\"]\n },\n \"matchingApis\": [\"google-veo-text-to-video\", \"google-veo-image-to-video\", \"openai-sora-text-to-video\", \"openai-sora-image-to-video\"]\n },\n {\n \"id\": \"social-media-content\",\n \"intent\": {\n \"ko\": [\"소셜 미디어 콘텐츠\", \"SNS 콘텐츠 제작\", \"인스타 콘텐츠\", \"릴스 영상\"],\n \"en\": [\"social media content\", \"SNS content\", \"instagram content\", \"reels video\"]\n },\n \"matchingApis\": [\"google-veo-text-to-video\", \"openai-sora-text-to-video\", \"openai-gpt-image\", \"google-gemini-image-gen\"]\n },\n {\n \"id\": \"translate-text\",\n \"intent\": {\n \"ko\": [\"번역\", \"다국어 번역\", \"텍스트 번역\", \"영어 번역\"],\n \"en\": [\"translate\", \"translation\", \"multilingual\", \"localize\"]\n },\n \"matchingApis\": [\"google-gemini-text\", \"openai-gpt-text\"]\n },\n {\n \"id\": \"accessibility-check\",\n \"intent\": {\n \"ko\": [\"접근성 검토\", \"접근성 분석\", \"웹 접근성\", \"a11y 검사\"],\n \"en\": [\"accessibility check\", \"a11y review\", \"accessibility analysis\"]\n },\n \"matchingApis\": [\"google-gemini-vision\", \"openai-gpt-vision\"]\n },\n {\n \"id\": \"animate-product\",\n \"intent\": {\n \"ko\": [\"제품 이미지 애니메이션\", \"제품 모션 그래픽\", \"제품 사진 움직이기\"],\n \"en\": [\"animate product\", \"product motion\", \"product animation\"]\n },\n \"matchingApis\": [\"google-veo-image-to-video\", \"openai-sora-image-to-video\"]\n },\n {\n \"id\": \"code-generation\",\n \"intent\": {\n \"ko\": [\"코드 생성\", \"코드 작성\", \"프로그래밍 도움\"],\n \"en\": [\"code generation\", \"write code\", \"programming help\"]\n },\n \"matchingApis\": [\"google-gemini-text\", \"openai-gpt-text\"]\n },\n {\n \"id\": \"summarize-audio\",\n \"intent\": {\n \"ko\": [\"오디오 요약\", \"회의 녹음 요약\", \"팟캐스트 요약\"],\n \"en\": [\"summarize audio\", \"meeting summary\", \"podcast summary\"]\n },\n \"matchingApis\": [\"google-gemini-audio\"]\n },\n {\n \"id\": \"image-with-text\",\n \"intent\": {\n \"ko\": [\"텍스트가 포함된 이미지\", \"글자가 있는 이미지\", \"로고 이미지 생성\"],\n \"en\": [\"image with text\", \"text in image\", \"logo image\", \"text rendering\"]\n },\n \"matchingApis\": [\"openai-gpt-image\"]\n }\n]\n","import type { ApiEntry, ApiSummary, IntentMapping, IntentMatch, Provider, InputType, OutputType } from \"../types.js\";\nimport catalogData from \"./apis.json\";\nimport intentsData from \"./intents.json\";\n\nconst catalog: ApiEntry[] = catalogData as ApiEntry[];\nconst intents: IntentMapping[] = intentsData as IntentMapping[];\n\nexport function loadCatalog(): ApiEntry[] {\n return catalog;\n}\n\nexport function getApiById(id: string): ApiEntry | undefined {\n return catalog.find((a) => a.id === id);\n}\n\nfunction toSummary(api: ApiEntry): ApiSummary {\n return {\n id: api.id,\n provider: api.provider,\n model: api.model,\n name: api.name,\n description: api.description,\n inputTypes: api.inputTypes,\n outputType: api.outputType,\n difficulty: api.difficulty,\n tags: api.tags,\n };\n}\n\nexport function filterApis(options: {\n provider?: Provider;\n category?: string;\n inputType?: InputType;\n outputType?: OutputType;\n}): ApiSummary[] {\n let results = [...catalog];\n\n if (options.provider) {\n results = results.filter((a) => a.provider === options.provider);\n }\n if (options.category) {\n results = results.filter((a) => a.category === options.category);\n }\n if (options.inputType) {\n results = results.filter((a) => a.inputTypes.includes(options.inputType!));\n }\n if (options.outputType) {\n results = results.filter((a) => a.outputType === options.outputType);\n }\n\n return results.map(toSummary);\n}\n\nfunction scoreMatch(query: string, text: string): number {\n const q = query.toLowerCase();\n const t = text.toLowerCase();\n if (t === q) return 5;\n if (t.includes(q)) return 3;\n // Check if individual words match\n const qWords = q.split(/\\s+/);\n const matchedWords = qWords.filter((w) => t.includes(w));\n if (matchedWords.length > 0) return matchedWords.length;\n return 0;\n}\n\nexport function matchIntent(query: string): IntentMatch[] {\n const results: IntentMatch[] = [];\n\n for (const intent of intents) {\n let bestScore = 0;\n\n // Match against Korean intents\n for (const phrase of intent.intent.ko) {\n const s = scoreMatch(query, phrase);\n if (s > bestScore) bestScore = s;\n }\n\n // Match against English intents\n for (const phrase of intent.intent.en) {\n const s = scoreMatch(query, phrase);\n if (s > bestScore) bestScore = s;\n }\n\n if (bestScore > 0) {\n const apis = intent.matchingApis\n .map((id) => catalog.find((a) => a.id === id))\n .filter((a): a is ApiEntry => a !== undefined)\n .map(toSummary);\n\n results.push({\n intentId: intent.id,\n score: bestScore,\n apis,\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results;\n}\n\nexport function searchApis(options: {\n query?: string;\n provider?: Provider;\n category?: string;\n inputType?: InputType;\n outputType?: OutputType;\n}): ApiSummary[] {\n // If query is provided, start with intent matching\n if (options.query) {\n const intentMatches = matchIntent(options.query);\n\n // Collect matched API IDs with scores\n const apiScores = new Map<string, number>();\n for (const match of intentMatches) {\n for (const api of match.apis) {\n const existing = apiScores.get(api.id) || 0;\n apiScores.set(api.id, Math.max(existing, match.score));\n }\n }\n\n // Also do direct tag/name matching on catalog\n const q = options.query.toLowerCase();\n for (const api of catalog) {\n let tagScore = 0;\n for (const tag of api.tags) {\n const s = scoreMatch(options.query, tag);\n if (s > tagScore) tagScore = s;\n }\n const nameScoreKo = scoreMatch(options.query, api.name.ko);\n const nameScoreEn = scoreMatch(options.query, api.name.en);\n const descScoreKo = api.description.ko.toLowerCase().includes(q) ? 1 : 0;\n const descScoreEn = api.description.en.toLowerCase().includes(q) ? 1 : 0;\n\n const directScore = Math.max(tagScore, nameScoreKo, nameScoreEn, descScoreKo, descScoreEn);\n if (directScore > 0) {\n const existing = apiScores.get(api.id) || 0;\n apiScores.set(api.id, Math.max(existing, directScore));\n }\n }\n\n // Convert to sorted results\n let results = Array.from(apiScores.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => catalog.find((a) => a.id === id)!)\n .filter((a) => a !== undefined);\n\n // Apply filters\n if (options.provider) {\n results = results.filter((a) => a.provider === options.provider);\n }\n if (options.category) {\n results = results.filter((a) => a.category === options.category);\n }\n if (options.inputType) {\n results = results.filter((a) => a.inputTypes.includes(options.inputType!));\n }\n if (options.outputType) {\n results = results.filter((a) => a.outputType === options.outputType);\n }\n\n return results.map(toSummary);\n }\n\n // No query, just filter\n return filterApis(options);\n}\n","import { z } from \"zod/v3\";\nimport { getApiById } from \"../catalog/loader.js\";\n\nexport const getApiDetailsSchema = {\n apiId: z.string().describe(\"조회할 API의 ID (예: google-veo-image-to-video)\"),\n};\n\nexport async function getApiDetails(params: { apiId: string }) {\n const api = getApiById(params.apiId);\n\n if (!api) {\n return {\n content: [{\n type: \"text\" as const,\n text: `API를 찾을 수 없습니다: \\`${params.apiId}\\`\\n\\n\\`search_api\\` 도구로 사용 가능한 API를 검색해보세요.`,\n }],\n };\n }\n\n const inputs = api.inputTypes.join(\" + \");\n const useCases = api.useCases.map((uc) => ` - ${uc.ko} (${uc.en})`).join(\"\\n\");\n const related = api.relatedApis.length > 0\n ? api.relatedApis.map((id) => `\\`${id}\\``).join(\", \")\n : \"없음\";\n\n const outputInfo: string[] = [];\n if (api.output.formats) outputInfo.push(`포맷: ${api.output.formats.join(\", \")}`);\n if (api.output.resolutions) outputInfo.push(`해상도: ${api.output.resolutions.join(\", \")}`);\n if (api.output.maxDuration) outputInfo.push(`최대 길이: ${api.output.maxDuration}`);\n if (api.output.maxTokens) outputInfo.push(`최대 토큰: ${api.output.maxTokens}`);\n\n const text = `# ${api.name.ko} (${api.name.en})\n\n## 기본 정보\n- **제공자**: ${api.provider}\n- **모델**: ${api.model}\n- **카테고리**: ${api.category}\n- **난이도**: ${api.difficulty}\n- **입력**: ${inputs}\n- **출력**: ${api.outputType}\n\n## 설명\n${api.description.ko}\n\n## 출력 옵션\n${outputInfo.length > 0 ? outputInfo.map((i) => `- ${i}`).join(\"\\n\") : \"- 기본 설정 사용\"}\n\n## 인증\n- **방식**: API Key\n- **환경변수**: \\`${api.auth.envVar}\\`\n- **설정 가이드**: ${api.auth.setupGuide}\n\n## 가격\n- **과금 방식**: ${api.pricing.model}\n- **상세**: ${api.pricing.detail.ko}\n\n## 사용 사례\n${useCases}\n\n## API 엔드포인트\n- **URL**: ${api.endpoint.baseUrl}${api.endpoint.path}\n- **메서드**: ${api.endpoint.method}\n${api.endpoint.sdkPackage ? `- **SDK 패키지**: \\`${api.endpoint.sdkPackage}\\`` : \"\"}\n\n## 관련 API\n${related}\n\n## 태그\n${api.tags.join(\", \")}\n\n---\n💡 다음 단계:\n- API 키 설정 확인: \\`check_api_key\\` 도구 사용\n- 코드 생성: \\`generate_api_code\\` 도구 사용\n- 연결 테스트: \\`test_api_connection\\` 도구 사용`;\n\n return {\n content: [{ type: \"text\" as const, text }],\n };\n}\n","import { z } from \"zod/v3\";\nimport { getApiById } from \"../catalog/loader.js\";\n\nexport const checkApiKeySchema = {\n apiId: z.string().describe(\"확인할 API의 ID (예: google-veo-image-to-video)\"),\n validate: z.boolean().optional().describe(\"true로 설정하면 실제 API 호출로 키 유효성을 검증합니다\"),\n};\n\nasync function validateGoogleKey(apiKey: string): Promise<{ valid: boolean; error?: string }> {\n try {\n const res = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${encodeURIComponent(apiKey)}`,\n );\n if (res.ok) return { valid: true };\n const body = await res.text();\n return { valid: false, error: `HTTP ${res.status}: ${body.slice(0, 200)}` };\n } catch (e: any) {\n return { valid: false, error: e.message };\n }\n}\n\nasync function validateOpenAIKey(apiKey: string): Promise<{ valid: boolean; error?: string }> {\n try {\n const res = await fetch(\"https://api.openai.com/v1/models\", {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (res.ok) return { valid: true };\n const body = await res.text();\n return { valid: false, error: `HTTP ${res.status}: ${body.slice(0, 200)}` };\n } catch (e: any) {\n return { valid: false, error: e.message };\n }\n}\n\nexport async function checkApiKey(params: { apiId: string; validate?: boolean }) {\n const api = getApiById(params.apiId);\n\n if (!api) {\n return {\n content: [{\n type: \"text\" as const,\n text: `API를 찾을 수 없습니다: \\`${params.apiId}\\``,\n }],\n };\n }\n\n const envVar = api.auth.envVar;\n const apiKey = process.env[envVar];\n\n if (!apiKey) {\n return {\n content: [{\n type: \"text\" as const,\n text: `❌ API 키가 설정되지 않았습니다.\n\n**필요한 환경변수**: \\`${envVar}\\`\n\n## 설정 방법\n\n### 방법 1: 터미널에서 직접 설정\n\\`\\`\\`bash\nexport ${envVar}=\"your-api-key-here\"\n\\`\\`\\`\n\n### 방법 2: .env 파일에 추가\n\\`\\`\\`\n${envVar}=your-api-key-here\n\\`\\`\\`\n\n### 방법 3: Claude Code 설정\n\\`\\`\\`bash\nclaude config set env.${envVar} \"your-api-key-here\"\n\\`\\`\\`\n\n---\n📖 키 발급 방법은 리소스를 참조하세요: \\`${api.auth.setupGuide}\\``,\n }],\n };\n }\n\n // Key exists\n if (!params.validate) {\n return {\n content: [{\n type: \"text\" as const,\n text: `✅ API 키가 설정되어 있습니다.\n\n**환경변수**: \\`${envVar}\\`\n**키 미리보기**: \\`${apiKey.slice(0, 8)}...\\`\n\n💡 키의 유효성을 검증하려면 \\`validate: true\\` 옵션을 사용하세요.`,\n }],\n };\n }\n\n // Validate the key\n let result: { valid: boolean; error?: string };\n\n if (api.provider === \"google\") {\n result = await validateGoogleKey(apiKey);\n } else {\n result = await validateOpenAIKey(apiKey);\n }\n\n if (result.valid) {\n return {\n content: [{\n type: \"text\" as const,\n text: `✅ API 키가 유효합니다!\n\n**환경변수**: \\`${envVar}\\`\n**키 미리보기**: \\`${apiKey.slice(0, 8)}...\\`\n**상태**: 인증 성공\n\n🚀 이제 \\`generate_api_code\\` 도구로 코드를 생성하거나, \\`test_api_connection\\`으로 연결 테스트를 할 수 있습니다.`,\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `⚠️ API 키가 설정되어 있지만 유효하지 않습니다.\n\n**환경변수**: \\`${envVar}\\`\n**키 미리보기**: \\`${apiKey.slice(0, 8)}...\\`\n**오류**: ${result.error}\n\n## 확인 사항\n- API 키가 올바르게 복사되었는지 확인\n- API 키가 만료되지 않았는지 확인\n- 해당 API 서비스가 활성화되어 있는지 확인\n\n📖 키를 다시 발급받으려면: \\`${api.auth.setupGuide}\\``,\n }],\n };\n}\n","import { z } from \"zod/v3\";\nimport { getApiById } from \"../catalog/loader.js\";\nimport type { ApiEntry, CodeStyle, Framework } from \"../types.js\";\n\nexport const generateApiCodeSchema = {\n apiId: z.string().describe(\"코드를 생성할 API의 ID\"),\n style: z.enum([\"fetch\", \"sdk\"]).optional().describe(\"코드 스타일: fetch (기본 HTTP) 또는 sdk (공식 SDK). 기본값: sdk\"),\n framework: z.enum([\"nextjs\", \"vite\", \"node\", \"auto\"]).optional().describe(\"프레임워크: nextjs, vite, node, auto(자동감지). 기본값: auto\"),\n options: z.object({\n prompt: z.string().optional().describe(\"예시 프롬프트 텍스트\"),\n outputPath: z.string().optional().describe(\"출력 파일 저장 경로\"),\n }).optional().describe(\"추가 옵션\"),\n};\n\nfunction detectFramework(): Framework {\n try {\n const fs = require(\"fs\");\n const pkg = JSON.parse(fs.readFileSync(\"package.json\", \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps[\"next\"]) return \"nextjs\";\n if (deps[\"vite\"]) return \"vite\";\n return \"node\";\n } catch {\n return \"node\";\n }\n}\n\nfunction generateGoogleSdkCode(api: ApiEntry, prompt: string, outputPath: string): string {\n if (api.category === \"video-generation\") {\n if (api.id === \"google-veo-image-to-video\") {\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateVideoFromImage() {\n // 이미지 파일을 base64로 읽기\n const imageBuffer = fs.readFileSync(\"./input-image.png\");\n const imageBase64 = imageBuffer.toString(\"base64\");\n\n const operation = await ai.models.generateVideos({\n model: \"veo-3.1\",\n prompt: \"${prompt}\",\n image: {\n imageBytes: imageBase64,\n mimeType: \"image/png\",\n },\n config: {\n aspectRatio: \"16:9\",\n numberOfVideos: 1,\n },\n });\n\n // 영상 생성은 비동기 작업 — 완료까지 대기\n const result = await operation.pollUntilComplete({ pollInterval: 10_000 });\n\n if (result.generatedVideos && result.generatedVideos.length > 0) {\n const video = result.generatedVideos[0];\n if (video.video?.uri) {\n const response = await fetch(video.video.uri);\n const buffer = Buffer.from(await response.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"영상이 저장되었습니다: ${outputPath}\");\n }\n }\n}\n\ngenerateVideoFromImage();`;\n }\n\n if (api.id === \"google-veo-video-extend\") {\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function extendVideo() {\n const videoBuffer = fs.readFileSync(\"./input-video.mp4\");\n const videoBase64 = videoBuffer.toString(\"base64\");\n\n const operation = await ai.models.generateVideos({\n model: \"veo-3.1\",\n prompt: \"${prompt}\",\n video: {\n videoBytes: videoBase64,\n mimeType: \"video/mp4\",\n },\n config: {\n aspectRatio: \"16:9\",\n numberOfVideos: 1,\n },\n });\n\n const result = await operation.pollUntilComplete({ pollInterval: 10_000 });\n\n if (result.generatedVideos && result.generatedVideos.length > 0) {\n const video = result.generatedVideos[0];\n if (video.video?.uri) {\n const response = await fetch(video.video.uri);\n const buffer = Buffer.from(await response.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"연장된 영상이 저장되었습니다: ${outputPath}\");\n }\n }\n}\n\nextendVideo();`;\n }\n\n // Default: text-to-video\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateVideo() {\n const operation = await ai.models.generateVideos({\n model: \"veo-3.1\",\n prompt: \"${prompt}\",\n config: {\n aspectRatio: \"16:9\",\n numberOfVideos: 1,\n },\n });\n\n // 영상 생성은 비동기 작업 — 완료까지 대기\n const result = await operation.pollUntilComplete({ pollInterval: 10_000 });\n\n if (result.generatedVideos && result.generatedVideos.length > 0) {\n const video = result.generatedVideos[0];\n if (video.video?.uri) {\n const response = await fetch(video.video.uri);\n const buffer = Buffer.from(await response.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"영상이 저장되었습니다: ${outputPath}\");\n }\n }\n}\n\ngenerateVideo();`;\n }\n\n if (api.category === \"image-generation\") {\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateImage() {\n const response = await ai.models.generateContent({\n model: \"gemini-2.0-flash\",\n contents: \"${prompt}\",\n config: {\n responseModalities: [\"TEXT\", \"IMAGE\"],\n },\n });\n\n if (response.candidates && response.candidates[0]) {\n const parts = response.candidates[0].content?.parts || [];\n for (const part of parts) {\n if (part.inlineData) {\n const buffer = Buffer.from(part.inlineData.data!, \"base64\");\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"이미지가 저장되었습니다: ${outputPath}\");\n }\n if (part.text) {\n console.log(\"텍스트 응답:\", part.text);\n }\n }\n }\n}\n\ngenerateImage();`;\n }\n\n if (api.category === \"vision\") {\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function analyzeImage() {\n const imageBuffer = fs.readFileSync(\"./input-image.png\");\n const imageBase64 = imageBuffer.toString(\"base64\");\n\n const response = await ai.models.generateContent({\n model: \"gemini-2.0-flash\",\n contents: [\n {\n role: \"user\",\n parts: [\n { inlineData: { data: imageBase64, mimeType: \"image/png\" } },\n { text: \"${prompt}\" },\n ],\n },\n ],\n });\n\n console.log(response.text);\n}\n\nanalyzeImage();`;\n }\n\n if (api.category === \"audio\") {\n return `import { GoogleGenAI } from \"@google/genai\";\nimport fs from \"fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function analyzeAudio() {\n const audioBuffer = fs.readFileSync(\"./input-audio.mp3\");\n const audioBase64 = audioBuffer.toString(\"base64\");\n\n const response = await ai.models.generateContent({\n model: \"gemini-2.0-flash\",\n contents: [\n {\n role: \"user\",\n parts: [\n { inlineData: { data: audioBase64, mimeType: \"audio/mp3\" } },\n { text: \"${prompt}\" },\n ],\n },\n ],\n });\n\n console.log(response.text);\n}\n\nanalyzeAudio();`;\n }\n\n // Default: text generation\n return `import { GoogleGenAI } from \"@google/genai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateText() {\n const response = await ai.models.generateContent({\n model: \"gemini-2.0-flash\",\n contents: \"${prompt}\",\n });\n\n console.log(response.text);\n}\n\ngenerateText();`;\n}\n\nfunction generateOpenAISdkCode(api: ApiEntry, prompt: string, outputPath: string): string {\n if (api.id === \"openai-gpt-image\" || api.id === \"openai-dall-e-3\") {\n const model = api.id === \"openai-gpt-image\" ? \"gpt-image-1\" : \"dall-e-3\";\n return `import OpenAI from \"openai\";\nimport fs from \"fs\";\n\nconst openai = new OpenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateImage() {\n const response = await openai.images.generate({\n model: \"${model}\",\n prompt: \"${prompt}\",\n n: 1,\n size: \"1024x1024\",\n });\n\n const imageUrl = response.data[0].url;\n if (imageUrl) {\n const imageResponse = await fetch(imageUrl);\n const buffer = Buffer.from(await imageResponse.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"이미지가 저장되었습니다: ${outputPath}\");\n }\n}\n\ngenerateImage();`;\n }\n\n if (api.id === \"openai-sora-text-to-video\") {\n return `import OpenAI from \"openai\";\nimport fs from \"fs\";\n\nconst openai = new OpenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateVideo() {\n const response = await openai.videos.generate({\n model: \"sora\",\n prompt: \"${prompt}\",\n size: \"1080p\",\n duration: 5,\n });\n\n // Sora 영상 생성은 비동기 — 결과 폴링\n let result = response;\n while (result.status === \"in_progress\") {\n await new Promise((r) => setTimeout(r, 10_000));\n result = await openai.videos.retrieve(result.id);\n }\n\n if (result.status === \"completed\" && result.url) {\n const videoResponse = await fetch(result.url);\n const buffer = Buffer.from(await videoResponse.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"영상이 저장되었습니다: ${outputPath}\");\n }\n}\n\ngenerateVideo();`;\n }\n\n if (api.id === \"openai-sora-image-to-video\") {\n return `import OpenAI from \"openai\";\nimport fs from \"fs\";\n\nconst openai = new OpenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateVideoFromImage() {\n const imageBuffer = fs.readFileSync(\"./input-image.png\");\n const imageBase64 = imageBuffer.toString(\"base64\");\n\n const response = await openai.videos.generate({\n model: \"sora\",\n prompt: \"${prompt}\",\n image: {\n data: imageBase64,\n mime_type: \"image/png\",\n },\n size: \"1080p\",\n duration: 5,\n });\n\n let result = response;\n while (result.status === \"in_progress\") {\n await new Promise((r) => setTimeout(r, 10_000));\n result = await openai.videos.retrieve(result.id);\n }\n\n if (result.status === \"completed\" && result.url) {\n const videoResponse = await fetch(result.url);\n const buffer = Buffer.from(await videoResponse.arrayBuffer());\n fs.writeFileSync(\"${outputPath}\", buffer);\n console.log(\"영상이 저장되었습니다: ${outputPath}\");\n }\n}\n\ngenerateVideoFromImage();`;\n }\n\n if (api.category === \"vision\") {\n return `import OpenAI from \"openai\";\nimport fs from \"fs\";\n\nconst openai = new OpenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function analyzeImage() {\n const imageBuffer = fs.readFileSync(\"./input-image.png\");\n const imageBase64 = imageBuffer.toString(\"base64\");\n\n const response = await openai.chat.completions.create({\n model: \"gpt-4o\",\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"image_url\",\n image_url: { url: \\`data:image/png;base64,\\${imageBase64}\\` },\n },\n { type: \"text\", text: \"${prompt}\" },\n ],\n },\n ],\n });\n\n console.log(response.choices[0].message.content);\n}\n\nanalyzeImage();`;\n }\n\n // Default: text generation (GPT-4o)\n return `import OpenAI from \"openai\";\n\nconst openai = new OpenAI({ apiKey: process.env.${api.auth.envVar} });\n\nasync function generateText() {\n const response = await openai.chat.completions.create({\n model: \"gpt-4o\",\n messages: [\n { role: \"user\", content: \"${prompt}\" },\n ],\n });\n\n console.log(response.choices[0].message.content);\n}\n\ngenerateText();`;\n}\n\nfunction generateFetchCode(api: ApiEntry, prompt: string, outputPath: string): string {\n if (api.provider === \"google\") {\n if (api.category === \"text-generation\") {\n return `const API_KEY = process.env.${api.auth.envVar};\n\nasync function generateText() {\n const response = await fetch(\n \\`${api.endpoint.baseUrl}${api.endpoint.path}?key=\\${API_KEY}\\`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n contents: [{ parts: [{ text: \"${prompt}\" }] }],\n }),\n },\n );\n\n const data = await response.json();\n console.log(data.candidates[0].content.parts[0].text);\n}\n\ngenerateText();`;\n }\n\n return `// Google API는 SDK 사용을 권장합니다.\n// fetch 방식은 인증/폴링 처리가 복잡합니다.\n// SDK 방식으로 코드를 생성하려면 style: \"sdk\" 옵션을 사용하세요.\n\nconst API_KEY = process.env.${api.auth.envVar};\nconst url = \\`${api.endpoint.baseUrl}${api.endpoint.path}?key=\\${API_KEY}\\`;\n\n// 기본 요청 구조\nconst response = await fetch(url, {\n method: \"${api.endpoint.method}\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n // API 문서를 참조하여 요청 본문을 작성하세요\n // https://ai.google.dev/api\n }),\n});\n\nconst data = await response.json();\nconsole.log(data);`;\n }\n\n // OpenAI fetch\n if (api.category === \"text-generation\" || api.category === \"vision\") {\n return `const API_KEY = process.env.${api.auth.envVar};\n\nasync function callOpenAI() {\n const response = await fetch(\"${api.endpoint.baseUrl}${api.endpoint.path}\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \\`Bearer \\${API_KEY}\\`,\n },\n body: JSON.stringify({\n model: \"${api.model === \"GPT-4o\" ? \"gpt-4o\" : api.model.toLowerCase()}\",\n messages: [\n { role: \"user\", content: \"${prompt}\" },\n ],\n }),\n });\n\n const data = await response.json();\n console.log(data.choices[0].message.content);\n}\n\ncallOpenAI();`;\n }\n\n if (api.category === \"image-generation\") {\n return `const API_KEY = process.env.${api.auth.envVar};\n\nasync function generateImage() {\n const response = await fetch(\"${api.endpoint.baseUrl}${api.endpoint.path}\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \\`Bearer \\${API_KEY}\\`,\n },\n body: JSON.stringify({\n model: \"${api.id === \"openai-dall-e-3\" ? \"dall-e-3\" : \"gpt-image-1\"}\",\n prompt: \"${prompt}\",\n n: 1,\n size: \"1024x1024\",\n }),\n });\n\n const data = await response.json();\n console.log(\"이미지 URL:\", data.data[0].url);\n}\n\ngenerateImage();`;\n }\n\n return `const API_KEY = process.env.${api.auth.envVar};\n\nconst response = await fetch(\"${api.endpoint.baseUrl}${api.endpoint.path}\", {\n method: \"${api.endpoint.method}\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \\`Bearer \\${API_KEY}\\`,\n },\n body: JSON.stringify({\n // API 문서를 참조하여 요청 본문을 작성하세요\n }),\n});\n\nconst data = await response.json();\nconsole.log(data);`;\n}\n\nfunction getInstallCommand(api: ApiEntry, style: CodeStyle): string {\n if (style === \"fetch\") return \"// fetch API는 Node.js 18+ 내장 — 별도 설치 불필요\";\n\n const pkg = api.endpoint.sdkPackage;\n if (!pkg) return \"// SDK 패키지 없음\";\n\n return `# bun 사용 시\\nbun add ${pkg}\\n\\n# npm 사용 시\\nnpm install ${pkg}`;\n}\n\nexport async function generateApiCode(params: {\n apiId: string;\n style?: string;\n framework?: string;\n options?: { prompt?: string; outputPath?: string };\n}) {\n const api = getApiById(params.apiId);\n\n if (!api) {\n return {\n content: [{\n type: \"text\" as const,\n text: `API를 찾을 수 없습니다: \\`${params.apiId}\\``,\n }],\n };\n }\n\n const style: CodeStyle = (params.style as CodeStyle) || \"sdk\";\n const framework: Framework = params.framework === \"auto\" || !params.framework\n ? detectFramework()\n : (params.framework as Framework);\n\n const prompt = params.options?.prompt || \"안녕하세요, 테스트입니다.\";\n const outputPath = params.options?.outputPath || (\n api.outputType === \"video\" ? \"./output.mp4\" :\n api.outputType === \"image\" ? \"./output.png\" :\n \"\"\n );\n\n let code: string;\n if (style === \"sdk\") {\n code = api.provider === \"google\"\n ? generateGoogleSdkCode(api, prompt, outputPath)\n : generateOpenAISdkCode(api, prompt, outputPath);\n } else {\n code = generateFetchCode(api, prompt, outputPath);\n }\n\n const installCmd = getInstallCommand(api, style);\n\n const envNote = `# 환경변수 설정 필요\\nexport ${api.auth.envVar}=\"your-api-key-here\"`;\n\n const frameworkNote = framework === \"nextjs\"\n ? \"\\n\\n⚠️ Next.js에서는 서버 컴포넌트 또는 API Route에서 사용하세요. 클라이언트에서 API 키를 노출하지 마세요.\"\n : framework === \"vite\"\n ? \"\\n\\n⚠️ Vite에서는 서버 사이드에서 실행하세요. 클라이언트에서 API 키를 노출하지 마세요.\"\n : \"\";\n\n const text = `# ${api.name.ko} — 코드 생성\n\n## 1. 패키지 설치\n\\`\\`\\`bash\n${installCmd}\n\\`\\`\\`\n\n## 2. 환경변수 설정\n\\`\\`\\`bash\n${envNote}\n\\`\\`\\`\n\n## 3. 코드 (${style === \"sdk\" ? \"SDK 방식\" : \"fetch 방식\"} / ${framework})\n\\`\\`\\`typescript\n${code}\n\\`\\`\\`\n${frameworkNote}\n\n---\n💡 실행 전 \\`check_api_key\\`로 API 키를 확인하세요.\n💡 실행 후 문제가 있다면 \\`test_api_connection\\`으로 연결 상태를 테스트하세요.`;\n\n return {\n content: [{ type: \"text\" as const, text }],\n };\n}\n","import { z } from \"zod/v3\";\nimport { getApiById } from \"../catalog/loader.js\";\n\nexport const testApiConnectionSchema = {\n apiId: z.string().describe(\"테스트할 API의 ID\"),\n prompt: z.string().optional().describe(\"테스트에 사용할 프롬프트 (기본값: 간단한 테스트 메시지)\"),\n};\n\nasync function testGoogleConnection(apiKey: string, prompt: string): Promise<{ success: boolean; message: string; data?: any }> {\n try {\n const response = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${encodeURIComponent(apiKey)}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n contents: [{ parts: [{ text: prompt }] }],\n generationConfig: { maxOutputTokens: 50 },\n }),\n },\n );\n\n if (!response.ok) {\n const body = await response.text();\n return { success: false, message: `HTTP ${response.status}: ${body.slice(0, 300)}` };\n }\n\n const data = await response.json();\n const text = data.candidates?.[0]?.content?.parts?.[0]?.text || \"(응답 없음)\";\n return {\n success: true,\n message: `응답: ${text.slice(0, 200)}`,\n data: { model: \"gemini-2.0-flash\", tokensUsed: data.usageMetadata },\n };\n } catch (e: any) {\n return { success: false, message: `연결 오류: ${e.message}` };\n }\n}\n\nasync function testOpenAIConnection(apiKey: string, prompt: string): Promise<{ success: boolean; message: string; data?: any }> {\n try {\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: \"gpt-4o-mini\",\n messages: [{ role: \"user\", content: prompt }],\n max_tokens: 50,\n }),\n });\n\n if (!response.ok) {\n const body = await response.text();\n return { success: false, message: `HTTP ${response.status}: ${body.slice(0, 300)}` };\n }\n\n const data = await response.json();\n const text = data.choices?.[0]?.message?.content || \"(응답 없음)\";\n return {\n success: true,\n message: `응답: ${text.slice(0, 200)}`,\n data: { model: data.model, usage: data.usage },\n };\n } catch (e: any) {\n return { success: false, message: `연결 오류: ${e.message}` };\n }\n}\n\nexport async function testApiConnection(params: { apiId: string; prompt?: string }) {\n const api = getApiById(params.apiId);\n\n if (!api) {\n return {\n content: [{\n type: \"text\" as const,\n text: `API를 찾을 수 없습니다: \\`${params.apiId}\\``,\n }],\n };\n }\n\n const envVar = api.auth.envVar;\n const apiKey = process.env[envVar];\n\n if (!apiKey) {\n return {\n content: [{\n type: \"text\" as const,\n text: `❌ API 키가 설정되지 않아 테스트할 수 없습니다.\\n\\n환경변수 \\`${envVar}\\`를 먼저 설정하세요.\\n\\`check_api_key\\` 도구로 설정 방법을 확인할 수 있습니다.`,\n }],\n };\n }\n\n const prompt = params.prompt || \"Hello! Please respond with a single word: 'connected'\";\n\n let result: { success: boolean; message: string; data?: any };\n\n if (api.provider === \"google\") {\n result = await testGoogleConnection(apiKey, prompt);\n } else {\n result = await testOpenAIConnection(apiKey, prompt);\n }\n\n if (result.success) {\n return {\n content: [{\n type: \"text\" as const,\n text: `✅ 연결 테스트 성공!\n\n**API**: ${api.name.ko} (${api.id})\n**제공자**: ${api.provider}\n**${result.message}**\n${result.data ? `\\n**상세**: ${JSON.stringify(result.data, null, 2)}` : \"\"}\n\n🚀 연결이 정상입니다! \\`generate_api_code\\`로 코드를 생성하여 프로젝트에 통합하세요.`,\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `❌ 연결 테스트 실패\n\n**API**: ${api.name.ko} (${api.id})\n**제공자**: ${api.provider}\n**오류**: ${result.message}\n\n## 해결 방법\n1. \\`check_api_key\\`로 API 키 유효성을 확인하세요\n2. 네트워크 연결을 확인하세요\n3. API 서비스 상태를 확인하세요:\n ${api.provider === \"google\" ? \"- https://status.cloud.google.com\" : \"- https://status.openai.com\"}`,\n }],\n };\n}\n","export const GOOGLE_AI_API_KEY_GUIDE = `# Google AI Studio API 키 발급 가이드\n\n## 소요 시간: 약 5분\n\n## 단계별 안내\n\n### 1단계: Google AI Studio 접속\n- https://aistudio.google.com 에 접속합니다\n- Google 계정으로 로그인합니다\n\n### 2단계: API 키 생성\n1. 왼쪽 메뉴에서 **\"Get API Key\"** 클릭\n2. **\"Create API Key\"** 버튼 클릭\n3. 프로젝트 선택 (기존 프로젝트 또는 새 프로젝트 생성)\n4. 생성된 API 키를 복사\n\n### 3단계: 환경변수 설정\n\\`\\`\\`bash\n# 터미널에서 실행\nexport GOOGLE_AI_API_KEY=\"여기에-복사한-키-붙여넣기\"\n\\`\\`\\`\n\n또는 프로젝트 루트의 \\`.env\\` 파일에 추가:\n\\`\\`\\`\nGOOGLE_AI_API_KEY=여기에-복사한-키-붙여넣기\n\\`\\`\\`\n\n### 4단계: 확인\n\\`check_api_key\\` 도구를 사용하여 키가 올바르게 설정되었는지 확인하세요.\n\n## 사용 가능한 API\n이 키 하나로 다음 API를 모두 사용할 수 있습니다:\n- Gemini 2.0 Flash (텍스트 생성, 이미지 분석, 이미지 생성, 오디오 분석)\n- Veo 3.1 (텍스트→영상, 이미지→영상, 영상 연장)\n\n## 비용\n- Google AI Studio는 무료 티어를 제공합니다\n- 무료 한도: 분당 15 요청, 일일 1,500 요청\n- 유료 플랜: 사용량에 따라 과금\n\n## 주의사항\n- API 키를 코드에 직접 넣지 마세요 (보안 위험)\n- \\`.env\\` 파일을 \\`.gitignore\\`에 추가하세요\n- API 키가 유출되면 즉시 Google AI Studio에서 재생성하세요\n`;\n\nexport const GOOGLE_VERTEX_AI_GUIDE = `# Google Vertex AI 설정 가이드\n\n## 소요 시간: 약 15-20분\n\n## 언제 Vertex AI를 사용하나요?\n- 엔터프라이즈급 보안이 필요할 때\n- VPC 내에서 API를 호출해야 할 때\n- SLA가 필요할 때\n\n## 대부분의 디자이너에게는 Google AI Studio API 키 방식을 권장합니다.\n\n## 단계별 안내\n\n### 1단계: Google Cloud 프로젝트 생성\n1. https://console.cloud.google.com 접속\n2. 새 프로젝트 생성 또는 기존 프로젝트 선택\n3. 프로젝트 ID 기록\n\n### 2단계: API 활성화\n1. API 라이브러리에서 \"Vertex AI API\" 검색\n2. \"사용\" 버튼 클릭\n3. 결제 계정 연결 (필수)\n\n### 3단계: 서비스 계정 생성\n1. IAM & Admin → Service Accounts\n2. \"Create Service Account\" 클릭\n3. 역할: \"Vertex AI User\" 선택\n4. JSON 키 다운로드\n\n### 4단계: 환경변수 설정\n\\`\\`\\`bash\nexport GOOGLE_APPLICATION_CREDENTIALS=\"/path/to/service-account-key.json\"\nexport GOOGLE_CLOUD_PROJECT=\"your-project-id\"\n\\`\\`\\`\n\n## 주의사항\n- 서비스 계정 키 파일을 절대 Git에 커밋하지 마세요\n- 최소 권한 원칙을 적용하세요\n`;\n\nexport const OPENAI_API_KEY_GUIDE = `# OpenAI API 키 발급 가이드\n\n## 소요 시간: 약 5-10분\n\n## 단계별 안내\n\n### 1단계: OpenAI 계정 생성\n- https://platform.openai.com 에 접속합니다\n- 계정이 없다면 회원가입합니다\n\n### 2단계: 결제 설정 (필수)\n1. Settings → Billing 이동\n2. \"Add payment method\" 클릭\n3. 신용카드 정보 입력\n4. 사용 한도 설정 (예: 월 $10)\n\n⚠️ OpenAI API는 무료 티어가 매우 제한적입니다. 결제 설정이 필요합니다.\n\n### 3단계: API 키 생성\n1. Settings → API Keys 이동\n2. \"Create new secret key\" 클릭\n3. 키 이름 입력 (예: \"my-design-project\")\n4. 생성된 키를 복사 (이 화면을 벗어나면 다시 볼 수 없습니다!)\n\n### 4단계: 환경변수 설정\n\\`\\`\\`bash\n# 터미널에서 실행\nexport OPENAI_API_KEY=\"sk-여기에-복사한-키-붙여넣기\"\n\\`\\`\\`\n\n또는 프로젝트 루트의 \\`.env\\` 파일에 추가:\n\\`\\`\\`\nOPENAI_API_KEY=sk-여기에-복사한-키-붙여넣기\n\\`\\`\\`\n\n### 5단계: 확인\n\\`check_api_key\\` 도구를 사용하여 키가 올바르게 설정되었는지 확인하세요.\n\n## 사용 가능한 API\n이 키 하나로 다음 API를 모두 사용할 수 있습니다:\n- GPT-4o (텍스트 생성, 이미지 분석)\n- GPT Image 1 (이미지 생성)\n- DALL-E 3 (이미지 생성)\n- Sora (영상 생성)\n\n## 비용 관리 팁\n- Settings → Usage에서 실시간 사용량 확인\n- Settings → Limits에서 월별 한도 설정\n- GPT-4o-mini 모델을 테스트에 활용하면 비용 절약\n\n## 주의사항\n- API 키를 코드에 직접 넣지 마세요 (보안 위험)\n- \\`.env\\` 파일을 \\`.gitignore\\`에 추가하세요\n- API 키가 유출되면 즉시 OpenAI 대시보드에서 삭제/재생성하세요\n`;\n\nexport const API_COMPARISON_OVERVIEW = `# AI API 비교표\n\n## 영상 생성 (Video Generation)\n\n| API | 모델 | 입력 | 최대 길이 | 해상도 | 난이도 | 가격 |\n|-----|------|------|-----------|--------|--------|------|\n| Google Veo (text→video) | Veo 3.1 | 텍스트 | 8초 | 1080p | 초급 | ~$0.35/8s |\n| Google Veo (image→video) | Veo 3.1 | 이미지+텍스트 | 8초 | 1080p | 초급 | ~$0.35/8s |\n| Google Veo (video extend) | Veo 3.1 | 영상+텍스트 | 8초 | 1080p | 중급 | 초당 과금 |\n| OpenAI Sora (text→video) | Sora | 텍스트 | 20초 | 1080p | 중급 | ~$2/20s |\n| OpenAI Sora (image→video) | Sora | 이미지+텍스트 | 20초 | 1080p | 중급 | ~$2/20s |\n\n### 추천\n- **입문자**: Google Veo (간편한 설정, 저렴한 가격)\n- **긴 영상 필요**: OpenAI Sora (최대 20초)\n\n## 이미지 생성 (Image Generation)\n\n| API | 모델 | 해상도 | 텍스트 렌더링 | 난이도 | 가격 |\n|-----|------|--------|--------------|--------|------|\n| Google Gemini | Gemini 2.0 Flash | 1024x1024 | 보통 | 초급 | 토큰 기반 |\n| OpenAI GPT Image | GPT Image 1 | 최대 1536px | 우수 | 초급 | ~$0.04-0.17/장 |\n| OpenAI DALL-E 3 | DALL-E 3 | 최대 1792px | 좋음 | 초급 | ~$0.04-0.08/장 |\n\n### 추천\n- **텍스트가 포함된 이미지**: OpenAI GPT Image 1\n- **창의적 일러스트**: OpenAI DALL-E 3\n- **빠르고 저렴한 생성**: Google Gemini\n\n## 텍스트 생성 (Text Generation)\n\n| API | 모델 | 최대 출력 | 난이도 | 가격 |\n|-----|------|-----------|--------|------|\n| Google Gemini | Gemini 2.0 Flash | 8192 토큰 | 초급 | ~$0.40/1M 출력 토큰 |\n| OpenAI GPT-4o | GPT-4o | 16384 토큰 | 초급 | ~$10/1M 출력 토큰 |\n\n### 추천\n- **비용 효율**: Google Gemini (25배 저렴)\n- **최고 품질**: OpenAI GPT-4o\n\n## 이미지/오디오 분석\n\n| API | 모델 | 분석 대상 | 난이도 | 가격 |\n|-----|------|-----------|--------|------|\n| Google Gemini Vision | Gemini 2.0 Flash | 이미지 | 초급 | 매우 저렴 |\n| Google Gemini Audio | Gemini 2.0 Flash | 오디오 | 초급 | 매우 저렴 |\n| OpenAI GPT-4o Vision | GPT-4o | 이미지 | 초급 | 보통 |\n\n### 추천\n- **비용 우선**: Google Gemini\n- **분석 품질 우선**: OpenAI GPT-4o\n`;\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n GOOGLE_AI_API_KEY_GUIDE,\n GOOGLE_VERTEX_AI_GUIDE,\n OPENAI_API_KEY_GUIDE,\n API_COMPARISON_OVERVIEW,\n} from \"./guide-content.js\";\n\nexport function registerResources(server: McpServer) {\n server.resource(\n \"google-ai-api-key-guide\",\n \"guide://setup/google-ai-api-key\",\n {\n description: \"Google AI Studio API 키 발급 단계별 가이드 (5분 소요)\",\n mimeType: \"text/markdown\",\n },\n async () => ({\n contents: [{\n uri: \"guide://setup/google-ai-api-key\",\n mimeType: \"text/markdown\",\n text: GOOGLE_AI_API_KEY_GUIDE,\n }],\n }),\n );\n\n server.resource(\n \"google-vertex-ai-guide\",\n \"guide://setup/google-vertex-ai\",\n {\n description: \"Google Vertex AI 서비스 계정 설정 가이드 (고급, 15-20분 소요)\",\n mimeType: \"text/markdown\",\n },\n async () => ({\n contents: [{\n uri: \"guide://setup/google-vertex-ai\",\n mimeType: \"text/markdown\",\n text: GOOGLE_VERTEX_AI_GUIDE,\n }],\n }),\n );\n\n server.resource(\n \"openai-api-key-guide\",\n \"guide://setup/openai-api-key\",\n {\n description: \"OpenAI API 키 발급 및 결제 설정 가이드 (5-10분 소요)\",\n mimeType: \"text/markdown\",\n },\n async () => ({\n contents: [{\n uri: \"guide://setup/openai-api-key\",\n mimeType: \"text/markdown\",\n text: OPENAI_API_KEY_GUIDE,\n }],\n }),\n );\n\n server.resource(\n \"api-comparison-overview\",\n \"guide://overview/api-comparison\",\n {\n description: \"전체 AI API 비교표 — 영상/이미지/텍스트 생성, 분석 API 비교\",\n mimeType: \"text/markdown\",\n },\n async () => ({\n contents: [{\n uri: \"guide://overview/api-comparison\",\n mimeType: \"text/markdown\",\n text: API_COMPARISON_OVERVIEW,\n }],\n }),\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod/v3\";\n\nexport function registerDiscoverApiPrompt(server: McpServer) {\n server.prompt(\n \"discover_api\",\n \"AI API로 무엇을 만들 수 있는지 탐색합니다. 의도를 설명하면 적합한 API를 찾아줍니다.\",\n {\n goal: z.string().optional().describe(\"만들고 싶은 것을 설명하세요 (예: '이미지로 영상 만들기', '마케팅 카피 생성')\"),\n },\n async (params) => {\n const goal = params.goal || \"\";\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `디자이너를 위한 AI API 탐색을 도와주세요.\n\n${goal ? `사용자의 목표: \"${goal}\"` : \"사용자가 아직 구체적인 목표를 정하지 않았습니다.\"}\n\n다음 순서로 진행해주세요:\n\n1. ${goal ? `\"search_api\" 도구를 사용하여 \"${goal}\"에 맞는 API를 검색합니다.` : \"사용 가능한 모든 API를 카테고리별로 보여주세요 (search_api 도구 사용).\"}\n\n2. 검색 결과를 디자이너가 이해하기 쉽게 비교해주세요:\n - 각 API가 무엇을 하는지 (한국어로)\n - 난이도와 비용\n - 어떤 상황에 적합한지\n\n3. 사용자가 관심 있는 API를 선택하면:\n - \"get_api_details\"로 상세 정보를 보여주세요\n - \"check_api_key\"로 키 설정 상태를 확인하세요\n - 필요하면 키 발급 가이드를 안내하세요\n\n전문 용어를 피하고, 디자이너의 관점에서 쉽게 설명해주세요.`,\n },\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod/v3\";\n\nexport function registerSetupApiKeyPrompt(server: McpServer) {\n server.prompt(\n \"setup_api_key\",\n \"API 키 발급과 설정을 단계별로 안내합니다.\",\n {\n apiId: z.string().optional().describe(\"설정할 API의 ID (예: google-veo-image-to-video)\"),\n provider: z.enum([\"google\", \"openai\"]).optional().describe(\"API 제공자 (google 또는 openai)\"),\n },\n async (params) => {\n const apiId = params.apiId || \"\";\n const provider = params.provider || \"\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `API 키 설정을 도와주세요.\n\n${apiId ? `대상 API: \"${apiId}\"` : \"\"}\n${provider ? `제공자: \"${provider}\"` : \"\"}\n\n다음 순서로 진행해주세요:\n\n1. ${apiId ? `\"check_api_key\" 도구로 \"${apiId}\"의 키 설정 상태를 확인합니다.` : `${provider ? `\"${provider}\"` : \"Google과 OpenAI\"} API 키 설정 상태를 확인합니다.`}\n\n2. 키가 설정되지 않은 경우:\n - 해당 제공자의 설정 가이드 리소스를 읽어서 보여주세요\n - Google: \"guide://setup/google-ai-api-key\"\n - OpenAI: \"guide://setup/openai-api-key\"\n - 각 단계를 스크린샷 없이도 따라할 수 있게 구체적으로 안내\n\n3. 키가 설정된 경우:\n - \"check_api_key\"에 validate: true 옵션으로 유효성 검증\n - 유효하지 않으면 재발급 방법 안내\n\n4. 키 설정이 완료되면:\n - \"test_api_connection\"으로 실제 연결 테스트\n - 성공하면 다음 단계 (코드 생성) 안내\n\n쉬운 한국어로, 디자이너가 처음 하는 것처럼 상세하게 안내해주세요.\nAPI Key, Access Token 같은 용어도 간단히 설명해주세요.`,\n },\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod/v3\";\n\nexport function registerIntegrateApiPrompt(server: McpServer) {\n server.prompt(\n \"integrate_api\",\n \"API 탐색부터 키 설정, 코드 생성, 테스트까지 전체 통합 워크플로우를 진행합니다.\",\n {\n goal: z.string().optional().describe(\"만들고 싶은 것을 설명하세요 (예: '이미지로 영상 만들기')\"),\n apiId: z.string().optional().describe(\"이미 선택한 API가 있다면 ID를 입력하세요\"),\n },\n async (params) => {\n const goal = params.goal || \"\";\n const apiId = params.apiId || \"\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `AI API 통합을 처음부터 끝까지 도와주세요.\n\n${goal ? `목표: \"${goal}\"` : \"\"}\n${apiId ? `선택된 API: \"${apiId}\"` : \"\"}\n\n## 전체 워크플로우\n\n### Step 1: API 탐색\n${apiId ? `\"get_api_details\"로 \"${apiId}\" 상세 정보를 확인합니다.` : goal ? `\"search_api\"로 \"${goal}\"에 맞는 API를 검색합니다.` : \"사용자에게 무엇을 만들고 싶은지 물어보고, search_api로 적합한 API를 찾습니다.\"}\n\n### Step 2: API 키 설정\n- \"check_api_key\"로 키 설정 상태 확인\n- 미설정 시 단계별 발급 가이드 제공\n- 설정 후 validate: true로 유효성 검증\n\n### Step 3: 코드 생성\n- \"generate_api_code\"로 프로젝트에 맞는 코드 생성\n- SDK 방식 우선, 프레임워크 자동 감지\n- 패키지 설치 명령어 포함\n\n### Step 4: 연결 테스트\n- \"test_api_connection\"으로 실제 API 연결 확인\n- 성공하면 축하 메시지와 다음 단계 제안\n\n## 주의사항\n- 각 단계를 하나씩 진행하고, 사용자가 완료했는지 확인\n- 전문 용어는 항상 쉽게 풀어서 설명\n- 오류가 발생하면 구체적인 해결 방법 제시\n- 디자이너 관점에서 친절하게 안내`,\n },\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { registerDiscoverApiPrompt } from \"./discover-api.js\";\nimport { registerSetupApiKeyPrompt } from \"./setup-api-key.js\";\nimport { registerIntegrateApiPrompt } from \"./integrate-api.js\";\n\nexport function registerPrompts(server: McpServer) {\n registerDiscoverApiPrompt(server);\n registerSetupApiKeyPrompt(server);\n registerIntegrateApiPrompt(server);\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","server","z","server","z","server","z","server","server"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "design-all-api-mcp",
3
+ "description": "Designer-friendly AI API discovery & integration MCP Server — find the right API by intent, get setup guides, generate code, and test connections",
4
+ "version": "0.1.0",
5
+ "module": "dist/server.js",
6
+ "main": "dist/server.js",
7
+ "type": "module",
8
+ "license": "MIT",
9
+ "keywords": [
10
+ "mcp",
11
+ "model-context-protocol",
12
+ "claude",
13
+ "ai-api",
14
+ "designer",
15
+ "google-gemini",
16
+ "google-veo",
17
+ "openai",
18
+ "gpt",
19
+ "dall-e",
20
+ "sora",
21
+ "api-discovery",
22
+ "code-generation",
23
+ "korean"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/design-ai-native/design-all-api-mcp"
28
+ },
29
+ "homepage": "https://github.com/design-ai-native/design-all-api-mcp#readme",
30
+ "bugs": {
31
+ "url": "https://github.com/design-ai-native/design-all-api-mcp/issues"
32
+ },
33
+ "bin": {
34
+ "design-all-api-mcp": "dist/server.js"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
40
+ "scripts": {
41
+ "start": "node dist/server.js",
42
+ "build": "tsup",
43
+ "build:watch": "tsup --watch",
44
+ "dev": "bun run build:watch",
45
+ "test": "bun test",
46
+ "prepublishOnly": "bun run build"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/bun": "latest",
53
+ "bun-types": "^1.2.5",
54
+ "tsup": "^8.4.0",
55
+ "typescript": "^5.0.0"
56
+ },
57
+ "dependencies": {
58
+ "@modelcontextprotocol/sdk": "1.13.1",
59
+ "zod": "^4.3.6"
60
+ }
61
+ }