44This module contains functions to generate template files for Hatch MCP server packages.
55Each function generates a specific file for the package template.
66"""
7+
78import json
89import logging
910from pathlib import Path
1011
1112logger = logging .getLogger ("hatch.template_generator" )
1213
13- def generate_init_py ():
14+
15+ def generate_init_py () -> str :
1416 """Generate the __init__.py file content for a template package.
15-
17+
1618 Returns:
1719 str: Content for __init__.py file.
1820 """
1921 return "# Hatch package initialization\n "
2022
21- def generate_mcp_server_py (package_name : str ):
23+
24+ def generate_mcp_server_py (package_name : str ) -> str :
2225 """Generate the mcp_server.py file content for a template package.
23-
26+
2427 Args:
2528 package_name (str): Name of the package.
26-
29+
2730 Returns:
2831 str: Content for mcp_server.py file.
2932 """
@@ -34,10 +37,10 @@ def generate_mcp_server_py(package_name: str):
3437@mcp.tool()
3538def example_tool(param: str) -> str:
3639 \" \" \" Example tool function.
37-
40+
3841 Args:
3942 param (str): Example parameter.
40-
43+
4144 Returns:
4245 str: Example result.
4346 \" \" \"
@@ -47,12 +50,13 @@ def example_tool(param: str) -> str:
4750 mcp.run()
4851"""
4952
50- def generate_hatch_mcp_server_entry_py (package_name : str ):
53+
54+ def generate_hatch_mcp_server_entry_py (package_name : str ) -> str :
5155 """Generate the hatch_mcp_server_entry.py file content for a template package.
52-
56+
5357 Args:
5458 package_name (str): Name of the package.
55-
59+
5660 Returns:
5761 str: Content for hatch_mcp_server_entry.py file.
5862 """
@@ -68,13 +72,14 @@ def generate_hatch_mcp_server_entry_py(package_name: str):
6872 hatch_mcp.server.run()
6973"""
7074
75+
7176def generate_metadata_json (package_name : str , description : str = "" ):
7277 """Generate the metadata JSON content for a template package.
73-
78+
7479 Args:
7580 package_name (str): Name of the package.
7681 description (str, optional): Package description. Defaults to empty string.
77-
82+
7883 Returns:
7984 dict: Metadata dictionary.
8085 """
@@ -84,37 +89,27 @@ def generate_metadata_json(package_name: str, description: str = ""):
8489 "version" : "0.1.0" ,
8590 "description" : description or f"A Hatch package for { package_name } " ,
8691 "tags" : [],
87- "author" : {
88- "name" : "Hatch User" ,
89- "email" : ""
90- },
91- "license" : {
92- "name" : "MIT"
93- },
94- "entry_point" :
95- {
92+ "author" : {"name" : "Hatch User" , "email" : "" },
93+ "license" : {"name" : "MIT" },
94+ "entry_point" : {
9695 "mcp_server" : "mcp_server.py" ,
97- "hatch_mcp_server" : "hatch_mcp_server_entry.py"
96+ "hatch_mcp_server" : "hatch_mcp_server_entry.py" ,
9897 },
99- "tools" : [
100- {
101- "name" : "example_tool" ,
102- "description" : "Example tool function"
103- }
104- ],
98+ "tools" : [{"name" : "example_tool" , "description" : "Example tool function" }],
10599 "citations" : {
106100 "origin" : f"Origin citation for { package_name } " ,
107- "mcp" : f"MCP citation for { package_name } "
108- }
101+ "mcp" : f"MCP citation for { package_name } " ,
102+ },
109103 }
110104
111- def generate_readme_md (package_name : str , description : str = "" ):
105+
106+ def generate_readme_md (package_name : str , description : str = "" ) -> str :
112107 """Generate the README.md file content for a template package.
113-
108+
114109 Args:
115110 package_name (str): Name of the package.
116111 description (str, optional): Package description. Defaults to empty string.
117-
112+
118113 Returns:
119114 str: Content for README.md file.
120115 """
@@ -127,55 +122,58 @@ def generate_readme_md(package_name: str, description: str = ""):
127122- **example_tool**: Example tool function
128123"""
129124
130- def create_package_template (target_dir : Path , package_name : str , description : str = "" ) -> Path :
125+
126+ def create_package_template (
127+ target_dir : Path , package_name : str , description : str = ""
128+ ) -> Path :
131129 """Create a package template directory with all necessary files.
132-
130+
133131 This function orchestrates the generation of a complete package structure by:
134132 1. Creating the package directory
135133 2. Generating and writing the __init__.py file
136134 3. Generating and writing the mcp_server.py file with example tools
137135 4. Generating and writing the hatch_mcp_server_entry.py file that wraps the MCP server
138136 5. Creating the hatch_metadata.json with package information
139137 6. Generating a README.md with basic documentation
140-
138+
141139 Args:
142140 target_dir (Path): Directory where the package should be created.
143141 package_name (str): Name of the package.
144142 description (str, optional): Package description. Defaults to empty string.
145-
143+
146144 Returns:
147145 Path: Path to the created package directory.
148146 """
149147 logger .info (f"Creating package template for { package_name } in { target_dir } " )
150-
148+
151149 # Create package directory
152150 package_dir = target_dir / package_name
153151 package_dir .mkdir (parents = True , exist_ok = True )
154-
152+
155153 # Create __init__.py
156154 init_content = generate_init_py ()
157- with open (package_dir / "__init__.py" , 'w' ) as f :
155+ with open (package_dir / "__init__.py" , "w" ) as f :
158156 f .write (init_content )
159-
157+
160158 # Create mcp_server.py
161159 mcp_server_content = generate_mcp_server_py (package_name )
162- with open (package_dir / "mcp_server.py" , 'w' ) as f :
160+ with open (package_dir / "mcp_server.py" , "w" ) as f :
163161 f .write (mcp_server_content )
164-
162+
165163 # Create hatch_mcp_server_entry.py
166164 hatch_mcp_server_entry_content = generate_hatch_mcp_server_entry_py (package_name )
167- with open (package_dir / "hatch_mcp_server_entry.py" , 'w' ) as f :
165+ with open (package_dir / "hatch_mcp_server_entry.py" , "w" ) as f :
168166 f .write (hatch_mcp_server_entry_content )
169-
167+
170168 # Create metadata.json
171169 metadata = generate_metadata_json (package_name , description )
172- with open (package_dir / "hatch_metadata.json" , 'w' ) as f :
170+ with open (package_dir / "hatch_metadata.json" , "w" ) as f :
173171 json .dump (metadata , f , indent = 2 )
174-
172+
175173 # Create README.md
176174 readme_content = generate_readme_md (package_name , description )
177- with open (package_dir / "README.md" , 'w' ) as f :
175+ with open (package_dir / "README.md" , "w" ) as f :
178176 f .write (readme_content )
179-
177+
180178 logger .info (f"Package template created successfully at { package_dir } " )
181179 return package_dir
0 commit comments