Skip to main content
Glama
egovframe-scaffold-mcp

egovframe-scaffold-mcp

by EricSeokgon

컨테이너·배포 산출물 생성

generate_egovframe_deploy

Generate Dockerfiles, docker-compose files, and Kubernetes manifests for eGovFrame projects by diagnosing build tooling, packaging, database type, and configuration.

Instructions

프로젝트 진단(빌드 도구·패키징·Boot 여부·웹·actuator·DbType·설정 파일)으로 컨테이너·배포 산출물을 만듭니다 — Dockerfile(멀티 스테이지: Maven/Gradle 빌드 → Classic war 는 Tomcat 10.1(Servlet 6.1 이상이면 11.0)에 ROOT 로 풀어서, Boot jar 는 eclipse-temurin JRE 로; 비루트·HEALTHCHECK·Asia/Seoul·UTF-8, buildInImage=false 면 미리 빌드한 산출물), .dockerignore, deploy/docker-compose.yml(앱 + DbType 별 DB 컨테이너 mysql·mariadb·postgres, 템플릿 DDL·DATA 초기화, 상용 DB 는 연결 정보만), Kubernetes 매니페스트(deploy/k8s/.yaml — Deployment(startup·readiness·liveness 프로브, 비루트 securityContext, 리소스)·Service·ConfigMap·Secret·선택 Ingress). DB 설정은 Boot 는 Spring 환경 변수(Globals.mysql.Url → GLOBALS_MYSQL_URL), Classic 은 globals.properties 사본을 볼륨·Secret 으로 덮어씁니다. imageRegistry 로 기반 이미지를 사내 레지스트리(폐쇄망)에서 받습니다. 새 파일만 쓰고(기존 파일 거부) dryRun(기본)은 내용만 보여 줍니다. 멀티 모듈·라이브러리 jar·빌드 파일 없는 프로젝트는 이유를 돌려줍니다. 멀티 모듈 작업공간(Maven ·Gradle include·루트 빌드 파일 없는 독립 프로젝트 묶음)이면 서비스 모듈마다 이미지(자체 Dockerfile 은 그대로)와 하나의 docker-compose·서비스별 Kubernetes 매니페스트를 만들고, 설정의 localhost 참조(설정 서버·디스커버리·DB·메시지 브로커·캐시)를 서비스 이름으로 바꿉니다(모듈 설정은 환경 변수, 설정 서버 저장소는 사본). modules 로 일부 서비스만 고릅니다. v1.16: observability="otel" 이면 OpenTelemetry Java 에이전트(고정 버전·sha256 확인, 폐쇄망은 빌드 컨텍스트 deploy/otel/ 의 jar 또는 --build-arg OTEL_AGENT_URL)를 이미지에 두고 compose·Kubernetes 가 JAVA_TOOL_OPTIONS·OTEL_SERVICE_NAME·OTEL_EXPORTER_OTLP_ENDPOINT·OTEL_RESOURCE_ATTRIBUTES 로 붙여 OpenTelemetry Collector(core 배포판, Apache-2.0)로 trace·metric·log 를 보냅니다 — 수집기는 기본 debug 출력, 기관 백엔드(otlp_http·prometheus)는 설정 주석, 저장·대시보드(AGPL 스택)는 동봉하지 않음.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "projectDir": "<projectDir>"
    },
    "name": "generate_egovframe_deploy"
  }
}

Input Schema

NameRequiredDescriptionDefault
jdkNoJDK(빌드·실행 이미지)17
imageNo앱 이미지 이름(기본 <appName>:<version>)
dryRunNotrue(기본)면 쓰지 않고 내용만
formatNo응답 형식markdown
appNameNo앱 이름(기본 artifactId)
modulesNo멀티 모듈 작업공간에서 일부 서비스만(모듈 이름·경로). 그 서비스가 먼저 띄워야 하는 서비스·인프라는 함께 들어감
targetsNo만들 산출물(compose 는 Dockerfile 도 함께)
projectDirYes프로젝트 디렉터리(절대경로 권장)
ingressHostNoKubernetes Ingress 호스트(주면 Ingress 추가)
buildInImageNotrue: 이미지 안에서 빌드(멀티 스테이지) · false: 미리 빌드한 target/*.war·jar 를 담음(폐쇄망에서 컨테이너 안 Maven 접근이 어려울 때)
imageRegistryNo기반 이미지 레지스트리(폐쇄망 사내 레지스트리·프록시 캐시) — Dockerfile ARG BASE_REGISTRY 기본값docker.io/library
observabilityNootel 이면 OpenTelemetry Java 에이전트(이미지, sha256 확인, 폐쇄망은 deploy/otel/ 의 jar)·수집기(compose·k8s, core 배포판 — debug 출력, 기관 백엔드는 주석 예시)·앱 환경 변수(JAVA_TOOL_OPTIONS·OTEL_*)를 함께 만듦(단일 프로젝트)none
dockerfilePathNoDockerfile 경로(프로젝트 상대) — 템플릿에 이미 Dockerfile 이 있으면 deploy/Dockerfile 등Dockerfile

Output Schema

NameRequiredDescriptionDefault
filesYes
notesYes
usageYes
dryRunYes
profileNo
writtenYes
supportedYes
workspaceNo
projectDirYes
unsupportedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.16.0
    • addedInput schema / properties / observability
      Added value: +{
      +  "default": "none",
      +  "description": "otel 이면 OpenTelemetry Java 에이전트(이미지, sha256 확인, 폐쇄망은 deploy/otel/ 의 jar)·수집기(compose·k8s, core 배포판 — debug 출력, 기관 백엔드는 주석 예시)·앱 환경 변수(JAVA_TOOL_OPTIONS·OTEL_*)를 함께 만듦(단일 프로젝트)",
      +  "enum": [
      +    "none",
      +    "otel"
      +  ],
      +  "type": "string"
      +}
  2. Changed16 schema fields changedv1.6.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedOutput schema / properties / files / items / additionalProperties
      Previous value: -trueNew value: +{}
    • addedOutput schema / properties / files / items / properties / bytes / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / files / items / properties / bytes / minimum
      Added value: +-9007199254740991
    • changedOutput schema / properties / profile / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / profile / properties / db / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "database": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "file": {
      -        "type": "string"
      -      },
      -      "host": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "initScripts": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "inject": {
      -        "enum": [
      -          "env",
      -          "file",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "port": {
      -        "anyOf": [
      -          {
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "service": {
      -        "enum": [
      -          "container",
      -          "external"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "user": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "inject",
      -      "file",
      -      "url",
      -      "user",
      -      "host",
      -      "port",
      -      "database",
      -      "service",
      -      "initScripts"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "database": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "file": {
      +        "type": "string"
      +      },
      +      "host": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "initScripts": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "inject": {
      +        "enum": [
      +          "env",
      +          "file",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "port": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "service": {
      +        "enum": [
      +          "container",
      +          "external"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "user": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "inject",
      +      "file",
      +      "url",
      +      "user",
      +      "host",
      +      "port",
      +      "database",
      +      "service",
      +      "initScripts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / profile / properties / port / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / profile / properties / port / minimum
      Added value: +-9007199254740991
    • changedOutput schema / properties / unsupported / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / workspace / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / workspace / properties / infra / items / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / workspace / properties / services / items / additionalProperties
      Previous value: -trueNew value: +{}
    • addedOutput schema / properties / workspace / properties / services / items / properties / port / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / workspace / properties / services / items / properties / port / minimum
      Added value: +-9007199254740991
    • changedOutput schema / properties / workspace / properties / skipped / items / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / workspace / properties / unresolved / items / additionalProperties
      Previous value: -trueNew value: +{}
  3. Changed2 schema fields changedv0.47.0
    • addedInput schema / properties / modules
      Added value: +{
      +  "description": "멀티 모듈 작업공간에서 일부 서비스만(모듈 이름·경로). 그 서비스가 먼저 띄워야 하는 서비스·인프라는 함께 들어감",
      +  "items": {
      +    "pattern": "^[\\w.\\-\\/]{1,120}$",
      +    "type": "string"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • addedOutput schema / properties / workspace
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "appName": {
      +      "type": "string"
      +    },
      +    "infra": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "image": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "image"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "kind": {
      +      "type": "string"
      +    },
      +    "services": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "dependsOn": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "env": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "image": {
      +            "type": "string"
      +          },
      +          "module": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "ownDockerfile": {
      +            "type": "boolean"
      +          },
      +          "port": {
      +            "type": "integer"
      +          },
      +          "runtime": {
      +            "type": "string"
      +          },
      +          "web": {
      +            "type": "boolean"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "module",
      +          "runtime",
      +          "port",
      +          "web",
      +          "ownDockerfile",
      +          "image",
      +          "env",
      +          "dependsOn"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "skipped": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "module": {
      +            "type": "string"
      +          },
      +          "reason": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "module",
      +          "reason"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "unresolved": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "key": {
      +            "type": "string"
      +          },
      +          "service": {
      +            "type": "string"
      +          },
      +          "value": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "service",
      +          "key",
      +          "value"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "appName",
      +    "services",
      +    "infra",
      +    "skipped",
      +    "unresolved"
      +  ],
      +  "type": "object"
      +}
  4. Addedv0.45.0

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses that it only creates new files and refuses existing ones, that dryRun is the default, that imageRegistry pulls base images from an internal registry for air-gapped setups, and that it rewrites config localhost references to service names in multi-module workspaces. It also states explicit failure behavior with reasons for unsupported project shapes and pins the OTEL agent version with sha256 verification.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Everything is packed into one very long paragraph mixing build behavior, DB config, multi-module handling, and OpenTelemetry internals, so key facts like dryRun-by-default and refusal of existing files are buried mid-text. The content is substantive but not front-loaded or segmented, making it hard for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 13 parameters, an output schema, and multi-module plus air-gapped complexity, the description covers the important behavioral cases: default dry run, file refusal, unsupported project reasons, and closed-network image/OTEL handling. Return values need not be explained because an output schema exists, though the dense formatting slightly hurts usability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds meaningful semantics on top, explaining that buildInImage=false packages pre-built artifacts for closed networks, that imageRegistry sets the Dockerfile BASE_REGISTRY ARG, that modules pulls in prerequisite services and infrastructure, and that observability=otel also produces the collector. Some of this duplicates schema text, but the cross-parameter effects are genuine added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('프로젝트 진단 … 컨테이너·배포 산출물을 만듭니다') and enumerates the concrete outputs (Dockerfile, .dockerignore, docker-compose.yml, Kubernetes manifests), which distinguishes it from build/test/generate_ci siblings. It never names an alternative tool explicitly, so the differentiation is implied by artifact type rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational context: dryRun shows content only by default, only new files are written (existing files are refused), and unsupported projects (multi-module, library jar, no build files) get a reason returned. It describes multi-module workspace behavior and how 'modules' narrows services, but it does not say when to prefer this over prepare_egovframe_delivery or generate_egovframe_ci.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.