반응형

목적
외부 AI가 어떻게 MCP를 직접 사용할 수 있도록 구성했는지 설명
OpenAI Response API에 원격 MCP 서버 정보를 넘겨서 모델이 직접 데이터버스 MCP를 호출하도록 한다.
간단 플로우
사용자/프론트엔드
-> FastAPI /chat
-> app.agent.run_agent()
-> OpenAI Responses API
-> Remote Dataverse MCP Server
-> Dataverse 데이터 조회 결과
-> OpenAI가 최종 자연어 응답 생성
-> FastAPI가 응답 반환
MCP_SERVER_URL=https://{CRM URL}/api/mcp
외부 AI가 어떻게 MCP 사용
모델에서 원격 MCP 서버 정보를 모델의 tool 파라미터로 넘겨준다.
{
"type": "mcp",
"server_label": "dataverse",
"server_description": "Microsoft Dataverse MCP server with read-only data access tools.",
"server_url": server_url,
"headers": {"Authorization": authorization_header},
"allowed_tools": [
"list_tables",
"describe_table",
"read_query",
"search",
"fetch",
"list_apps",
],
"require_approval": "never",
}
server_url
server_url에 Dataverse MCP 엔드포인트를 넣는다.
이렇게 하면 OpenAI 모델은 "로컬 Python 함수"가 아니라 "외부의 실제 MCP 서버"를 사용할 수 있게 된다.
즉, 연결 대상은 이 백엔드가 아니라 Dataverse MCP 서버다.
headers
Dataverse MCP는 익명 접근이 되지 않으므로, 모델이 MCP 서버를 호출할 때 Authorization: Bearer <token> 헤더가 반드시 필요하다.
인증 헤더는 백엔드가 발급받는다.
현재 구현에서는 백엔드가 Azure AD client credentials로 Dataverse access token을 발급받고, 그 값을 MCP tool의 headers에 넣는다.
1. `DATAVERSE_TENANT_ID`, `DATAVERSE_CLIENT_ID`, `DATAVERSE_CLIENT_SECRET`를 읽는다.
2. `https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token`에 client credentials grant로 요청한다.
3. `scope`는 `{DATAVERSE_URL}/.default`를 사용한다.
4. 받은 access token을 `Bearer ...` 형태로 만들어 MCP tool의 `headers.Authorization`에 넣는다.
allowed_tools
사용할 수 있는 툴 제한
- `list_tables`
- `describe_table`
- `read_query`
- `search`
- `fetch`
- `list_apps`
require_approval
require_approval은 "never"로 설정되어 있다.
이 의미는 모델이 허용된 읽기 전용 도구를 사용할 때 사람의 추가 승인 없이 바로 실행할 수 있다는 뜻이다.
반응형
'인턴' 카테고리의 다른 글
| [RPA] 184개의 액션을 41개로 줄이기: Power Automate 레거시 플로우 리팩토링 기록 (5) | 2026.06.08 |
|---|---|
| [Azure] CRM 리치 텍스트 이미지 저장 구조 개선기: Dataverse에서 Azure Blob Storage로 (0) | 2026.06.07 |
| [Azure] Azure 학습 및 고객사 아키텍처 설계 문서 (10) | 2026.06.07 |
| [MCP] Microsoft - Dataverse MCP 설치 방법 정리 (클로드 코드 기준) (0) | 2026.06.05 |