Notion 예제
위치: examples/plugins/notion/
이 예제는 사용자가 개인 token을 붙여 넣는 방식이 아니라 Notion의 공식 OAuth 화면에서 Morit에 공유할 page/data source를 선택하는 실제 연결 흐름을 사용합니다. Client ID와 Client Secret은 package가 아닌 Plugin Cloud Project에 저장됩니다.
Developer Project 설정
developers.moring.co에서 조직을 선택하고 Notion Plugin Project를 엽니다.연결 및 Secrets에서 다음 두 Secret을 저장합니다.NOTION_CLIENT_ID(oauth_client_id)NOTION_CLIENT_SECRET(oauth_client_secret)
- Connection ID
notion, Providernotion, 종류oauth2를 추가합니다. - Authorization URL은
https://api.notion.com/v1/oauth/authorize, Token URL은https://api.notion.com/v1/oauth/token으로 설정합니다. - 앞서 만든 두 Secret 이름을 Connection에 연결합니다.
- Provider에
notion을 입력하면 Developer Platform이 Notion의 공식 Basic + JSON token/revoke 형식과owner=user를 자동 적용하고, PKCE는공급자가 지원하지 않음으로 설정합니다. PKCE를 지원하는 다른 공급자는 기본값인사용 (권장)을 유지합니다.
Notion은 현재 공식 token 요청에 code_challenge/code_verifier를 정의하지 않습니다.
이 호환 설정에서도 Morit의 일회용 state, 정확한 redirect URI, 사용자별 authorization
transaction 격리와 replay 차단은 그대로 적용됩니다.
Notion integration의 redirect URI는 다음과 정확히 같아야 합니다.
https://morit-api.moring.co/v1/plugins/oauth/callback/notion
Morit 운영 서버의 .env에 Notion 전용 Client ID/Secret을 추가하지 않습니다. Plugin
Runtime에는 Cloud vault 해제용 공통 key와 사용자 token vault용 별도 key만 둡니다.
기능
Manifest는 POST https://api.notion.com/v1/search 결과 종류에 따라 후속 조회를
사용합니다.
- page:
GET /v1/blocks/{id}/children?page_size=100 - data source:
POST /v1/data_sources/{id}/query(page_size: 20)
page block의 제목·목록·코드와 data source row의 title/rich text/select/status/ multi-select/URL/contact 속성을 공용 result/evidence로 정규화합니다. endpoint, token, request body 같은 민감 provenance는 결과에 포함하지 않습니다.
Notion은 integration과 명시적으로 공유된 page/data source만 반환합니다. 401이면 refresh token으로 한 번 갱신하고, 갱신이 거부되면 앱에 재연결 안내를 표시합니다.
빌드와 배포
npx -y @morit/cli plugin validate .\examples\plugins\notion
npx -y @morit/cli plugin build .\examples\plugins\notion
npx -y @morit/cli plugin deploy .\examples\plugins\notion --visibility private
검증된 .mplg는 앱의 파일에서 설치로 직접 설치할 수도 있습니다. Cloud OAuth를
사용하려면 Project에 연결된 정확한 Deployment artifact여야 하며, 개인용으로만 쓸
경우 비공개를 유지합니다. 홈페이지·개인정보처리방침·아이콘·개발자 metadata를 모두
채운 후에만 공개 Marketplace 배포가 허용됩니다.
실제 사용 확인
- 앱에서 Plugin을 설치하고 자동 생성된 기본 Instance를 엽니다.
- Notion 연결을 눌러 실제 계정을 승인합니다. 다른 계정도 필요하면 같은 Instance 안에 Connection을 추가합니다.
/notion Morit 플러그인 계획또는Notion에서 이번 분기 프로젝트 문서를 찾아줘를 실행합니다.- 응답의 근거 링크가 승인한 workspace 범위 안에 있는지 확인합니다.
- 연결 해제 후 동일 기능이 token을 재사용하지 않고
연결 필요로 바뀌는지 확인합니다.
자동 테스트는 authorize/token/search/block children/data source query/revoke 계약, state replay 방지, 암호화, refresh, 사용자 격리와 Secret 비노출을 검증합니다. 실제 workspace 결과는 Notion 계정 승인과 공유 페이지가 있어야 하므로 배포 전 별도의 live smoke test가 필요합니다.