
MCP 서버로 시작하는 결함 분석 자동화 도전 중 2
요약
MCP 서버를 활용하여 Notion의 결함 데이터를 자동으로 취득, AI로 분석한 뒤 다시 Notion에 기록하는 자동화 워크플로우를 구현합니다. OpenAI API를 활용한 분석 래퍼와 Notion API 클라이언트를 구축하여 결함 분석 프로세스를 효율화하는 과정을 다룹니다.
핵심 포인트
- Notion API를 이용한 결함 데이터 취득 및 분석 결과 자동 기록
- AI 모델 전환이 용이하도록 설계된 ai_client.py 래퍼 구현
- 프롬프트 엔지니어링을 통한 개발 팀 맞춤형 분석 정보 생성
- 분석 결과의 중요도(공유도)에 따른 Slack 알림 연동 구조 설계
서론
이번에는 지난번에 진행했던 AI를 이용한 결함 분석의 후속 내용을 기재하고자 합니다.
지난번에는 전체적인 구상과 연계 방법의 일부에 대해 설명했습니다. 이번에는,
- Notion에서 결함 데이터를 취득
- 취득한 데이터를 AI로 분석
- 분석한 결과를 Notion 티켓에 붙여넣기
이 일련의 흐름을 설명하고자 합니다.
전체 흐름
이번에는 다음과 같은 부분을 수정하거나 새로 작성했습니다.

이번 대응 부분의 전체도
크게 3개의 파일로 나누어져 있습니다.
-
ai_client.py
-
OpenAI API에 프롬프트 (Prompt)를 송신하여 분석 텍스트를 반환하는 래퍼 (Wrapper)
-
analyze_flow.py
-
Notion에서 미분석 버그 티켓을 취득하고, AI가 분석하여 Notion에 결과를 다시 쓰는 메인 처리 플로우 (Flow)
-
my_notion_client.py
-
Notion API와의 HTTP 통신 · 페이지네이션 (Pagination) 대응 취득 · Markdown → Notion 블록 변환 · 결과 쓰기를 담당하는 클라이언트 (Client)
코드 작성은 대부분 Claude에게 맡겼고, QA 측에서는 분석 결과의 타당성이나 어떤 정보를 주어야 좋은 아웃풋 (Output)이 나오는지 확인하고 있습니다.
AI와의 상호작용
「ai_client.py」는 주로 AI와의 상호작용을 담당합니다. 이 부분은 AI의 모델을 바꾸고 싶을 때 전환하기 위한 허브 (Hub) 역할을 하는 코드입니다.
다만, 이번에는 설명을 위해 OpenAI에 접속하는 부분만 가져왔습니다.
(실제로는 Claude 등 다른 모델로 전환할 수 있도록 작성되어 있습니다)
이는 AI 모델에 따라 분석의 차이가 생길 수도 있겠다고 생각하여, 모델을 전환하기 쉽게 만들었습니다.
import os
from typing import Optional
import logging
...
AI에 송신하는 프롬프트
「analyze_flow.py」는 Notion에서 미분석 버그 티켓을 취득하고, AI가 분석하여 Notion에 결과를 다시 쓰는 메인 처리 플로우입니다.
주로 다음과 같은 일을 수행하고 있습니다.
- Notion에 기재된 각 컬럼 (Column)의 설명을 바탕으로 프롬프트 (Prompt)를 구축
- Notion의 결함 데이터를 취득하여 AI로 분석
- 분석 결과를 Notion에 다시 쓰기
AI에 보내는 프롬프트에 따라 분석 결과가 꽤 달라지기 때문에, 이 부분의 메커니즘은 변경해가며 진행하고 있습니다. 그래서 현재 기재되어 있는 것은 몇 달 후에는 다른 것이 되어 있을 가능성도...?
프롬프트의 특징으로는, 어쨌든 「개발 팀에게 도움이 되는 정보를!」을 모토로 작성하고 있습니다.
모든 정보를 팀에 전개해도 도움이 되지 않는 케이스도 있을 것이라 생각하여, 팀에 대한 공유 필요도를 나타내는 「공유도」라는 지표를 만들었습니다. 공유도가 일정 수치를 넘은 것만 Slack에 통지하도록 하고 있습니다. Slack 통지 구현에 대해서는 다음에 설명하겠습니다.
또한, 아래는 테스트용으로 1건만 분석하는 코드로 되어 있습니다.
import asyncio
import logging
from my_notion_client import (
...
Notion 데이터로 가공
「my_notion_client.py」는 Notion API와의 HTTP 통신 · 페이지네이션 (Pagination) 대응 데이터 취득 · Markdown → Notion 블록 변환 · 결과 쓰기를 담당하는 클라이언트 (Client)입니다.
AI의 분석 결과를 그대로 Notion에 붙여넣으면, 예를 들어 「## (제목)」 등의 기호가 변환되지 않고 문자열로서 그대로 표시되는 경우가 있었습니다.
그렇기 때문에, Markdown을 Notion의 블록 형식 (JSON Object)으로 변환하는 처리를 구현하고 있습니다.
import os
import re
import logging
...
)
見出し
elif line.startswith('### '):
blocks.append({"object": "block", "type": "heading_3", "heading_3": {"rich_text": _parse_inline(line[4:])}});
elif line.startswith('## '):
blocks.append({"object": "block", "type": "heading_2", "heading_2": {"rich_text": _parse_inline(line[3:])}});
この後、# 見出し・区切り線・箇条書き・番号付きリスト・引用・通常テキストなどの変換が続く...
i += 1
return blocks
'''
NotionのデータベースにAIの分析結果をページ本文として追加する
'''
async def append_analysis_to_page_body(page_id: str, analysis_text: str) -> Dict[str, Any]:
blocks = _markdown_to_notion_blocks(analysis_text)
Notion APIは1リクエストあたり100ブロックまで
BATCH_SIZE = 100
last_response = None
for start in range(0, len(blocks), BATCH_SIZE):
batch = blocks[start:start + BATCH_SIZE]
last_response = await notion.blocks.children.append(
block_id=page_id,
children=batch,
)
return last_response
# 요약
위 코드를 작성함으로써 건별 티켓 수준이지만, 결함을 자동으로 분석할 수 있게 되었습니다. 마지막으로, 결함의 자동 분석을 진행한 결과가 어떻게 되었는지 정리하고 싶습니다.
결론부터 말하자면, 결함 데이터베이스를 **사람 기반**에서 **AI 기반**으로 변경해야 한다는 것입니다.
지금까지 결함 발생 보고(起票)부터 분석, 보고에 이르는 일련의 과정은 사람이 수행해 왔습니다. 하지만 이 대부분을 AI로 자동화하려면, 분석 결과의 정확도를 높이기 위해 '결함을 AI가 읽기 쉬운 형태로 변환'할 필요가 있습니다.
이에 따라 현재 다음과 같은 관점에서 사람이 작성하는 부분과 AI가 작성하는 부분을 나누어 결함 보고를 하고 있습니다.
### AI가 작성하는 부분
- 분류/카테고리 (결함 경향을 분석하는 데 사용)
- 중요도/영향도
- 테스트 관점 (부족한 테스트의 도출)
### 사람이 작성하는 부분
- 재현 절차
- 결함이 발생했을 때의 에러 메시지나 표시 (로그 등)
- 발생 환경
- 원인
사람 측에서는 '기대 결과/에러 로그/발생 환경'과 같은 항목별로 구조화하여 기재함으로써, AI가 정보를 읽기 쉽게 만듭니다. 반대로 말하면, 필요한 최소한의 정보만 갖춰져 있다면 분류부터 분석까지는 나머지를 AI가 자동으로 처리해 주는 상태를 목표로 하고 있습니다('최소한'이 무엇인지는 현재도 조사 중입니다).
특히 AI는 패턴 분석에 강점이 있어, 어느 정도의 지침을 제공하기만 하면 예를 들어 분류·카테고리를 20종류 정도 만들더라도 자동으로 분류해 줍니다.
다음 회차부터는 어떻게 개선해 나가야 질 높은 아웃풋 (Output)을 얻을 수 있을지에 대해 정리해 보고자 합니다.
### Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기