만든 플러그인을 더 많은 사람과 공유하고 싶다면 플러그인 디렉터리에 게시하세요. 사용자는 디렉터리에서 플러그인을 찾아 ChatGPT와 Codex에서 사용할 수 있습니다. 플러그인에는 MCP 연결과 스킬 중 하나 또는 둘 다 포함할 수 있습니다.
만들어 둔 패키지를 ZIP으로 업로드하고 자동 검사에서 발견된 문제를 해결한 다음 심사를 요청하세요. 승인 후에는 원하는 시점에 게시할 수 있습니다.
처음 게시한 후에는 MCP 서버의 변경 사항이 자동으로 감지되고, 자동 반영 대상인 업데이트는 검사를 통과하면 실제 서비스에 적용됩니다. 서버를 업데이트할 때마다 새 플러그인 ZIP을 업로드하거나 별도로 게시할 필요는 없습니다. 플러그인 메타데이터나 스킬을 변경할 때는 새 ZIP이 필요합니다.
제출하기 전에 플러그인 패키지 가이드에 따라 패키지를 준비하고 플러그인 가이드라인을 읽어 보세요. 제출 준비에 도움이 필요하면 플러그인 디렉터리에서 Plugin Creator를 사용하세요.

플러그인 개요. 플러그인 페이지에서 제출 절차를 시작하고 게시 상태, 심사 진행 상황, MCP 설정 상태를 확인하세요.
원격 MCP 서버를 제출하려면 MCP 포함을 선택하고 안정적으로 접속할 수 있는 공개 HTTPS 엔드포인트를 사용하세요. 플러그인이 로컬 MCP 서버를 실행하거나 데스크톱에서 실행되어야 한다면 데스크톱 전용 플러그인 제출을 참조하세요.
1. 플러그인 ZIP 업로드
권한 및 게시자 신원 확인
플러그인을 소유할 조직과 프로젝트를 선택하세요. 조직 소유자는 플러그인을 제출할 수 있습니다. 다른 구성원은 Apps Management Write 권한이 필요하며, 소유자가 조직 역할에서 이 권한을 부여할 수 있습니다.
개인 이름이나 회사 이름으로 게시하려면 조직 설정에서 개인 또는 사업자 인증을 완료하세요.
초안 만들기
플러그인이 MCP 서버를 사용한다면 처음 업로드하는 ZIP에 서버를 포함하세요. 현재는 스킬만 포함된 기존 플러그인에 MCP 서버를 추가하는 기능을 지원하지 않습니다.
- 플러그인을 열고 새 플러그인 또는 기존 플러그인 업로드를 선택하세요.
- 인증을 마친 개발자 신원을 선택하세요. 이 신원에 등록된 이름이 디렉터리에 표시됩니다.
- 플러그인 업로드를 선택하고 ZIP 파일을 선택하세요.
- 검증을 통과하면 플러그인 상세 페이지가 열리고 새 초안이 표시됩니다.
검증에 실패하면 표시된 패키지 오류를 수정하고 다시 업로드하세요. ZIP에 비공개 자격 증명이나 비밀 정보를 넣지 마세요.
2. 검사 결과 확인 및 문제 해결
ZIP을 업로드하면 플러그인 상세 페이지에 자동 검사 진행 상황과 결과가 표시됩니다. 심사를 요청하기 전에 여기서 문제를 해결할 수 있습니다. 메타데이터 및 스킬에는 업로드한 플러그인 패키지 버전이, MCP에는 연결된 서버와 스캔으로 찾은 도구가 표시됩니다. 패키지를 변경하면 새 ZIP을 업로드해야 하지만 호스팅된 도구의 변경 사항은 서버에서 직접 검사하므로 두 항목이 구분되어 있습니다.
메타데이터 확인
- 메타데이터 및 스킬을 여세요. 가장 최근에 업로드한 버전이 자동으로 표시됩니다.
- 메타데이터 검사가 끝나면 문제 항목에서 발견된 문제가 있는지 확인하세요.
- 문제 복사를 선택해 검사 결과를 개발 워크플로우에서 활용하세요.
- 패키지에서 해당 필드를 수정한 다음 플러그인을 업로드하여 문제 해결을 선택하고 수정한 ZIP을 업로드하세요. 새 검사 결과를 확인하세요.
팁: Codex나 ChatGPT에 패키지와 복사한 검사 결과를 살펴보고 문제를 설명한 뒤 메타데이터나 스킬의 수정 방법을 제안해 달라고 요청하세요.

메타데이터 검사 결과. 선택한 패키지 버전의 검사 결과를 확인하고 수정한 ZIP을 업로드하세요.
이 화면에서 패키지 세부 정보는 읽기 전용입니다. 패키지 필드 참조를 참고해 원본 패키지에서 수정하세요. 공개 URL은 외부에서 접속할 수 있어야 하며, 해당 URL에서 확인되는 게시자가 제출 정보의 게시자와 일치해야 합니다.
스킬 확인
패키지에 스킬이 포함되어 있다면 메타데이터 및 스킬에서 검사 결과를 확인하세요. 결과 항목을 열어 어떤 스킬의 무엇을 수정해야 하는지 확인한 다음 해당 스킬의 지침이나 관련 파일을 수정하고 수정한 ZIP을 업로드하세요. 갱신된 검사 결과를 확인하세요. 필수 스킬 스캔이 성공적으로 끝나야 제출할 수 있습니다.
MCP 서버 연결 및 스캔
패키지에는 여러 MCP 서버를 선언할 수 있지만 플러그인당 하나의 MCP 서버만 연결할 수 있습니다. 서버를 처음 연결할 때 아래 절차에 따라 설정하세요. 연결에 문제가 있으면 다시 연결을 사용하세요. 도구를 변경했다면 최신 변경 사항 스캔을 따르세요.
- MCP를 열고 연결할 서버를 선택하세요.
- 연결을 선택해 MCP 서버 연결을 여세요.
- MCP 서버 URL, 인증 및 해당 설정을 확인하세요.
- 포털에 표시된 도메인 검증 챌린지를 완료한 다음 서버에 연결하고 필요한 경우 인증을 완료하세요.
- 자동 도구 스캔이 끝나면 발견된 도구를 확인하세요. 문제를 열어 검사 결과를 확인하세요.
- 연결 문제나 서버 측에서 발견된 문제를 해결하세요. 상황에 따라 다시 연결 또는 다시 스캔을 선택하고 새 결과를 확인하세요.

MCP 연결 및 도메인 검증. 서버에 연결하고 도메인 검증을 완료한 다음 발견된 도구를 확인하세요.
승인된 로컬 MCP 플러그인의 경우 스킬만을 선택하고 데스크톱 전용 플러그인 제출 안내를 따르세요.
양식을 작성하는 동안 포털은 제출 내용을 초안으로 저장합니다.
연결이나 스캔에 실패하면 엔드포인트에 접속할 수 있는지와 인증 설정을 확인한 다음 다시 연결하거나 스캔하세요. 제출하기 전에 MCP 설정 완료 항목에 표시된 문제와 연결 오류를 해결하세요. MCP 서버 URL, 인증, 도구 메타데이터 및 UI 요구 사항은 플러그인 가이드라인을 참조하세요.
제출을 위한 인증 설정
포털은 패키지의 mcp.json에서 고급 인증 설정을 읽습니다. MCP 인증 참조에 따라 인증 방식, OAuth 클라이언트 등록 방식, 엔드포인트 및 범위를 설정하세요. 연결 패널에서는 이 설정을 확인할 수 있지만 고급 OAuth 설정을 편집할 수는 없습니다.
설정을 변경하려면 mcp.json을 수정하고 새 버전 업로드를 선택한 다음 연결하기 전에 MCP에서 저장된 설정을 확인하세요. 이미 등록된 클라이언트는 자격 증명 변경이 제한될 수 있습니다. 업로드하면 기존 클라이언트가 교체된다고 가정하지 말고 저장된 연결 정보를 확인하세요.
OAuth를 사용한다면 공급자가 지원하는 등록 방식을 선택하세요.
| 등록 방식 | 제공할 정보 |
|---|---|
사전 등록 클라이언트(provided) |
mcp.json에 클라이언트 ID와 토큰 엔드포인트 인증 방식을 선언하세요. 필요한 경우 포털에 클라이언트 시크릿을 입력하세요. |
동적 클라이언트 등록(dcr) |
자동 검색으로 등록 엔드포인트를 제공하거나 registrationUrl로 직접 지정하세요. 패키지에 클라이언트 자격 증명을 넣지 마세요. |
클라이언트 식별자 메타데이터 문서(cimd) |
CIMD 우선 사용 여부를 설정하세요. 런타임은 등록 정책에 따라 DCR을 대체 방식으로 사용할 수 있습니다. |
사전 등록 클라이언트를 사용하는 경우 다음 절차를 따르세요.
- 연결 플로우에서 사용하는 콜백 URL을 OAuth 공급자에 등록하세요.
- MCP를 열고 서버를 선택한 다음 연결을 선택하세요.
- 클라이언트에 시크릿이 필요하면 OAuth 클라이언트 시크릿을 입력하세요. 사전 등록된 OAuth 클라이언트에서는
tokenEndpointAuthMethod가"none"이 아닌 경우 이 필드가 표시됩니다. - 필요한 경우 도메인 검증을 완료하고 연결을 선택한 다음 서버 연결 및 스캔에 사용할 계정으로 접근을 승인하세요.
- 스캔이 끝나면 연결이나 도구에서 발견된 문제를 해결하세요.
클라이언트 시크릿을 mcp.json에 넣지 마세요. 매니페스트는 clientSecret을 허용하지 않습니다. 클라이언트 시크릿은 OAuth 애플리케이션을 인증하는 데 사용됩니다. 계정 비밀번호, 액세스 토큰 또는 심사자 로그인 자격 증명과는 다릅니다.
OAuth 자동 검색으로 필요한 엔드포인트를 찾지 못하면 authorizationUrl과 tokenUrl을 mcp.json에 추가해 직접 지정하세요. 클라이언트 ID, 토큰 엔드포인트 인증 방식, 범위 및 콜백 URL이 공급자 설정과 일치하는지 확인하세요.
인증 제한 사항
포털 연결 양식은 인증 없음, OAuth, 그리고 인증 없는 접근과 OAuth 접근을 함께 사용하는 혼합 방식을 지원합니다. 매니페스트 스키마는 API 키 인증을 허용하지만 포털은 API 키 연결 플로우나 Bearer 토큰 입력 필드를 제공하지 않습니다. Basic 방식이나 사용자 지정 헤더를 사용하는 API 키 선언에도 같은 제한이 적용됩니다. API 키 선언을 업로드하는 것만으로는 MCP 설정을 완료할 수 없습니다. 제출하려는 플러그인에 이 인증 방식이 필요하면 OpenAI에 문의하세요.
이 제한을 우회하기 위해 서버 headers에 토큰을 넣지 마세요. 공개 제출 시 값이 있는 서버 헤더는 허용되지 않습니다. 인증이 필요한 서버를 type: "none"으로 설정하지 마세요.
사전 등록된 OAuth 클라이언트의 경우 스키마는 private_key_jwt를 허용하지만 이 값만으로는 서명 키가 설정되지 않습니다. 이 포털 가이드에서는 서명 키 설정 절차를 다루지 않습니다. 이 방식으로 제출하려면 먼저 OpenAI에 필요한 설정을 확인하세요.
도메인 검증 세부 정보
도메인을 검증하려면 포털에 표시된 URL에서 챌린지 토큰을 일반 텍스트로 그대로 제공하세요.
https://<challenge-base-host>/.well-known/openai-apps-challenge
응답에는 정확한 토큰 하나만 포함하세요. JSON이나 토큰 목록은 허용되지 않습니다. 챌린지의 기준 주소는 MCP 호스트 이름이나 사용 가능한 상위 도메인의 HTTPS 오리진이어야 합니다. 경로는 무시됩니다. 다른 플러그인이 같은 챌린지 URL을 사용하고 있다면 기존 토큰을 교체하지 말고 허용된 상위 오리진이나 별도 호스트 이름을 사용하세요. 두 방법 모두 사용할 수 없으면 지원팀에 문의하세요.
3. 심사 요청
자동 검사 결과를 확인한 다음 심사팀이 플러그인을 테스트하는 데 필요한 정보를 작성하고 선택한 초안을 제출하세요. 필수 설정을 완료하고 검증 오류를 먼저 해결해야 합니다. 그 밖의 자동 검사 결과는 심사팀에 보내 검토를 요청할 수 있습니다.
심사 정보 작성
MCP 연결이 있는 플러그인에는 심사팀이 연동 기능을 테스트할 수 있도록 심사 정보를 제공해야 합니다. 긍정 및 부정 테스트 케이스, 시연 동영상 URL, 릴리스 노트를 plugin.json에 넣으면 ZIP 업로드 시 함께 가져옵니다. 심사 및 게시 필드 참조와 전체 메타데이터 예시를 참조하세요. 플러그인 디렉터리의 Plugin Creator를 사용하면 이 정보를 준비하는 데 도움이 됩니다. 심사자 자격 증명은 심사 세부 정보에 별도로 입력하세요. 다음 자료를 준비하세요.
- 로그인이 필요한 경우 심사자 자격 증명. 전용 테스트 계정, 로그인 URL, 워크스페이스 또는 테넌트 정보, 로그인 방법을 제공하세요. 실제 사용자 계정을 사용하지 말고 테스트 계정에 샘플 데이터를 준비하세요. 테스트 계정에는 각 테스트 케이스에 필요한 권한과 데이터가 있어야 합니다. 다중 인증(MFA) 승인, 이메일 또는 SMS 코드, 매직 링크, 비공개 네트워크 접속 없이 즉시 사용할 수 있어야 합니다.
- 긍정 테스트 케이스 5개. 시나리오, 사용자 프롬프트, 호출될 것으로 예상하는 도구와 예상 결과를 포함하세요. 제출 전에 테스트 계정으로 각 케이스를 실행하세요.
- 부정 테스트 케이스 3개. 플러그인이 동작하지 않아야 하는 프롬프트나 시나리오, 해당 요청을 수행하지 않아야 하는 이유, 예상되는 거절 응답이나 확인 질문 또는 안전한 대체 동작을 포함하세요.
- 시연 동영상. 테스트 케이스와 플러그인 기능을 시연하고 심사자가 열 수 있는 녹화 영상 URL을 제공하세요.
- 릴리스 노트. 제출할 패키지 버전과 변경 사항을 요약하세요.
메타데이터 및 스킬에서 심사 정보 → 심사 세부 정보를 열고 가져온 자료를 확인한 다음 심사자 자격 증명을 입력하세요. 편집 가능한 필드를 작성하고 세부 정보 저장을 선택하세요. 플러그인 ZIP에서 관리한다고 표시된 필드는 패키지에 정보를 추가하거나 수정한 다음 다시 업로드하세요. 제공 국가와 번역도 패키지 메타데이터에 지정할 수 있습니다. 해당하는 경우 가져온 설정을 확인하세요. 지원되는 필드와 가져오기 방식은 제출 및 심사 정보 자동 입력을 참조하세요.

심사 세부 정보. ZIP에서 가져온 테스트 케이스와 관련 자료를 확인하고 비공개 심사자 자격 증명은 별도로 입력하세요.
자격 증명은 공개 패키지에 포함되지 않습니다. 이후 심사에서도 테스트 계정과 샘플 데이터를 사용할 수 있도록 유지하세요. 자격 증명이나 로그인 절차가 바뀌면 새 정보를 반영한 초안을 제출하세요.
초안 제출
초안을 선택한 다음 심사 요청을 선택하고 필수 정책 준수 확인을 완료하세요. 제출 후에는 플러그인 페이지의 심사 상태에서 진행 상황을 확인할 수 있습니다. 심사팀의 피드백은 이메일로 전송됩니다.

심사 요청. 필수 확인 항목을 검토하고 선택한 초안을 심사에 제출하세요.
플러그인당 한 번에 하나의 심사만 진행할 수 있습니다. 심사 중인 패키지를 교체하려면 심사 결과를 기다리거나 심사를 취소한 다음 업로드하세요. 패키지가 반려되면 피드백을 반영해 수정한 ZIP을 제출하세요.
심사팀이 제출을 반려하면 반려 안내 이메일에서 사유를 확인하세요. 이의를 제기하려면 해당 이메일에 답장하여 결정을 재검토해야 하는 이유를 설명하세요.
4. 승인된 플러그인 게시
플러그인이 승인되면 원하는 시점에 공개할 수 있습니다. 승인된 패키지 버전을 열고 플러그인 게시를 선택하세요. 업데이트를 게시하면 이전 패키지 버전이 교체됩니다.
게시한 플러그인 업데이트
메타데이터, 에셋 또는 패키지에 포함된 스킬을 업데이트하려면 기존 플러그인에 새 ZIP을 업로드하세요. 그러면 새 패키지 버전이 생성되고 해당 버전에 대해 별도로 검사와 심사가 진행됩니다. 호스팅된 도구의 변경 사항은 MCP 스캔으로 별도 처리되므로 패키지를 업로드할 필요가 없습니다.
이전 제출 양식으로 제출했다면 먼저 기존 플러그인을 ZIP으로 다운로드하세요. 플러그인을 열고 게시된 패키지 버전을 선택한 다음 릴리스 ZIP 다운로드를 … 메뉴에서 선택하세요. 이미 패키지를 로컬에서 관리하고 있다면 해당 원본을 사용해도 됩니다.
- 패키지 내용과 버전 번호를 업데이트한 다음 유지할 구성 요소를 모두 포함한 ZIP을 만드세요.
- 기존 플러그인을 열고 플러그인을 업로드하여 변경을 선택하세요.
- 메타데이터 및 스킬에서 선택한 패키지 버전을 확인하세요. 새 자동 검사 결과를 검토하고 반드시 해결해야 하는 문제를 수정하세요.
- 해당하는 심사 절차를 완료하고 승인된 패키지 버전을 게시하세요.
스킬을 추가하거나 제거할 때는 같은 플러그인을 사용하세요. 현재 업데이트 플로우에서는 기존 MCP 서버의 URL 변경을 지원하지 않습니다. URL을 변경하려면 지원팀에 문의하세요.
MCP 서버 업데이트
처음 게시한 후 OpenAI는 호스팅된 MCP 서버를 매일 스캔합니다. 자동 반영 대상인 업데이트는 자동 검사를 통과하면 새 패키지 버전이나 별도 게시 절차 없이 사용할 수 있습니다. 서버 변경 사항을 배포한 직후 직접 스캔을 요청할 수도 있습니다.
최신 변경 사항 스캔
- MCP 서버에 변경 사항을 배포하세요.
- 기존 플러그인을 열고 MCP를 선택한 다음 연결된 서버를 선택하세요.
- 문제에서 다시 스캔을 선택하세요.
- 스캔이 끝나면 결과와 도구 사용 가능 여부를 확인하세요.

MCP 스캔 개요. 서버를 변경한 후 다시 스캔하고 결과와 각 도구의 사용 가능 여부를 확인하세요.
다른 스캔이나 이의 심사가 진행 중이거나 플러그인이 스캔 대상이 아닌 경우에는 다시 스캔 기능이 비활성화될 수 있습니다.
도구 문제 확인 및 해결
- 문제를 열고 문제가 발생한 도구를 선택하세요.
- 발견된 문제를 읽고 보류된 업데이트에서 평가 대상이 된 메타데이터를 확인하세요. 현재 적용된 정의에는 현재 사용 중인 메타데이터가 표시됩니다.
- 문제 복사를 선택해 검사 결과를 개발 워크플로우에서 활용하세요.
- 서버에서 도구 메타데이터나 구현을 수정하고 변경 사항을 배포하세요.
- 문제로 돌아가 다시 스캔을 선택하고 갱신된 결과를 확인하세요.
팁: Codex나 ChatGPT에 MCP 서버와 복사한 오류를 살펴보고 문제를 설명한 뒤 수정 방법을 제안해 달라고 요청하세요.
도구 변경 사항은 개별적으로 평가됩니다. 한 도구의 변경 사항에서 문제가 발견되어도 다른 도구의 적용 가능한 업데이트까지 차단되는 것은 아닙니다. 새 도구는 승인될 때까지 사용할 수 없습니다. 기존 도구의 업데이트가 보류되면 이전에 승인된 메타데이터가 유지됩니다. 도구를 제거하면 스캔 후에 반영됩니다.
업데이트된 메타데이터가 실제 서비스에 반영될 때까지 MCP 서버와 현재 승인된 도구 스키마 간의 호환성을 유지하세요.
자동 검사 결과에 이의 제기
도구 검사 결과가 잘못되었다고 판단하면 이의 제기를 선택하고 심사팀이 결과를 재검토해야 하는 이유를 설명하세요. 심사팀은 해당 스캔에서 보류된 도구 변경 사항을 함께 검토합니다. 검사 결과가 타당하다면 대개 서버에서 문제를 수정하고 다시 스캔하는 편이 빠릅니다.

MCP 이의 제기. 심사팀이 자동 검사 결과를 재검토해야 하는 이유를 설명하세요.
이의 심사가 진행되는 동안 MCP 자동 업데이트는 일시 중지됩니다. 변경하려면 이의 제기 철회를 선택하고 서버를 업데이트한 다음 다시 스캔하세요. 이의 제기 대상은 보류된 도구 변경 사항입니다. 패키지 변경 사항, 인증, 공유 서버 지침은 대상에 포함되지 않습니다.
문제 해결 방법은 제출 오류를 참조하세요. 지원팀에 문의할 때는 플러그인 ID를 포함하세요.
제출 및 심사 정보 자동 입력
디렉터리 등록 정보, 심사 정보 및 게시 정보를 플러그인 매니페스트에 넣으면 ZIP을 업로드할 때 자동으로 입력됩니다. 아래에서 지원되는 필드, 업로드 시 값이 적용되는 방식, 패키지 형식별 예시를 확인하세요.
앱 참조(apps / .app.json) 또는 수명 주기 훅이 포함된 플러그인 ZIP 패키지는 현재 제출할 수 없습니다. MCP 설정에 MCP 서버 URL을 선언하고 대시보드에서 설정을 완료하세요.
공개 디렉터리에 제출하기 전에 수명 주기 훅을 제거하세요. 플러그인 실행에 수명 주기 훅이 필요하면 사용자가 데스크톱용 Codex에서 수동으로 설치할 수 있도록 배포하세요.
전체 메타데이터 예시
아래 예시는 동일한 예제 노트 플러그인을 두 가지 형식으로 작성한 것입니다. 사용하는 형식에 맞는 매니페스트를 복사한 다음 게시자 정보, URL, 도구 이름, 심사용 테스트 케이스, 번역, 제공 국가를 실제 값으로 바꾸세요. 예제 테스트 케이스는 실제 서비스에서 실행한 것이 아닙니다.
매니페스트에서 참조하는 다음 파일을 포함하세요.
skills/get-started/SKILL.md파일. YAML 헤더에 유효한 name 및 description 필드가 있어야 합니다.assets/에 있는 아이콘 파일 4개.- 이름이 notes인 원격 MCP 서버 하나의 설정. Agent Plugins의 경우
mcp.json에, Codex의 경우.mcp.json에 아래 예시 중 형식에 맞는 설정을 넣으세요.
데모 및 심사용 첨부 자료에는 실제로 접속할 수 있는 자체 URL을 사용하세요. example.com 링크는 URL 형식을 보여 주는 예시이므로 제출 자료로 사용할 수 없습니다. 스킬만 포함된 플러그인이라면 review와 MCP 설정을 생략하고 Codex 매니페스트에서 mcpServers도 생략하세요.
Agent Plugins 예시에는 다음 mcp.json을 함께 사용하세요.
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
"mcpServers": {
"notes": {
"type": "streamable-http",
"url": "https://example.com/mcp"
}
}
}
Codex 예시에서는 다음 내용을 플러그인 루트에 .mcp.json으로 저장하세요. 이 형식에서는 Agent Plugins 스키마를 생략합니다.
{
"mcpServers": {
"notes": {
"url": "https://example.com/mcp"
}
}
}
Agent Plugins 형식
다음 매니페스트 전체를 플러그인 루트에 plugin.json으로 저장하세요.
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "acme-notes",
"version": "1.0.0",
"description": "Search and summarize notes from your Acme workspace.",
"author": {
"name": "Acme",
"email": "support@example.com",
"url": "https://example.com"
},
"homepage": "https://example.com/notes",
"repository": "https://github.com/example/acme-notes",
"license": "MIT",
"keywords": ["notes", "search", "productivity"],
"extensions": {
"com.openai": {
"interface": {
"displayName": "Acme Notes",
"shortDescription": "Find and summarize your notes",
"longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
"developerName": "Acme",
"category": "Productivity",
"capabilities": ["Search notes", "Read notes"],
"websiteURL": "https://example.com/notes",
"supportURL": "https://example.com/support",
"privacyPolicyURL": "https://example.com/privacy",
"termsOfServiceURL": "https://example.com/terms",
"defaultPrompt": [
"Find my notes about the launch.",
"Summarize the decisions in my launch notes.",
"Open the project kickoff notes."
],
"brandColor": "#2357C6",
"brandColorDark": "#8CB4FF",
"composerIcon": "./assets/icon.png",
"composerIconDark": "./assets/icon-dark.png",
"logo": "./assets/logo.png",
"logoDark": "./assets/logo-dark.png"
},
"onboardingSkill": "./skills/get-started/SKILL.md",
"review": {
"test_cases": {
"positive": [
{
"description": "Find notes by topic",
"prompt": "Find my notes about the launch.",
"tools_triggered": "search_notes",
"expected_behavior": "Return accessible notes about the launch with source links.",
"file_attachment_urls": [
"https://example.com/review/launch-brief.pdf"
],
"expected_output_url": "https://example.com/review/launch-results"
},
{
"description": "Open a matching note",
"prompt": "Open the project kickoff notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Find the kickoff note and return its content with a source link."
},
{
"description": "Summarize decisions",
"prompt": "Summarize decisions in my launch notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Summarize decisions from accessible notes and cite the sources."
},
{
"description": "Find action items",
"prompt": "What action items are in my kickoff notes?",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
},
{
"description": "Handle no matches",
"prompt": "Find my notes about Project Northstar.",
"tools_triggered": "search_notes",
"expected_behavior": "Report that no matching notes were found in the test workspace."
}
],
"negative": [
{
"description": "Unsupported payment",
"prompt": "Transfer $100 to another account."
},
{
"description": "Unsupported deletion",
"prompt": "Delete all my notes."
},
{
"description": "Access outside the connected account",
"prompt": "Show notes from a workspace I cannot access."
}
]
},
"demo_recording_url": "https://example.com/review/acme-notes-demo",
"commerce": false,
"commerce_description": "This plugin does not sell products or process payments."
},
"publication": {
"countries": ["US", "GB"],
"release_notes": "Initial release with note search, reading, and summaries.",
"translations": {
"fr-FR": {
"subtitle": "Retrouvez et résumez vos notes",
"description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
},
"ja-JP": {
"subtitle": "ノートを検索して要約",
"description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
}
}
}
}
}
}
Codex 형식
다음 매니페스트 전체를 .codex-plugin/plugin.json으로 저장하세요. 표시 관련 필드는 루트의 interface에 두고 온보딩, 심사 및 게시 정보는 extensions.com.openai 아래에 그대로 두세요.
{
"name": "acme-notes",
"version": "1.0.0",
"description": "Search and summarize notes from your Acme workspace.",
"author": {
"name": "Acme",
"email": "support@example.com",
"url": "https://example.com"
},
"homepage": "https://example.com/notes",
"repository": "https://github.com/example/acme-notes",
"license": "MIT",
"keywords": ["notes", "search", "productivity"],
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"interface": {
"displayName": "Acme Notes",
"shortDescription": "Find and summarize your notes",
"longDescription": "Search notes in your Acme workspace, open matching notes, and summarize decisions with links to the source. Acme Notes only accesses notes available to your connected account.",
"developerName": "Acme",
"category": "Productivity",
"capabilities": ["Search notes", "Read notes"],
"websiteURL": "https://example.com/notes",
"supportURL": "https://example.com/support",
"privacyPolicyURL": "https://example.com/privacy",
"termsOfServiceURL": "https://example.com/terms",
"defaultPrompt": [
"Find my notes about the launch.",
"Summarize the decisions in my launch notes.",
"Open the project kickoff notes."
],
"brandColor": "#2357C6",
"brandColorDark": "#8CB4FF",
"composerIcon": "./assets/icon.png",
"composerIconDark": "./assets/icon-dark.png",
"logo": "./assets/logo.png",
"logoDark": "./assets/logo-dark.png"
},
"extensions": {
"com.openai": {
"onboardingSkill": "./skills/get-started/SKILL.md",
"review": {
"test_cases": {
"positive": [
{
"description": "Find notes by topic",
"prompt": "Find my notes about the launch.",
"tools_triggered": "search_notes",
"expected_behavior": "Return accessible notes about the launch with source links.",
"file_attachment_urls": [
"https://example.com/review/launch-brief.pdf"
],
"expected_output_url": "https://example.com/review/launch-results"
},
{
"description": "Open a matching note",
"prompt": "Open the project kickoff notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Find the kickoff note and return its content with a source link."
},
{
"description": "Summarize decisions",
"prompt": "Summarize decisions in my launch notes.",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "Summarize decisions from accessible notes and cite the sources."
},
{
"description": "Find action items",
"prompt": "What action items are in my kickoff notes?",
"tools_triggered": "search_notes, read_note",
"expected_behavior": "List the action items recorded in the notes without inventing owners or deadlines."
},
{
"description": "Handle no matches",
"prompt": "Find my notes about Project Northstar.",
"tools_triggered": "search_notes",
"expected_behavior": "Report that no matching notes were found in the test workspace."
}
],
"negative": [
{
"description": "Unsupported payment",
"prompt": "Transfer $100 to another account."
},
{
"description": "Unsupported deletion",
"prompt": "Delete all my notes."
},
{
"description": "Access outside the connected account",
"prompt": "Show notes from a workspace I cannot access."
}
]
},
"demo_recording_url": "https://example.com/review/acme-notes-demo",
"commerce": false,
"commerce_description": "This plugin does not sell products or process payments."
},
"publication": {
"countries": ["US", "GB"],
"release_notes": "Initial release with note search, reading, and summaries.",
"translations": {
"fr-FR": {
"subtitle": "Retrouvez et résumez vos notes",
"description": "Recherchez des notes dans votre espace Acme, ouvrez les résultats et résumez les décisions avec des liens vers les sources. Acme Notes accède uniquement aux notes disponibles pour votre compte connecté."
},
"ja-JP": {
"subtitle": "ノートを検索して要約",
"description": "Acmeワークスペース内のノートを検索し、該当するノートを開き、参照元へのリンク付きで決定事項を要約します。Acme Notesは、接続されたアカウントで閲覧できるノートにのみアクセスします。"
}
}
}
}
}
}
패키지에 맞는 구성을 선택하세요.
| 메타데이터 | Agent Plugins의 루트 plugin.json | Codex의 .codex-plugin/plugin.json |
|---|---|---|
| 패키지 식별 정보 및 게시자 | 루트 필드 | 루트 필드 |
| 디렉터리 등록 문구, 링크, 프롬프트 및 이미지 | extensions.com.openai.interface |
interface |
| 시작하기 스킬 | extensions.com.openai.onboardingSkill | extensions.com.openai.onboardingSkill |
| 심사 및 게시 세부 정보 | extensions.com.openai.review 및 extensions.com.openai.publication | extensions.com.openai.review 및 extensions.com.openai.publication |
Agent Plugins 패키지에서는 plugin.json의 extensions.com.openai 아래에 OpenAI 전용 설정을 넣으세요. 이 객체가 있으면 OpenAI는 .codex-plugin/plugin.json의 설정을 무시합니다. 두 파일의 설정을 병합하지 않습니다. 객체가 없으면 OpenAI는 .codex-plugin/plugin.json에서 해당 설정을 읽습니다. 어느 경우든 패키지 식별 정보는 루트의 plugin.json에서, 스킬은 skills/에서, MCP 서버는 mcp.json에서 가져옵니다.
전체 메타데이터 예시를 바탕으로 작성하세요. 개발자 대시보드에 개인정보 보호 정책 URL, 지원 URL 또는 앱 아이콘이 누락되었다고 표시되면 필드 참조에서 해당 매니페스트 필드를 찾으세요.
매니페스트 필드
요구 사항 열에서는 패키지 형식에 따른 요구 사항과 제출에 필요한 요구 사항을 구분합니다. ZIP에 심사 세부 정보를 넣는 것은 선택 사항이지만, 제출 전에는 필수 자료를 모두 제공해야 합니다.
패키지 식별 정보 및 구성 요소
다음 필드는 패키지 자체를 설명합니다. 표에 OpenAI 확장 필드라고 명시된 경우를 제외하고 두 형식 모두 매니페스트 루트에 두세요.
| 필드 | 요구 사항 | 값과 용도 |
|---|---|---|
$schema |
Agent Plugins에서는 필수, Codex에서는 생략 | 이식 가능한 형식에서는 https://agent-plugins.org/schemas/1.0.0/plugin.schema.json 값을 사용해야 합니다. 독립형 Codex 호환 매니페스트에서는 생략하세요. |
name |
필수 | 변경되지 않는 필수 식별자이며 최대 64자입니다. 제출할 패키지에는 영문 소문자, 숫자, 연속되지 않는 하이픈을 사용하세요. 표시 이름과 구분하세요. |
version |
Codex에서는 필수, 이식 가능한 스키마에서는 선택 | 1.0.0과 같은 릴리스 버전입니다. 이식 가능한 스키마에서는 선택 사항이지만 제출 및 업데이트 시에는 시맨틱 버전을 명시하세요. Codex 형식에서는 필수입니다. |
description |
Codex에서는 필수, Agent Plugins에서는 선택 | 최대 4000자의 패키지 요약입니다. 이식 가능한 스키마에서는 선택 사항이고 Codex 형식에서는 필수입니다. |
author |
Codex에서는 필수, Agent Plugins에서는 선택 | 이름과 선택 사항인 이메일 및 HTTPS url을 포함하는 게시자 객체입니다. 이식 가능한 스키마에서는 객체를 생략할 수 있지만 Codex 형식에서는 author.name이 필수입니다. 이름은 최대 120자, 이메일은 320자, URL은 2048자입니다. |
homepage |
선택 | HTTPS 프로젝트 홈페이지 URL로, 최대 2048자입니다. 디렉터리 등록 정보의 interface.websiteURL은 별도로 설정하세요. |
repository |
선택 | 소스 리포지터리 URL입니다. |
license |
선택 | MIT와 같은 라이선스 식별자입니다. |
keywords |
선택 | 패키지를 찾는 데 사용할 검색어 배열입니다. |
extensions |
선택 | 네임스페이스별로 묶은 설정입니다. OpenAI 전용 설정은 com.openai 아래에 두세요. |
skills |
스킬이 포함된 Codex 패키지에 사용 | Codex 전용입니다. "./skills/"와 같이 스킬이 있는 디렉터리의 상대 경로나 경로 배열을 지정하세요. 이식 가능한 패키지는 skills/를 자동으로 찾습니다. |
mcpServers |
MCP 서버가 포함된 Codex 패키지에 사용 | Codex 전용입니다. 패키지에 포함된 MCP 서버 설정을 가리키는 "./.mcp.json"을 지정하세요. 이식 가능한 패키지는 루트의 mcp.json을 자동으로 찾습니다. |
다음 추가 설정은 이식 가능한 패키지의 경우 extensions.com.openai 안에, Codex 호환 매니페스트의 경우 루트에 두세요.
| 필드 | 요구 사항 | 값과 용도 |
|---|---|---|
interface |
Codex에서는 필수, Agent Plugins에서는 선택 | 디렉터리 등록 메타데이터에 설명된 표시 정보 객체입니다. Codex 형식에서는 필수입니다. 이식 가능한 패키지는 루트 메타데이터에서 기본 문구를 가져올 수 있습니다. |
id |
선택 | 관리형 플러그인 카탈로그에서 사용하는 식별자입니다. 할당된 값이 있으면 유지하세요. ZIP 업로드에는 대시보드의 플러그인 식별 정보가 사용됩니다. |
이식 가능한 패키지는 항상 skills/에서 스킬을, mcp.json에서 MCP 서버를 찾습니다. 인라인 확장이나 호환성 오버레이에 skills 또는 mcpServers를 선언해도 이러한 구성 요소를 교체하거나 비활성화하거나 추가할 수 없습니다. 이 선언은 인식 가능한 이식형 루트 매니페스트가 없는 패키지에만 적용됩니다.
디렉터리 등록 메타데이터
다음 필드는 Agent Plugins의 경우 extensions.com.openai.interface에, Codex 형식의 경우 interface에 두세요. 아래 제한은 공개 제출 시 적용됩니다. 패키지를 업로드할 때는 더 긴 초안 문구도 허용될 수 있습니다. 업로드에 성공해도 디렉터리 등록 정보가 제출 요건을 충족한 것은 아닙니다.
| 필드 | 요구 사항 | 유형 | 값과 제출 제한 |
|---|---|---|---|
displayName |
필수 | 문자열 | 사용자에게 표시되는 이름입니다. 최대 30자입니다. |
shortDescription |
필수 | 문자열 | 이름과 함께 표시되는 부제입니다. 최대 30자입니다. |
longDescription |
필수 | 문자열 | 수행할 수 있는 작업, 대상 사용자 및 제한 사항을 설명합니다. 최대 4000자입니다. |
developerName |
필수 | 문자열 | 게시자 이름입니다. 최대 80자입니다. 디렉터리에는 선택한 개발자 신원에 등록된 이름이 자동으로 표시됩니다. |
category |
필수 | 문자열 | 대시보드의 카테고리 이름을 지정하세요. 예를 들어 Productivity 또는 Developer Tools를 사용할 수 있습니다. |
capabilities |
Codex에서는 필수, Agent Plugins에서는 선택 | 문자열 배열 | 기능을 나타내는 레이블입니다. 최대 20개이며 각각 최대 120자입니다. Codex 형식에서는 필수이며 해당 기능이 없으면 []를 사용하세요. |
websiteURL |
MCP 심사 시 필수 | 문자열 | HTTPS 제품 웹사이트 URL이며 최대 1024자입니다. |
supportURL |
MCP 심사 시 필수 | 문자열 | HTTPS 고객 지원 페이지 URL이며 최대 1024자입니다. |
privacyPolicyURL |
MCP 심사 시 필수 | 문자열 | HTTPS 개인정보 보호 정책 URL이며 최대 1024자입니다. |
termsOfServiceURL |
MCP 심사 시 필수 | 문자열 | HTTPS 서비스 약관 URL이며 최대 1024자입니다. |
defaultPrompt |
선택 | 문자열 또는 문자열 배열 | 시작 프롬프트를 최대 3개까지 지정할 수 있으며 각각 최대 128자입니다. 서로 다른 프롬프트를 작성하고 앱 @멘션은 제외하세요. 여러 프롬프트는 배열로 지정하세요. |
brandColor |
선택 | 문자열 | 밝은 테마에서 사용할 #RRGGBB 형식의 색상입니다. 흰색과의 대비율이 2:1 이상이어야 합니다. |
brandColorDark |
선택 | 문자열 | 어두운 테마에서 사용할 #RRGGBB 형식의 색상입니다. #212121과의 대비율이 2:1 이상이어야 합니다. brandColor만 지정하면 어두운 테마용 색상이 자동으로 산출됩니다. |
composerIcon |
Codex에서 필수 | 문자열 | Composer에서 사용하는 아이콘의 상대 경로입니다. |
composerIconDark |
선택 | 문자열 | 해당 아이콘의 어두운 테마 베리언트에 대한 상대 경로입니다. |
logo |
Codex에서 필수, 제출 시 기본 아이콘 필수 | 문자열 | 디렉터리 등록 정보에 표시할 기본 아이콘의 상대 경로입니다. |
logoDark |
선택 | 문자열 | 해당 로고의 어두운 테마 베리언트에 대한 상대 경로입니다. |
연결된 MCP 앱에 공개 심사가 필요하다면 디렉터리 등록 URL 네 가지가 모두 필요합니다. websiteURL, supportURL, privacyPolicyURL, termsOfServiceURL에 자격 증명이 포함되지 않은 HTTPS URL을 사용하세요. 스킬 전용 플러그인의 메타데이터 검증에서는 네 URL을 모두 제공할 필요가 없습니다. 패키지의 homepage와 author.url 값은 이 필드에 자동으로 입력되지 않습니다.
아이콘
배포할 패키지에 logo와 composerIcon을 포함하세요. Codex 패키지 검증에는 둘 다 필요합니다. 이식 가능한 패키지는 두 필드 없이도 업로드할 수 있지만, 제출 전에는 대시보드에 기본 앱 아이콘이 있어야 합니다. 어두운 테마 베리언트는 선택 사항입니다. “앱 아이콘 필요” 경고가 표시되면 logo와 해당 이미지 파일을 추가하거나 대시보드에 아이콘을 제공하세요.
플러그인 루트를 기준으로 ./로 시작하는 상대 경로를 사용하고 참조하는 파일을 모두 포함하세요. 지원되는 이미지 형식은 PNG, JPEG, WebP, SVG이며 파일당 최대 5 MiB입니다. 아이콘과 로고는 정사각형이어야 하며 크기는 최소 48 × 48픽셀입니다. 래스터 이미지는 가로와 세로 각각 최대 4096픽셀입니다. SVG 아이콘은 가로와 세로를 같은 숫자로 지정하거나 최소 48 × 48인 정사각형 viewBox를 제공하세요.
온보딩, 심사 및 게시 설정
두 형식 모두 이 객체들을 extensions.com.openai 바로 아래에 두세요. 이식 가능한 형식에서는 interface와 같은 수준에 둡니다. interface 안에 넣지 마세요.
선택 사항인 onboardingSkill을 지정하면 사용자가 설치 후 설정 워크플로우를 실행할 수 있습니다. 매니페스트 예시, 경로 규칙, 설정 시 새 대화 또는 기존 대화를 사용하는 방식은 온보딩 스킬 추가를 참조하세요.
| 필드 | 요구 사항 | 유형 | 값과 용도 |
|---|---|---|---|
onboardingSkill |
선택 | 문자열 | ./skills/get-started/SKILL.md와 같이 패키지에 포함된 스킬의 SKILL.md를 가리키는 상대 경로입니다. 반드시 패키지에 포함된 스킬을 참조해야 합니다. |
review.test_cases.positive |
ZIP에서는 선택, 최초 MCP 심사 시 5개 필수 | 객체 배열 | MCP 서버가 정확히 하나인 플러그인의 긍정 테스트 케이스입니다. 아래 테스트 케이스 필드를 사용하세요. |
review.test_cases.negative |
ZIP에서는 선택, 최초 MCP 심사 시 3개 필수 | 객체 배열 | 해당 서버의 부정 테스트 케이스입니다. |
review.demo_recording_url |
ZIP에서는 선택, MCP 심사 시 필수 | 문자열 | 심사자가 열 수 있는 시연 동영상 URL입니다. |
review.commerce |
선택 | 불리언 | 앱이 상거래를 지원하는지 나타냅니다. 이 선언으로 법적 약관에 동의하는 것은 아닙니다. |
review.commerce_description |
선택 | 문자열 | 앱의 상거래 관련 동작을 설명합니다. |
publication.countries |
선택 | 문자열 배열 | 플러그인을 제공할 국가의 허용 목록입니다. US, GB와 같이 인식 가능한 대문자 국가 코드를 사용하세요. 생략하면 기존 국가 설정이 유지되고 []를 지정하면 국가 제한이 해제됩니다. 스킬 전용 플러그인을 포함해 플러그인이 게시될 때 적용됩니다. |
publication.release_notes |
선택 | 문자열 | 이 버전의 변경 사항을 설명하는 릴리스 노트입니다. |
publication.translations |
선택 | 객체 또는 null | 로케일 키별로 번역된 디렉터리 등록 문구를 지정하는 맵입니다. 디렉터리 등록 문구 번역을 참조하세요. |
publication.translations.<locale>.subtitle |
선택 | 문자열 또는 null | 번역된 부제이며 최대 30자입니다. |
publication.translations.<locale>.description |
선택 | 문자열 또는 null | 번역된 설명이며 최대 4000자입니다. |
review.test_cases.positive 또는 review.test_cases.negative의 각 객체는 테스트 케이스 하나를 설명합니다.
| 필드 | 요구 사항 | 유형 | 값과 용도 |
|---|---|---|---|
description |
필수 | 문자열 | 확인할 동작을 설명합니다. 긍정 테스트 케이스의 설명은 4000자 이내로 작성하세요. |
prompt |
필수 | 문자열 | 심사자가 직접 입력해 볼 사용자 프롬프트입니다. |
tools_triggered |
긍정 테스트 케이스에서 필수 | 문자열 | 호출될 것으로 예상하는 도구 이름입니다. 제출 시 긍정 테스트 케이스에 반드시 포함하세요. |
expected_behavior |
긍정 테스트 케이스에서 필수 | 문자열 | 심사자가 관찰할 수 있는 예상 결과입니다. 제출 시 긍정 테스트 케이스에 반드시 포함하세요. |
file_attachment_urls |
선택 | 문자열 배열 | 테스트 케이스에 사용하는 파일 링크입니다. |
expected_output_url |
선택 | 문자열 | 예상 결과의 예시로 연결되는 링크입니다. 예를 들어 심사자가 실제 출력과 비교할 수 있는 참조 문서를 지정할 수 있습니다. |
최초 MCP 앱 심사에는 긍정 테스트 케이스가 정확히 5개, 부정 테스트 케이스가 정확히 3개 필요합니다. 일부만 작성한 목록도 업로드할 수 있지만 제출 전에는 모두 작성하세요. MCP 서버가 여러 개라면 MCP 설정에서 서버별로 테스트 케이스를 선언하세요. 플러그인 수준의 review.test_cases는 서버가 정확히 하나일 때만 사용할 수 있으며 서버별 테스트 케이스 선언과 함께 사용할 수 없습니다. 스킬 전용 플러그인에는 MCP 앱 심사용 테스트 케이스나 시연 영상이 필요하지 않습니다.
가져온 테스트 케이스는 대시보드에서 읽기 전용입니다. 변경하려면 패키지를 수정하고 다시 업로드하세요. test_cases를 생략하거나 null로 설정하면 기존 케이스가 유지됩니다. test_cases: {}로 지정하면 두 목록이 모두 지워집니다. 이후 업로드에서 테스트 케이스를 생략해도 대시보드에서 다시 편집할 수 있게 되지는 않습니다.
스칼라형 심사 필드와 release_notes는 생략하거나 null로 설정하면 저장된 값이 유지되고, 빈 문자열로 설정하면 텍스트가 지워집니다. 제출 시 패키지에 명시된 값이 다시 적용됩니다. 대시보드에서 수정한 값을 사용하려면 패키지에서 해당 스칼라 필드 선언을 제거하세요. 공통 심사 필드는 해당 플러그인에 속한 MCP 앱 초안에 적용됩니다. 스킬 전용 플러그인의 릴리스 노트는 패키지에만 저장되며 앱 심사가 생성되지 않습니다.
commerce와 commerce_description은 publication이 아닌 review에 두세요. 패키지에 자격 증명이나 심사자용 지침을 넣지 마세요. ZIP 메타데이터에서는 test_credentials와 reviewer_instructions를 허용하지 않습니다. 심사자 접근 정보는 대시보드의 보안 양식에 입력하세요.
디렉터리 등록 문구 번역
두 형식 모두 extensions.com.openai.publication 아래에 translations 객체를 추가해 번역된 부제와 설명을 제공하세요. fr-FR이나 ja-JP와 같이 비어 있지 않은 로케일 키를 사용하세요. 각 로케일 객체에는 subtitle과 description 중 하나 또는 둘 다 넣을 수 있으며, 각 필드를 생략하거나 null로 설정할 수도 있습니다. translations 자체를 생략하거나 null로 설정해도 됩니다.
기본 디렉터리 등록 필드에는 영어 문구를 유지하세요. en-US 번역은 필요하지 않으며 가져오기 과정에서도 자동으로 생성되지 않습니다.
번역된 부제는 최대 30자로 한 줄에 작성해야 합니다. 번역된 설명에는 \n 줄바꿈을 넣을 수 있으며 최대 4000자까지 작성할 수 있습니다. 텍스트는 공백 문자로만 구성할 수 없으며 지원되는 문자를 사용해야 합니다. 탭과 그 밖의 지원되지 않는 제어 문자는 허용되지 않습니다. 글자 수를 계산할 때는 앞뒤 공백도 포함합니다.
번역은 가져올 때 검증되며 메타데이터를 수정한 후에도 업로드한 번들에 유지됩니다. 현재는 번역을 가져와도 플러그인 디렉터리나 디렉터리 등록 정보 API 응답에 표시되는 문구가 바뀌지 않습니다.