1---2name: mcp-server-project-generator3description: Generate executable FastMCP server/connector scaffolding from one or more mcp_init.md specs (per-MCP folders or file lists). Apply envelope/env-var conventions, required directory layout, and leave TODOs+Assumptions when specs are incomplete. Never emit pytest/tests.4---56# MCP Server Project Generator78## Trigger9- Use when given MCP folders or file lists containing `mcp_init.md` and asked to scaffold runnable MCP servers/connectors from those specs.1011## Inputs12- One or more MCP units; each must include `mcp_init.md`.13- Parse each spec for: MCP type (connector|server), name (external_api_name|domain_name), tools (name, purpose, request/response fields, data_source upstream|db|mixed, error cases), external integration (API base/auth/headers/query/body, DB intent), model requirements (DAO/DTO/service/repository/connection).14- If data is missing, do **not** ask questions: choose reasonable defaults and mark “Assumption:” in README + TODO comments.1516## Outputs17- For every MCP, emit full project tree and full code per file (path + content). Project must be runnable (scaffold level). Unimplemented logic stays as TODO with interfaces shaped.18- Absolutely no pytest/테스트 files.1920## Global Conventions21- FastMCP boilerplate (must keep order/shape): 22 `from fastmcp import FastMCP` 23 `mcp = FastMCP("<mcp_name>")` 24 `@mcp.tool` (or `@mcp.tools` only if spec forces; note it in README) 25 tool def/async def … 26 `if __name__ == "__main__": mcp.run()`27- Env vars (NAME = upper snake of external_api_name/domain_name): 28 `LOG_LEVEL` (default INFO); `DB_DSN` (server only); `MCP_<NAME>_BASE_URL`; `MCP_<NAME>_API_KEY`; `MCP_<NAME>_TIMEOUT_SEC` (default 20); `MCP_<NAME>_RETRY` (default 2).29- Types mapping: string→str, integer/int→int, float/double/number→float, boolean→bool, datetime→datetime.datetime (ISO8601 parse), date→datetime.date, decimal→decimal.Decimal, object/dict→dict[str, Any], array/list→list[T or Any]. Optional/nullable/? → Optional[T]=None. Enums → Literal[...] or Enum (Literal preferred). Unknown → Any with “Assumption:” notes.3031## Required Structure (unless spec overrides)32```33<root>/34 mcp/35 common/36 settings.py # Pydantic Settings loading .env37 logging.py # std logging with request_id helper38 errors.py # ValidationError/UpstreamError/DatabaseError/InternalError + payload mapper39 http_client.py # httpx client factory with timeout/retry40 db.py # SQLAlchemy engine + SessionLocal (tool-scope)41 types.py # Meta, ErrorPayload, EnvelopeResponse42 connectors/<external_api_name>/43 mcp_connector_<external_api_name>.py44 tools/__init__.py, <tool_group>.py45 connection/__init__.py, client.py, schemas.py46 models/__init__.py, dto.py47 servers/<domain_name>/48 mcp_server_<domain_name>.py49 tools/__init__.py, <tool_group>.py50 service/__init__.py, interface.py (interface only, TODO impl)51 repository/__init__.py, repo.py (SQLAlchemy)52 models/__init__.py, dao.py (ORM), dto.py (Pydantic)53 README.md54 pyproject.toml or requirements.txt55```5657## Behavior Rules58- **Connector**: No service/repository. tools → connection.client. All upstream→internal DTO transforms live only in `connection/client.py`; tools never touch raw upstream. Entry file named `mcp_connector_<external_api_name>.py`.59- **Server**: tools → service (interface only) → repository → db. Entry file `mcp_server_<domain_name>.py`. DAO uses declarative base. Repository gets session injected. DB session scope is per tool: 60 `with SessionLocal() as session: repo = ...; ...`61- Tool design: exactly one Request DTO and one Response DTO. Docstring must include purpose, input fields, output fields, error codes, brief example. meta.source = upstream (connector), db (server DB-only), mixed (server API+DB).62- Envelope response (never raise to caller): 63 ```64 {"data": <ResponseDTO|dict>,65 "meta": {"request_id": "...", "source": "upstream|db|mixed", "generated_at": "ISO8601", "version": "v1"},66 "error": null | {"code": "VALIDATION_ERROR|UPSTREAM_ERROR|DATABASE_ERROR|INTERNAL_ERROR", "message": "...", "detail": {...}}}67 ```6869## Workflow701) Discover all `mcp_init.md` from provided folders/files. If a referenced path is missing, note as TODO and proceed with available ones. 712) For each spec, extract fields (type/name/tools/etc). Infer missing data with defaults; log “Assumption:” in README + code TODO. 723) Decide MCP type → choose connector/server layout and env var NAME. 734) Generate common layer once per project. 745) Per MCP, create entrypoint, tools, DTOs, connection/client (connector) or service/repository/models (server). Keep interfaces complete, logic TODO where spec is silent. 756) Ensure every tool returns Envelope and handles Validation/Upstream/Database/Internal errors into payload. 767) Write README.md covering MCP overview, tools, env vars, run instructions, Assumptions, TODOs. 778) Output: list every created file with path + full content. No pytest files.7879## Notes80- Keep instructions concise in outputs; avoid extra assets unless required. 81- Respect any spec-enforced import paths/decorators, but preserve FastMCP boilerplate shape. 82- Never prompt the user for clarifications. Use explicit TODO + Assumption markers instead.