Skip to main content
Glama
EricSeokgon

egovframe-scaffold-mcp

by EricSeokgon

CRUD 코드 생성

generate_egovframe_crud

Generates eGovFrame CRUD skeletons (VO, Mapper XML, Service, Controller, optional JSP and JUnit tests) for classic XML or Boot REST projects, checking file conflicts before writing.

Instructions

eGovFrame Development의 공식 CRUD wizard 입력 체계에 맞춰 VO·Mapper(XML)·Service·Controller·JSP(선택)·JUnit 5 테스트(선택) 골격을 생성합니다. Classic XML과 Boot REST 프로필을 지원하며, 전체 파일 충돌을 먼저 검사해 하나라도 존재하면 아무것도 쓰지 않습니다. v1.4: ddl 에 CREATE TABLE 문을 주면 컬럼·타입·기본키·NOT NULL·자동 증가·COMMENT 를 읽어 필드를 만들고(COMMENT·DEFAULT 안의 콤마·괄호·'primary key' 문구에 속지 않음), search 로 방언 중립 LIKE() 검색과 이스케이프된 검색 필드를 더합니다. v1.8: paging 으로 방언별 목록 페이징(LIMIT/OFFSET 또는 공통컴포넌트와 같은 ROWNUM 감싸기), classic 화면의 PaginationInfo·ui:pagination, boot REST 의 page·size 응답을 더합니다(방언은 dialect 또는 Globals.DbType).

Input Schema

NameRequiredDescriptionDefault
ddlNov1.4: CREATE TABLE 문. 컬럼·타입·PRIMARY KEY·NOT NULL·자동 증가(AUTO_INCREMENT·IDENTITY·SERIAL)·COMMENT(또는 COMMENT ON COLUMN)를 읽어 fields 를 만듭니다. COMMENT·DEFAULT 안의 콤마·괄호와 'primary key' 문구에 속지 않습니다. fields 와 함께 줄 수 없음
authorNo공식 wizard의 authoregovframe-scaffold-mcp
dryRunNotrue면 파일을 쓰지 않고 생성 계획만 반환
fieldsNo테이블 컬럼 정의(ddl 과 둘 중 하나)
pagingNov1.8: 목록 페이징 — 방언별 SQL(MySQL·MariaDB·PostgreSQL·HSQL 은 LIMIT/OFFSET, Oracle·Tibero·Altibase·CUBRID 는 공통컴포넌트와 같은 ROWNUM 감싸기), classic 은 PaginationInfo·<ui:pagination>, boot 는 page·size 와 {content, totalCount, page, size} 응답. 방언은 dialect, 없으면 프로젝트의 Globals.DbType, 그것도 없으면 설정 파일의 JDBC URL(한 방언일 때)
searchNov1.4: 목록 검색 대상 컬럼(문자열 타입). Mapper 에 방언 중립 LIKE(<bind>)와 searchCondition 분기, classic 화면에 검색 조건·이스케이프된 hidden 필드
dialectNov1.4: ddl 의 DB 방언(oracle·tibero 면 DATE 를 날짜+시각 LocalDateTime 으로). v1.8: paging 의 SQL 방식도 이것으로 정함
profileNoclassic=Spring MVC+JSP, boot=REST Controllerclassic
checkWebNo공식 wizard Web 그룹 생성 여부
pageSizeNov1.8: paging 의 페이지 목록 크기(기본 10)
pageUnitNov1.8: paging 의 한 페이지 행 수(기본 10)
withTestNoJUnit 5 서비스 계약 테스트 골격 생성
jspFolderNo프로젝트 기준 JSP 폴더
tableNameNoCRUD 대상 테이블명. 단일 SQL 식별자, 예: SAMPLE_BOARD. ddl 을 주면 생략 가능(주면 DDL 의 테이블명과 같아야 함)
voPackageNoVO 패키지
createDateNo공식 wizard의 createDate. 미지정 시 오늘 날짜
entityNameNo생성 클래스명. 미지정 시 tableName에서 PascalCase로 생성
includeJspNoclassic 프로필의 JSP 2종 생성 여부(기본 true)
projectDirYes대상 프로젝트 디렉터리(절대경로 권장, pom.xml 또는 build.gradle 필요)
basePackageYes기본 자바 패키지. 예: egovframework.example.board
implPackageNoServiceImpl 패키지
checkServiceNo공식 wizard Service 그룹 생성 여부
mapperFolderNo프로젝트 기준 Mapper XML 폴더
mapperPackageNoMapper 인터페이스 패키지
servicePackageNoService 패키지
checkDataAccessNo공식 wizard DataAccess 그룹 생성 여부
controllerPackageNoController 패키지

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv1.9.0
    • changedInput schema / properties / dialect / description
      Previous value: -"v1.4: ddl 의 DB 방언(oracle·tibero 면 DATE 를 날짜+시각 LocalDateTime 으로)"New value: +"v1.4: ddl 의 DB 방언(oracle·tibero 면 DATE 를 날짜+시각 LocalDateTime 으로). v1.8: paging 의 SQL 방식도 이것으로 정함"
    • addedInput schema / properties / pageSize
      Added value: +{
      +  "description": "v1.8: paging 의 페이지 목록 크기(기본 10)",
      +  "maximum": 20,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / pageUnit
      Added value: +{
      +  "description": "v1.8: paging 의 한 페이지 행 수(기본 10)",
      +  "maximum": 100,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / paging
      Added value: +{
      +  "default": false,
      +  "description": "v1.8: 목록 페이징 — 방언별 SQL(MySQL·MariaDB·PostgreSQL·HSQL 은 LIMIT/OFFSET, Oracle·Tibero·Altibase·CUBRID 는 공통컴포넌트와 같은 ROWNUM 감싸기), classic 은 PaginationInfo·<ui:pagination>, boot 는 page·size 와 {content, totalCount, page, size} 응답. 방언은 dialect, 없으면 프로젝트의 Globals.DbType, 그것도 없으면 설정 파일의 JDBC URL(한 방언일 때)",
      +  "type": "boolean"
      +}
  2. Changed2 schema fields changedv1.6.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / fields / items / additionalProperties
      Removed value: -false
  3. Changed6 schema fields changedv1.4.0
    • addedInput schema / properties / ddl
      Added value: +{
      +  "description": "v1.4: CREATE TABLE 문. 컬럼·타입·PRIMARY KEY·NOT NULL·자동 증가(AUTO_INCREMENT·IDENTITY·SERIAL)·COMMENT(또는 COMMENT ON COLUMN)를 읽어 fields 를 만듭니다. COMMENT·DEFAULT 안의 콤마·괄호와 'primary key' 문구에 속지 않습니다. fields 와 함께 줄 수 없음",
      +  "maxLength": 200000,
      +  "type": "string"
      +}
    • addedInput schema / properties / dialect
      Added value: +{
      +  "description": "v1.4: ddl 의 DB 방언(oracle·tibero 면 DATE 를 날짜+시각 LocalDateTime 으로)",
      +  "enum": [
      +    "mysql",
      +    "mariadb",
      +    "postgresql",
      +    "oracle",
      +    "tibero",
      +    "altibase",
      +    "cubrid",
      +    "hsql"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / fields / description
      Previous value: -"테이블 컬럼 정의"New value: +"테이블 컬럼 정의(ddl 과 둘 중 하나)"
    • addedInput schema / properties / search
      Added value: +{
      +  "description": "v1.4: 목록 검색 대상 컬럼(문자열 타입). Mapper 에 방언 중립 LIKE(<bind>)와 searchCondition 분기, classic 화면에 검색 조건·이스케이프된 hidden 필드",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • changedInput schema / properties / tableName / description
      Previous value: -"CRUD 대상 테이블명. 단일 SQL 식별자, 예: SAMPLE_BOARD"New value: +"CRUD 대상 테이블명. 단일 SQL 식별자, 예: SAMPLE_BOARD. ddl 을 주면 생략 가능(주면 DDL 의 테이블명과 같아야 함)"
    • changedInput schema / required
      Previous value: -[
      -  "projectDir",
      -  "tableName",
      -  "basePackage",
      -  "fields"
      -]New value: +[
      +  "projectDir",
      +  "basePackage"
      +]
  4. Addedv0.21.0

TDQS

A4.2/5.0
Behavior4/5

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

The standout disclosure is the all-or-nothing conflict pre-check: if any target file exists, nothing is written. That is genuinely non-obvious safety behavior beyond the annotations. It does not address idempotency (annotation says idempotentHint=false) or what happens on partial failures, so it stops short of full behavioral disclosure.

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

Conciseness3/5

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

Purpose is front-loaded correctly, but the body reads as a changelog with 'v1.4:'/'v1.8:' prefixes and repeated restatement of schema descriptions (paging, dialect). Several clauses, especially the nested parenthetical about commas and the 'primary key' string, are hard to parse and partly duplicate parameter docs.

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?

For a 27-parameter generator with no output schema, the description covers what files are produced, profile differences, paging/search feature activation and the conflict-abort contract. The notable gap is that it never describes the return value (file manifest vs dryRun plan), which matters given there is no output schema.

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, but the description adds real semantics: ddl parsing rules (COMMENT/DEFAULT commas, the 'primary key' string trap), dialect-neutral LIKE with bind and escaping for search, and per-dialect paging strategies plus the dialect-resolution fallback chain. That is value beyond the parameter list itself.

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

Purpose5/5

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

First sentence names a concrete verb (생성합니다) and enumerates the exact artifacts produced (VO, Mapper XML, Service, Controller, JSP, JUnit 5 skeleton) against a named standard (eGovFrame official CRUD wizard input). This is far more specific than any sibling generator (generate_egovframe_config, generate_egovframe_ci, create_egovframe_project), so an agent can route on purpose alone.

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 establishes when this applies (CRUD scaffolding for classic vs boot profiles) and implies the required starting conditions, but never explicitly names an alternative sibling or states when-not-to-use. The ddl-vs-fields mutual exclusion is documented in the schema, not the description, so routing guidance is clear but not exhaustive.

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