Skip to main content
Glama

Korean Company Information MCP Server

by SeoNaRu
DEVELOPMENT_GUIDE.mdโ€ข12.6 kB
# ๐Ÿ“š DART API ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ ์ด ๋ฌธ์„œ๋Š” DART API์˜ ๊ฐ ๊ทธ๋ฃน๋ณ„ ๊ธฐ๋Šฅ๊ณผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ## ๐Ÿ“‹ DART API ๊ทธ๋ฃน ๊ฐœ์š” ### DS001: ๊ณต์‹œ์ •๋ณด ์กฐํšŒ - **๊ธฐ๋Šฅ**: ๊ธฐ์—…์˜ ๊ณต์‹œ์ •๋ณด ๋ชฉ๋ก ๋ฐ ์ƒ์„ธ ์กฐํšŒ - **ํ˜„์žฌ ๊ตฌํ˜„**: โœ… `get_public_disclosure_tool` - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS001 ### DS002: ์žฌ๋ฌด์ •๋ณด ์กฐํšŒ - **๊ธฐ๋Šฅ**: ์žฌ๋ฌด์ œํ‘œ, ์†์ต๊ณ„์‚ฐ์„œ, ํ˜„๊ธˆํ๋ฆ„ํ‘œ ๋“ฑ ์žฌ๋ฌด์ •๋ณด ์กฐํšŒ - **ํ˜„์žฌ ๊ตฌํ˜„**: โœ… `get_financial_statement_tool`, `analyze_financial_trend_tool` - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS002 ### DS003: ๊ธฐ์—…๊ฐœํ™ฉ ์ •๋ณด - **๊ธฐ๋Šฅ**: ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด, ์ฃผ์š”์‚ฌํ•ญ, ์ž„์›์ •๋ณด ๋“ฑ - **ํ˜„์žฌ ๊ตฌํ˜„**: โœ… ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ ์™„๋ฃŒ - โœ… ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ (`get_company_overview_tool`) - โœ… ์ž„์›์ •๋ณด ์กฐํšŒ (`get_executives_tool`) - โš ๏ธ ์ฃผ์š”์‚ฌํ•ญ ์กฐํšŒ (`/majorIssues.json`) - ๋ฏธ๊ตฌํ˜„ (๋œ ์ค‘์š”) - โš ๏ธ ์‚ฌ์—…์˜ ๋‚ด์šฉ ์กฐํšŒ (`/bizrNo.json`) - ๋ฏธ๊ตฌํ˜„ (๋œ ์ค‘์š”) - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS003 ### DS004: ๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ - **๊ธฐ๋Šฅ**: ๊ณต์‹œ๋ณด๊ณ ์„œ ์›๋ฌธ(XML, PDF) ๋‹ค์šด๋กœ๋“œ - **ํ˜„์žฌ ๊ตฌํ˜„**: โœ… ๊ตฌํ˜„ ์™„๋ฃŒ (`download_disclosure_document_tool`) - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS004 ### DS005: ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ - **๊ธฐ๋Šฅ**: ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ์กฐํšŒ ๋ฐ ๋ถ„์„ - **ํ˜„์žฌ ๊ตฌํ˜„**: โœ… ๊ตฌํ˜„ ์™„๋ฃŒ (`get_major_report_tool`) - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS005 ### DS006: ๊ธฐํƒ€ ์ •๋ณด - **๊ธฐ๋Šฅ**: ์ง€๋ถ„๋ณด๊ณ ์„œ, ์ฆ๊ถŒ์‹ ๊ณ ์„œ ๋“ฑ ๊ธฐํƒ€ ๊ณต์‹œ์ •๋ณด - **ํ˜„์žฌ ๊ตฌํ˜„**: โš ๏ธ ๋ถ€๋ถ„ ๊ตฌํ˜„ - โœ… ์ง€๋ถ„๋ณด๊ณ ์„œ ์กฐํšŒ (`get_shareholders_tool`) - โš ๏ธ ์ฆ๊ถŒ์‹ ๊ณ ์„œ ์กฐํšŒ (`/securitiesReport.json`) - ๋ฏธ๊ตฌํ˜„ (๋œ ์ค‘์š”) - **๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ**: https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS006 --- ## ๐Ÿ› ๏ธ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ ### 1. DS003: ๊ธฐ์—…๊ฐœํ™ฉ ์ •๋ณด ์ถ”๊ฐ€ ๊ฐœ๋ฐœ #### 1.1 ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ ```python def get_company_overview(corp_code: str, arguments: Optional[dict] = None) -> Dict: """ ๊ธฐ์—…์˜ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /company.json """ api_url = f"{DART_API_URL}/company.json" params = { "crtfc_key": api_key, "corp_code": corp_code, } # ๊ตฌํ˜„... ``` #### 1.2 ์ž„์›์ •๋ณด ์กฐํšŒ ```python def get_executives(corp_code: str, arguments: Optional[dict] = None) -> Dict: """ ๊ธฐ์—…์˜ ์ž„์›์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /empSttus.json """ api_url = f"{DART_API_URL}/empSttus.json" # ๊ตฌํ˜„... ``` #### 1.3 ์ฃผ์š”์‚ฌํ•ญ ์กฐํšŒ ```python def get_major_issues(corp_code: str, arguments: Optional[dict] = None) -> Dict: """ ๊ธฐ์—…์˜ ์ฃผ์š”์‚ฌํ•ญ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /majorIssues.json """ api_url = f"{DART_API_URL}/majorIssues.json" # ๊ตฌํ˜„... ``` ### 2. DS004: ๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ #### 2.1 ๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ ```python def download_disclosure_document(rcept_no: str, arguments: Optional[dict] = None) -> Dict: """ ๊ณต์‹œ์›๋ฌธ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. API: /document.xml ๋˜๋Š” /document.pdf """ api_url = f"{DART_API_URL}/document.xml" params = { "crtfc_key": api_key, "rcept_no": rcept_no, } # ๊ตฌํ˜„... ``` #### 2.2 XML ํŒŒ์‹ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ ```python def parse_disclosure_xml(xml_content: bytes) -> Dict: """ ๊ณต์‹œ์›๋ฌธ XML์„ ํŒŒ์‹ฑํ•˜์—ฌ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. """ import xml.etree.ElementTree as ET root = ET.fromstring(xml_content) # ํŒŒ์‹ฑ ๋กœ์ง... ``` ### 3. DS005: ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ #### 3.1 ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ์กฐํšŒ ```python def get_major_report(corp_code: str, bgn_de: str = None, end_de: str = None, arguments: Optional[dict] = None) -> Dict: """ ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /majorReport.json """ api_url = f"{DART_API_URL}/majorReport.json" params = { "crtfc_key": api_key, "corp_code": corp_code, "bgn_de": bgn_de or (datetime.now() - timedelta(days=30)).strftime("%Y%m%d"), "end_de": end_de or datetime.now().strftime("%Y%m%d"), } # ๊ตฌํ˜„... ``` ### 4. DS006: ๊ธฐํƒ€ ์ •๋ณด ์ถ”๊ฐ€ ๊ฐœ๋ฐœ #### 4.1 ์ง€๋ถ„๋ณด๊ณ ์„œ ์กฐํšŒ ```python def get_shareholders_report(corp_code: str, arguments: Optional[dict] = None) -> Dict: """ ์ง€๋ถ„๋ณด๊ณ ์„œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /shareholders.json """ api_url = f"{DART_API_URL}/shareholders.json" # ๊ตฌํ˜„... ``` #### 4.2 ์ฆ๊ถŒ์‹ ๊ณ ์„œ ์กฐํšŒ ```python def get_securities_report(corp_code: str, arguments: Optional[dict] = None) -> Dict: """ ์ฆ๊ถŒ์‹ ๊ณ ์„œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. API: /securitiesReport.json """ api_url = f"{DART_API_URL}/securitiesReport.json" # ๊ตฌํ˜„... ``` --- ## ๐Ÿ”ง ๊ตฌํ˜„ ์˜ˆ์‹œ ### ์˜ˆ์‹œ 1: ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ ๋„๊ตฌ ์ถ”๊ฐ€ `src/tools.py`์— ์ถ”๊ฐ€: ```python def get_company_overview(corp_code: Optional[str] = None, company_name: Optional[str] = None, arguments: Optional[dict] = None) -> Dict: """ ๊ธฐ์—…์˜ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. """ # corp_code๊ฐ€ ์—†์œผ๋ฉด company_name์œผ๋กœ ๊ฒ€์ƒ‰ if not corp_code and company_name: search_result = search_company(company_name, arguments) if "error" in search_result: return {"error": f"๊ธฐ์—… ๊ฒ€์ƒ‰ ์‹คํŒจ: {search_result['error']}"} companies = search_result.get("companies", []) if not companies: return {"error": f"'{company_name}'์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ์—…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."} corp_code = companies[0].get("corp_code") if not corp_code: return {"error": "corp_code ๋˜๋Š” company_name ์ค‘ ํ•˜๋‚˜๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค."} # corp_code ์ •๊ทœํ™” corp_code = str(corp_code).strip() if corp_code.isdigit(): corp_code = corp_code.zfill(8) credentials = get_credentials(arguments) api_key = credentials["DART_API_KEY"] if not api_key: return {"error": "API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."} api_url = f"{DART_API_URL}/company.json" params = { "crtfc_key": api_key, "corp_code": corp_code, } try: response = requests.get(api_url, params=params, timeout=30) response.raise_for_status() data = response.json() if data.get("status") == "000": return { "corp_code": corp_code, "company_info": data } else: return {"error": f"DART API ์˜ค๋ฅ˜: {data.get('message', '์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜')}"} except Exception as e: logger.exception("Company overview error: %s", str(e)) return {"error": f"๊ธฐ์—…์ •๋ณด ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"} ``` `src/main.py`์— MCP ๋„๊ตฌ ์ถ”๊ฐ€: ```python @mcp.tool() async def get_company_overview_tool( corp_code: Optional[str] = None, company_name: Optional[str] = None ): """ ๊ธฐ์—…์˜ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. """ req = CompanyOverviewRequest( corp_code=corp_code, company_name=company_name ) return await get_company_overview_impl(req) ``` ### ์˜ˆ์‹œ 2: ๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ ๋„๊ตฌ ์ถ”๊ฐ€ ```python def download_disclosure_document(rcept_no: str, file_format: str = "xml", arguments: Optional[dict] = None) -> Dict: """ ๊ณต์‹œ์›๋ฌธ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. Args: rcept_no: ์ ‘์ˆ˜๋ฒˆํ˜ธ file_format: ํŒŒ์ผ ํ˜•์‹ ("xml" ๋˜๋Š” "pdf") """ credentials = get_credentials(arguments) api_key = credentials["DART_API_KEY"] if not api_key: return {"error": "API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."} api_url = f"{DART_API_URL}/document.{file_format}" params = { "crtfc_key": api_key, "rcept_no": rcept_no, } try: response = requests.get(api_url, params=params, timeout=60) response.raise_for_status() if file_format == "xml": # XML ํŒŒ์‹ฑ import xml.etree.ElementTree as ET root = ET.fromstring(response.content) # ํŒŒ์‹ฑ ๋กœ์ง... return { "rcept_no": rcept_no, "format": file_format, "content": response.text, "parsed": True } else: # PDF๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ฐ˜ํ™˜ import base64 return { "rcept_no": rcept_no, "format": file_format, "content_base64": base64.b64encode(response.content).decode('utf-8'), "size": len(response.content) } except Exception as e: logger.exception("Document download error: %s", str(e)) return {"error": f"๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"} ``` --- ## ๐Ÿ“ ๊ฐœ๋ฐœ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ### DS003 ๊ตฌํ˜„ - [x] ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ (`/company.json`) โœ… - [x] ์ž„์›์ •๋ณด ์กฐํšŒ (`/empSttus.json`) โœ… - [ ] ์ฃผ์š”์‚ฌํ•ญ ์กฐํšŒ (`/majorIssues.json`) - ์„ ํƒ์‚ฌํ•ญ - [ ] ์‚ฌ์—…์˜ ๋‚ด์šฉ ์กฐํšŒ (`/bizrNo.json`) - ์„ ํƒ์‚ฌํ•ญ ### DS004 ๊ตฌํ˜„ - [x] ๊ณต์‹œ์›๋ฌธ XML ๋‹ค์šด๋กœ๋“œ (`/document.xml`) โœ… - [x] ๊ณต์‹œ์›๋ฌธ PDF ๋‹ค์šด๋กœ๋“œ (`/document.pdf`) โœ… - [x] XML ํŒŒ์‹ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”์ถœ โœ… - [ ] PDF ํ…์ŠคํŠธ ์ถ”์ถœ (์„ ํƒ์‚ฌํ•ญ) - ํ˜„์žฌ๋Š” base64 ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋ฐ˜ํ™˜ ### DS005 ๊ตฌํ˜„ - [x] ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ์กฐํšŒ (`/majorReport.json`) โœ… - [x] ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ํ•„ํ„ฐ๋ง (๊ธฐ๊ฐ„, ์œ ํ˜•๋ณ„) โœ… ### DS006 ๊ตฌํ˜„ - [x] ์ง€๋ถ„๋ณด๊ณ ์„œ ์กฐํšŒ (`/shareholders.json`) โœ… - [ ] ์ฆ๊ถŒ์‹ ๊ณ ์„œ ์กฐํšŒ (`/securitiesReport.json`) - ์„ ํƒ์‚ฌํ•ญ - [ ] ๊ธฐํƒ€ ๊ณต์‹œ์ •๋ณด ์กฐํšŒ - ์„ ํƒ์‚ฌํ•ญ --- ## ๐Ÿ” API ์—”๋“œํฌ์ธํŠธ ์ฐธ๊ณ  ### ๊ณตํ†ต ํŒŒ๋ผ๋ฏธํ„ฐ - `crtfc_key`: ์ธ์ฆํ‚ค (ํ•„์ˆ˜) - `corp_code`: ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ (8์ž๋ฆฌ, ํ•„์ˆ˜) - `bgn_de`: ์‹œ์ž‘์ผ (YYYYMMDD ํ˜•์‹) - `end_de`: ์ข…๋ฃŒ์ผ (YYYYMMDD ํ˜•์‹) ### ์‘๋‹ต ํ˜•์‹ ```json { "status": "000", // "000": ์„ฑ๊ณต, "013": ๋ฐ์ดํ„ฐ ์—†์Œ, ๊ธฐํƒ€: ์˜ค๋ฅ˜ "message": "์ •์ƒ", "list": [...] // ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด } ``` ### ์˜ค๋ฅ˜ ์ฝ”๋“œ - `000`: ์ •์ƒ - `010`: ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ํ‚ค - `011`: ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ‚ค - `012`: ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” IP - `013`: ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - `020`: ์š”์ฒญ ์ œํ•œ ์ดˆ๊ณผ --- ## ๐Ÿš€ ๊ฐœ๋ฐœ ํŒ ### 1. ์บ์‹ฑ ์ „๋žต ```python # ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด๋Š” ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธด TTL ์‚ฌ์šฉ company_overview_cache = TTLCache(maxsize=100, ttl=86400 * 7) # 7์ผ # ๊ณต์‹œ์ •๋ณด๋Š” ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋ฏ€๋กœ ์งง์€ TTL ์‚ฌ์šฉ disclosure_cache = TTLCache(maxsize=100, ttl=3600) # 1์‹œ๊ฐ„ ``` ### 2. ์—๋Ÿฌ ํ•ธ๋“ค๋ง ```python try: response = requests.get(api_url, params=params, timeout=30) response.raise_for_status() data = response.json() if data.get("status") == "000": return {"data": data.get("list", [])} elif data.get("status") == "013": return {"error": "์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."} else: return {"error": f"DART API ์˜ค๋ฅ˜: {data.get('message')}"} except requests.exceptions.Timeout: return {"error": "API ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ"} except requests.exceptions.RequestException as e: return {"error": f"API ์š”์ฒญ ์‹คํŒจ: {str(e)}"} ``` ### 3. ๋กœ๊น… ```python logger.debug("API request | url=%s params=%s", api_url, {k: v if k != "crtfc_key" else v[:6] + "***" for k, v in params.items()}) logger.info("API response | status=%s items=%d", data.get("status"), len(data.get("list", []))) ``` --- ## ๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ - [DART API ๊ณต์‹ ๋ฌธ์„œ](https://opendart.fss.or.kr/guide/main.do) - [DART API ๊ทธ๋ฃน๋ณ„ ๊ฐ€์ด๋“œ](https://opendart.fss.or.kr/guide/main.do?apiGrpCd=DS001) - [Python requests ๋ฌธ์„œ](https://requests.readthedocs.io/) - [FastMCP ๋ฌธ์„œ](https://github.com/jlowin/fastmcp) --- ## ๐Ÿ’ก ๋‹ค์Œ ๋‹จ๊ณ„ 1. **DS003 ๊ตฌํ˜„**: ๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด, ์ž„์›์ •๋ณด ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ 2. **DS004 ๊ตฌํ˜„**: ๊ณต์‹œ์›๋ฌธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ํŒŒ์‹ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ 3. **DS005 ๊ตฌํ˜„**: ์ฃผ์š”์‚ฌํ•ญ๋ณด๊ณ ์„œ ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ 4. **DS006 ๊ตฌํ˜„**: ์ง€๋ถ„๋ณด๊ณ ์„œ, ์ฆ๊ถŒ์‹ ๊ณ ์„œ ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ 5. **ํ…Œ์ŠคํŠธ**: ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ 6. **๋ฌธ์„œํ™”**: README ๋ฐ API ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ --- **Happy Coding! ๐Ÿš€**

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SeoNaRu/company-info-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server