본문 바로가기
인턴

[MCP] Remote MCP 기반 OpenAI–Dataverse 데이터 접근 아키텍처

by 칙칙폭폭 땡땡 2026. 6. 5.
반응형

목적

외부 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"로 설정되어 있다.

이 의미는 모델이 허용된 읽기 전용 도구를 사용할 때 사람의 추가 승인 없이 바로 실행할 수 있다는 뜻이다.



반응형