Skip to main content
Glama

interactive_feedback

Request and receive interactive feedback on project directories and summaries to improve development workflows and decision-making.

Instructions

Request interactive feedback for a given project directory and summary

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
project_directoryYesFull path to the project directory
summaryYesShort, one-line summary of the changes

Implementation Reference

  • The main handler function for the 'interactive_feedback' tool, decorated with @mcp.tool() for registration. It takes project_directory and summary, launches the feedback UI subprocess, and returns processed feedback data including text and images.
    @mcp.tool() def interactive_feedback( project_directory: Annotated[str, Field(description="Full path to the project directory")], summary: Annotated[str, Field(description="Short, one-line summary of the changes")], ) -> Dict[str, str]: """Request interactive feedback for a given project directory and summary""" result_dict = launch_feedback_ui(first_line(project_directory), first_line(summary)) return header_data(result_dict)
  • Input schema defined via Annotated types with Field descriptions for project_directory (str) and summary (str), output is Dict[str, str].
    project_directory: Annotated[str, Field(description="Full path to the project directory")], summary: Annotated[str, Field(description="Short, one-line summary of the changes")], ) -> Dict[str, str]:
  • Helper function that launches the feedback_ui.py subprocess, passing project directory and summary, captures JSON output from temp file.
    def launch_feedback_ui(project_directory: str, summary: str) -> dict[str, str]: # Create a temporary file for the feedback result with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as tmp: output_file = tmp.name try: # Get the path to feedback_ui.py relative to this script script_dir = os.path.dirname(os.path.abspath(__file__)) feedback_ui_path = os.path.join(script_dir, "feedback_ui.py") # Run feedback_ui.py as a separate process args = [ sys.executable, "-u", feedback_ui_path, "--project-directory", project_directory, "--prompt", summary, "--output-file", output_file ] result = subprocess.run( args, check=False, shell=False, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL, close_fds=True ) if result.returncode != 0: raise Exception(f"Failed to launch feedback UI: {result.returncode}") # Read the result from the temporary file with open(output_file, 'r') as f: result = json.load(f) os.unlink(output_file) return result except Exception as e: if os.path.exists(output_file): os.unlink(output_file) raise e
  • Helper function that processes the UI result: extracts logs, feedback text, compresses and converts uploaded images to MCP Image objects, returns as tuple.
    def header_data(result_dict: dict) -> tuple: # print(result_dict) # {'logs': '', 'interactive_feedback': 'asdasdas', 'uploaded_images': ['/Users/ll/Desktop/2025/interactive-feedback-mcp/images/feedback.png']} logs = result_dict.get("logs", "") interactive_feedbacktxt = result_dict.get("interactive_feedback", "") uploaded_images = result_dict.get("uploaded_images", []) processed_content: List[Union[str, Image]] = [] if logs and logs != "": processed_content.append("收集的日志: \n" + logs) if interactive_feedbacktxt and interactive_feedbacktxt != "": processed_content.append("用户反馈信息: \n" + interactive_feedbacktxt) for image_path in uploaded_images: image_data,img_format = compress_image(image_path) mcp_image = Image(data=image_data, format=img_format) processed_content.append(mcp_image) return tuple(processed_content)
  • Helper function to compress images larger than 800KB, thumbnail if needed, return bytes and format for MCP Image.
    def compress_image(image_path: str): pil_img = PILImage.open(image_path) img_format = (pil_img.format or "PNG").lower() temp_image_path = image_path + ".temp.jpg" if os.path.getsize(image_path) > 800 * 1024: img_format = (pil_img.format or "jpg").lower() pil_img.save(temp_image_path, optimize=True, quality=50) # 输出现在的尺寸 # print(f"压缩前大小: {friendly_size(os.path.getsize(image_path))}") # print(f"压缩后大小: {friendly_size(os.path.getsize(temp_image_path))}") if os.path.getsize(temp_image_path) > 800 * 1024: pil_img.thumbnail((512, 512)) pil_img.save(temp_image_path, optimize=True, quality=50) # print(f"缩放后大小: {friendly_size(os.path.getsize(temp_image_path))}") # print(f"缩放后大小: {friendly_size(os.path.getsize(temp_image_path))}") with open(temp_image_path, "rb") as f: image_data = f.read() os.unlink(temp_image_path) return image_data,img_format else: with open(image_path, "rb") as f: image_data = f.read() return image_data, img_format

Other Tools

Related Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/duolabmeng6/interactive-feedback-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server