mcpo 란

mcpo 는 MCP 서버 명령을 받아 표준 RESTful OpenAPI를 통해 접근 가능하게 해주는 매우 간단한 프록시입니다.
이러한 기능을 활용하여 LLM 에이전트 및 OpenAPI 를 사용하는 애플리케이션과 연동하는데 도움이 됩니다.

mcpo 의 필요성

MCP 서버는 일반적으로 원시 표준 입출력(stdio)을 통해 통신하는데, 이는 다음과 같은 단점이 있습니다.

🔓 본질적으로 보안에 취약합니다.
❌ 대부분의 도구와 호환되지 않습니다.
🧩 문서화, 인증, 오류 처리 등과 같은 표준 기능이 부족합니다.

위와 같은 단점을 보완하고 여러 MCP 서버를 통합 관리하는데 편리함을 제공합니다.

개인적으로는 MCP 서버를 stdio 형태로 사용하면 사용자의 Laptop 과 같은 디바이스의 리소스를 사용하므로 발생되는 문제, LLM 의 재시작으로 인해 MCP 서버의 재시작등의 관리적으로 연관된 불편함이 다수 존재하였습니다.

mcpo 는 이러한 불편함을 통합 관리하게 만들어주므로 인해 편리함을 제공하였다고 생각합니다.

Build

이번 포스팅에서는 mcpo 를 container 이미지로 빌드하고 빌드된 이미지를 이용하여 사용하는 방법에 대해 설명을 드리겠습니다.

아래와 같은 방법으로 mcpo container 이미지를 빌드합니다.

$ git clone https://github.com/open-webui/mcpo.git
$ cd mcpo/
$ docker build -t mcpo .
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mcpo         latest    98c0476e1d50   15 seconds ago   539MB

$ docker run --rm mcpo

 Usage: mcpo [OPTIONS]

╭─ Options ────────────────────────────────────────────────────────────────────╮
│ --host                -h      TEXT     Host address [default: 0.0.0.0]       │
│ --port                -p      INTEGER  Port number [default: 8000]           │
│ --cors-allow-origins          TEXT     CORS allowed origins [default: *]     │
│ --api-key             -k      TEXT     API key for authentication            │
│ --strict-auth                          API key protects all endpoints and    │
│                                        documentation                         │
│ --env                 -e      TEXT     Environment variables                 │
│ --env-path                    TEXT     Path to environment variables file    │
│ --type,--server-type          TEXT     Server type [default: stdio]          │
│ --config              -c      TEXT     Config file path                      │
│ --name                -n      TEXT     Server name                           │
│ --description         -d      TEXT     Server description                    │
│ --version             -v      TEXT     Server version                        │
│ --ssl-certfile        -t      TEXT     SSL certfile                          │
│ --ssl-keyfile         -K      TEXT     SSL keyfile                           │
│ --root-path                   TEXT     Root path                             │
│ --path-prefix                 TEXT     URL prefix                            │
│ --header              -H      TEXT     Headers in JSON format                │
│ --hot-reload                           Enable hot reload for config file     │
│                                        changes                               │
│ --log-level                   TEXT     Set log level (DEBUG, INFO, WARNING,  │
│                                        ERROR, CRITICAL)                      │
│ --install-completion                   Install completion for the current    │
│                                        shell.                                │
│ --show-completion                      Show completion for the current       │
│                                        shell, to copy it or customize the    │
│                                        installation.                         │
│ --help                                 Show this message and exit.           │
╰──────────────────────────────────────────────────────────────────────────────╯

사용 방법

먼저 사용할 MCP 서버들을 json 형태로 선언합니다.

테스트에 활용될 MCP 서버는 아래와 같이 time, memory 를 사용하도록 하겠습니다.

mcpo.json 예제입니다.

$ cat ~/mcpo.json
{
  "mcpServers": {
        "time": {
      "command": "uvx",
      "args": ["mcp-server-time", "--local-timezone=Asia/Seoul"]
    },
        "memory": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-memory"],
      "tags": ["memory", "notes"]
    }
  }
}

아래와 같은 방법으로 빌드한 이미지를 실행하고 미리 작성한 mcpo.json—config 옵션을 이용하여 지정합니다.

참고로 --api-key "top-secret" 옵션을 추가하면 API 인증을 설정 할 수 있으니, 구성 환경에 적합하게 활용하면 도움이 될 것 같습니다.

$ docker run -d -p 8000:8000 \
        -v /root/mcpo.json:/app/mcpo.json \
        --restart=always \
        --name mcpo mcpo -- mcpo --config /app/mcpo.json
5414cbd48fd916fd1e9582ade16157a6cc0238c5ae631c830dc411eb4e39817c

$ docker logs -f mcpo
...
2026-01-05 00:48:28,993 - INFO - Successfully connected to 'time'.
2026-01-05 00:48:28,994 - INFO - Initiating connection for server: 'memory'...
Knowledge Graph MCP Server running on stdio
2026-01-05 00:48:39,094 - INFO - Successfully connected to 'memory'.
2026-01-05 00:48:39,095 - INFO -
--- Server Startup Summary ---
2026-01-05 00:48:39,095 - INFO - Successfully connected to:
2026-01-05 00:48:39,096 - INFO -   - time
2026-01-05 00:48:39,096 - INFO -   - memory
2026-01-05 00:48:39,097 - INFO - --------------------------

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
...

위와 같이 docker logs 를 이용하여 현재 시작된 MCP 서버를 확인 할 수 있으며, 아래와 같은 방법으로 OpenAPI 호환 API 를 호출 테스트를 할 수 있습니다.

$ curl -s localhost:8000/openapi.json | jq
{
  "openapi": "3.1.0",
  "info": {
    "title": "MCP OpenAPI Proxy",
    "description": "Automatically generated API from MCP Tool Schemas\n\n- **available tools**:\n    - [time](/time/docs)\n    - [memory](/memory/docs)",
    "version": "1.0"
  },
  "paths": {}
}

$ curl -s localhost:8000/time/openapi.json | jq
{
  "openapi": "3.1.0",
  "info": {
    "title": "mcp-time",
    "description": "mcp-time MCP Server",
    "version": "1.25.0"
  },
  "servers": [
    {
      "url": "/time"
    }
  ],
  "paths": {
    "/get_current_time": {
      "post": {
        "summary": "Get Current Time",
        "description": "Get current time in a specific timezones",
        "operationId": "tool_get_current_time_post",
...

$ curl -s localhost:8000/memory/openapi.json | jq | head -n6
{
  "openapi": "3.1.0",
  "info": {
    "title": "memory-server",
    "description": "memory-server MCP Server",
    "version": "0.6.3"
...

이와 같이 Proxy 된 MCP 서버를 Open WebUI 와 같은 도구에 연결하여 사용하거나, stdio 사용에 보안적인 문제로 인해 고민중이라면 mcpo 를 사용하는 것도 좋은 방안이 될 것 같습니다.

참고 문서

chhanz's profile image

chhanz

2026-01-05

Read more posts by this author