대시보드
Morit Plugin2. 프로젝트와 계약

프로젝트 구조와 fragment

권장 디렉터리

text
my-plugin/
├─ manifest.json
├─ README.md
├─ tools/*.json
├─ skills/*.json
├─ search/*.json
├─ notifications/*.json
├─ background/*.json
├─ ui/*.json
├─ credentials/*.json
├─ slash_commands/*.json
├─ src/**/*.py
├─ assets/*.{json,md,txt,png,jpg,jpeg,gif,webp}
├─ children/*.mplg
├─ morit-plugin.json
└─ dist/

morit-plugin.jsondist/는 개발 상태와 산출물이므로 설치 패키지의 기능 계약이 아닙니다. 비밀 값도 두 위치에 저장하지 않습니다.

fragment 병합 규칙

각 fragment 파일은 UTF-8 JSON 객체 하나입니다. 빌드할 때 파일명을 정렬한 순서로 다음 manifest 배열에 추가합니다.

디렉터리대상 배열자동으로 채우는 값
capabilities/capabilities없음
tools/capabilitieskind: "tool"
skills/capabilitieskind: "skill"
search/capabilitieskind: "provider", runtime.role: "search"
notifications/capabilitieskind: "notification"
background/capabilitieskind: "background"
ui/ui_extensions없음
credentials/credentials없음
slash_commands/slash_commands없음

같은 값이 fragment에 이미 있으면서 자동 값과 다르면 빌드가 실패합니다. manifest 배열과 fragment 배열은 합쳐지므로 ID는 전체에서 유일해야 합니다.

source와 패키지에 들어가는 파일

검증은 프로젝트의 안전한 상대 POSIX 경로만 읽습니다. 절대 경로, .., 역슬래시, Windows 예약명, 심볼릭 링크는 사용할 수 없습니다. 프로젝트 전체 한도는 1 MiB, 파일 수는 64개, 파일 하나는 512 KiB입니다. 최종 .mplg는 2 MiB 이하입니다.

빌드가 설치 패키지에 포함하는 항목은 다음뿐입니다.

  • fragment를 병합해 만든 manifest.json
  • 선택적 README.md
  • 선언된 sandbox_python entrypoint와 연결된 src/**/*.py
  • 허용 확장자의 assets/
  • dependency와 정확히 일치하는 children/*.mplg
  • signature.json

fragment 원본은 compiled manifest에 병합되므로 .mplg 안에 중복해 넣지 않습니다. src/*.py는 각각 정확히 한 sandbox_python capability가 entrypoint로 선언해야 하며, 선언되지 않은 Python 파일이나 여러 capability가 공유하는 entrypoint는 거부됩니다.

텍스트와 바이너리

JSON, Markdown, 텍스트, Python은 엄격한 UTF-8입니다. PNG/JPEG/WebP/GIF와 child .mplg는 바이너리 그대로 보존됩니다. Cloud sync의 JSON 경계를 지날 때만 바이너리 envelope로 변환되며, pull·source ZIP·build 결과에서는 원래 바이트로 복원됩니다.

UI에서 참조하는 package 이미지는 최대 512 KiB이고 가로·세로가 각각 4096 px 이하여야 합니다. 정적 이미지는 1 frame, GIF/WebP 애니메이션은 최대 128 frame이며 width × height × frame 수로 계산한 frame 합산 pixel은 최대 16,000,000입니다. 확장자·MIME에 대응하는 magic byte와 실제 이미지 포맷도 일치해야 합니다.

웹 프로젝트에서 아이콘 올리기

developers.moring.co의 플러그인 프로젝트 관리 → 정보 → 앱 아이콘에서는 PNG, JPEG, WebP 파일을 직접 선택하거나 끌어 놓을 수 있습니다. 업로드가 완료되면 이미지는 assets/plugin-icon.*에 저장되고 manifest.icon도 같은 revision에서 함께 갱신됩니다. 기존에 이 화면에서 올린 아이콘을 교체하거나 제거할 때도 파일과 manifest가 원자적으로 함께 반영됩니다.

아이콘은 512 KiB 이하, 가로·세로 각각 4096 px 이하, 전체 16,000,000 pixel 이하만 허용됩니다. 확장자만 바꾼 파일이나 실제 포맷이 다른 이미지는 서버 검증에서 거부됩니다. MCP가 바이너리 파일을 직접 전송하지 못하더라도 이 화면에서 한 번 올린 아이콘은 프로젝트 source에 포함되므로 이후 MCP, CLI pull·build에서도 원래 이미지 바이트와 manifest.icon 경로가 그대로 유지됩니다.

파일별 책임

  • manifest.json: 패키지 신원, 버전, 전역 권한, 연결과 데이터 정책
  • capability fragment: AI나 UI가 실행할 한 가지 작업
  • UI fragment: Host가 표시할 화면과 capability 참조
  • credential/connector: 사용자 계정 또는 Cloud 비밀 값과 외부 endpoint의 연결
  • src/: 검증되고 격리된 Python 작업만 포함
  • assets/: 아이콘·정적 데이터·설명 자료
  • children/: 함께 설치할 별도 서명 플러그인

화면 문구, 외부 endpoint, 비밀 값, 사용자 설정을 한 JSON에 섞지 마세요. 바뀌는 주기와 접근 권한이 다른 정보는 각각 UI, Connector, Secret, settings에 둡니다.

다음은 Manifest 레퍼런스입니다.