This is page 18 of 24. Use http://codebase.md/sparesparrow/mcp-project-orchestrator?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .cursorrules
├── .env.example
├── .github
│ └── workflows
│ ├── build.yml
│ ├── ci-cd.yml
│ ├── ci.yml
│ ├── deploy.yml
│ ├── ecosystem-monitor.yml
│ ├── fan-out-orchestrator.yml
│ └── release.yml
├── .gitignore
├── .pre-commit-config.yaml
├── AUTOMOTIVE_CAMERA_SYSTEM_SUMMARY.md
├── automotive-camera-system
│ ├── docs
│ │ └── IMPLEMENTACE_CS.md
│ └── README.md
├── AWS_MCP_IMPLEMENTATION_SUMMARY.md
├── AWS_MCP_QUICKSTART.md
├── AWS_SIP_TRUNK_DEPLOYMENT_COMPLETE.md
├── aws-sip-trunk
│ ├── .gitignore
│ ├── config
│ │ ├── extensions.conf.j2
│ │ └── pjsip.conf.j2
│ ├── DEPLOYMENT_SUMMARY.md
│ ├── docs
│ │ ├── DEPLOYMENT.md
│ │ └── TROUBLESHOOTING.md
│ ├── PROJECT_INDEX.md
│ ├── pyproject.toml
│ ├── QUICKSTART.md
│ ├── README.md
│ ├── scripts
│ │ ├── deploy-asterisk-aws.sh
│ │ └── user-data.sh
│ ├── terraform
│ │ ├── ec2.tf
│ │ ├── main.tf
│ │ ├── monitoring.tf
│ │ ├── networking.tf
│ │ ├── outputs.tf
│ │ ├── storage.tf
│ │ ├── terraform.tfvars.example
│ │ └── variables.tf
│ ├── tests
│ │ └── test_sip_connectivity.py
│ └── VERIFICATION_CHECKLIST.md
├── CLAUDE.md
├── component_templates.json
├── conanfile.py
├── config
│ ├── default.json
│ └── project_orchestration.json
├── Containerfile
├── cursor-templates
│ └── openssl
│ ├── linux-dev.mdc.jinja2
│ └── shared.mdc.jinja2
├── data
│ └── prompts
│ └── templates
│ ├── advanced-multi-server-template.json
│ ├── analysis-assistant.json
│ ├── analyze-mermaid-diagram.json
│ ├── architecture-design-assistant.json
│ ├── code-diagram-documentation-creator.json
│ ├── code-refactoring-assistant.json
│ ├── code-review-assistant.json
│ ├── collaborative-development.json
│ ├── consolidated-interfaces-template.json
│ ├── could-you-interpret-the-assumed-applicat.json
│ ├── data-analysis-template.json
│ ├── database-query-assistant.json
│ ├── debugging-assistant.json
│ ├── development-system-prompt-zcna0.json
│ ├── development-system-prompt.json
│ ├── development-workflow.json
│ ├── docker-compose-prompt-combiner.json
│ ├── docker-containerization-guide.json
│ ├── docker-mcp-servers-orchestration.json
│ ├── foresight-assistant.json
│ ├── generate-different-types-of-questions-ab.json
│ ├── generate-mermaid-diagram.json
│ ├── image-1-describe-the-icon-in-one-sen.json
│ ├── initialize-project-setup-for-a-new-micro.json
│ ├── install-dependencies-build-run-test.json
│ ├── mcp-code-generator.json
│ ├── mcp-integration-assistant.json
│ ├── mcp-resources-explorer.json
│ ├── mcp-resources-integration.json
│ ├── mcp-server-configurator.json
│ ├── mcp-server-dev-prompt-combiner.json
│ ├── mcp-server-integration-template.json
│ ├── mcp-template-system.json
│ ├── mermaid-analysis-expert.json
│ ├── mermaid-class-diagram-generator.json
│ ├── mermaid-diagram-generator.json
│ ├── mermaid-diagram-modifier.json
│ ├── modify-mermaid-diagram.json
│ ├── monorepo-migration-guide.json
│ ├── multi-resource-context.json
│ ├── project-analysis-assistant.json
│ ├── prompt-combiner-interface.json
│ ├── prompt-templates.json
│ ├── repository-explorer.json
│ ├── research-assistant.json
│ ├── sequential-data-analysis.json
│ ├── solid-code-analysis-visualizer.json
│ ├── task-list-helper-8ithy.json
│ ├── template-based-mcp-integration.json
│ ├── templates.json
│ ├── test-prompt.json
│ └── you-are-limited-to-respond-yes-or-no-onl.json
├── docs
│ ├── AWS_MCP.md
│ ├── AWS.md
│ ├── CONAN.md
│ └── integration.md
├── elevenlabs-agents
│ ├── agent-prompts.json
│ └── README.md
├── IMPLEMENTATION_STATUS.md
├── integration_plan.md
├── LICENSE
├── MANIFEST.in
├── mcp-project-orchestrator
│ └── openssl
│ ├── .github
│ │ └── workflows
│ │ └── validate-cursor-config.yml
│ ├── conanfile.py
│ ├── CURSOR_DEPLOYMENT_POLISH.md
│ ├── cursor-rules
│ │ ├── mcp.json.jinja2
│ │ ├── prompts
│ │ │ ├── fips-compliance.md.jinja2
│ │ │ ├── openssl-coding-standards.md.jinja2
│ │ │ └── pr-review.md.jinja2
│ │ └── rules
│ │ ├── ci-linux.mdc.jinja2
│ │ ├── linux-dev.mdc.jinja2
│ │ ├── macos-dev.mdc.jinja2
│ │ ├── shared.mdc.jinja2
│ │ └── windows-dev.mdc.jinja2
│ ├── docs
│ │ └── cursor-configuration-management.md
│ ├── examples
│ │ └── example-workspace
│ │ ├── .cursor
│ │ │ ├── mcp.json
│ │ │ └── rules
│ │ │ ├── linux-dev.mdc
│ │ │ └── shared.mdc
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── conanfile.py
│ │ ├── profiles
│ │ │ ├── linux-gcc-debug.profile
│ │ │ └── linux-gcc-release.profile
│ │ ├── README.md
│ │ └── src
│ │ ├── crypto_utils.cpp
│ │ ├── crypto_utils.h
│ │ └── main.cpp
│ ├── IMPLEMENTATION_SUMMARY.md
│ ├── mcp_orchestrator
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── conan_integration.py
│ │ ├── cursor_config.py
│ │ ├── cursor_deployer.py
│ │ ├── deploy_cursor.py
│ │ ├── env_config.py
│ │ ├── platform_detector.py
│ │ └── yaml_validator.py
│ ├── openssl-cursor-example-workspace-20251014_121133.zip
│ ├── pyproject.toml
│ ├── README.md
│ ├── requirements.txt
│ ├── scripts
│ │ └── create_example_workspace.py
│ ├── setup.py
│ ├── test_deployment.py
│ └── tests
│ ├── __init__.py
│ ├── test_cursor_deployer.py
│ └── test_template_validation.py
├── printcast-agent
│ ├── .env.example
│ ├── config
│ │ └── asterisk
│ │ └── extensions.conf
│ ├── Containerfile
│ ├── docker-compose.yml
│ ├── pyproject.toml
│ ├── README.md
│ ├── scripts
│ │ └── docker-entrypoint.sh
│ ├── src
│ │ ├── integrations
│ │ │ ├── __init__.py
│ │ │ ├── asterisk.py
│ │ │ ├── content.py
│ │ │ ├── delivery.py
│ │ │ ├── elevenlabs.py
│ │ │ └── printing.py
│ │ ├── mcp_server
│ │ │ ├── __init__.py
│ │ │ ├── main.py
│ │ │ └── server.py
│ │ └── orchestration
│ │ ├── __init__.py
│ │ └── workflow.py
│ └── tests
│ └── test_mcp_server.py
├── project_orchestration.json
├── project_templates.json
├── pyproject.toml
├── README.md
├── REFACTORING_COMPLETED.md
├── REFACTORING_RECOMMENDATIONS.md
├── requirements.txt
├── scripts
│ ├── archive
│ │ ├── init_claude_test.sh
│ │ ├── init_postgres.sh
│ │ ├── start_mcp_servers.sh
│ │ └── test_claude_desktop.sh
│ ├── consolidate_mermaid.py
│ ├── consolidate_prompts.py
│ ├── consolidate_resources.py
│ ├── consolidate_templates.py
│ ├── INSTRUCTIONS.md
│ ├── README.md
│ ├── setup_aws_mcp.sh
│ ├── setup_mcp.sh
│ ├── setup_orchestrator.sh
│ ├── setup_project.py
│ └── test_mcp.sh
├── src
│ └── mcp_project_orchestrator
│ ├── __init__.py
│ ├── __main__.py
│ ├── aws_mcp.py
│ ├── cli
│ │ └── __init__.py
│ ├── cli.py
│ ├── commands
│ │ └── openssl_cli.py
│ ├── core
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── config.py
│ │ ├── exceptions.py
│ │ ├── fastmcp.py
│ │ ├── logging.py
│ │ └── managers.py
│ ├── cursor_deployer.py
│ ├── ecosystem_monitor.py
│ ├── fan_out_orchestrator.py
│ ├── fastmcp.py
│ ├── mcp-py
│ │ ├── AggregateVersions.py
│ │ ├── CustomBashTool.py
│ │ ├── FileAnnotator.py
│ │ ├── mcp-client.py
│ │ ├── mcp-server.py
│ │ ├── MermaidDiagramGenerator.py
│ │ ├── NamingAgent.py
│ │ └── solid-analyzer-agent.py
│ ├── mermaid
│ │ ├── __init__.py
│ │ ├── generator.py
│ │ ├── mermaid_orchestrator.py
│ │ ├── renderer.py
│ │ ├── templates
│ │ │ ├── AbstractFactory-diagram.json
│ │ │ ├── Adapter-diagram.json
│ │ │ ├── Analyze_Mermaid_Diagram.json
│ │ │ ├── Builder-diagram.json
│ │ │ ├── Chain-diagram.json
│ │ │ ├── Code_Diagram_Documentation_Creator.json
│ │ │ ├── Command-diagram.json
│ │ │ ├── Decorator-diagram.json
│ │ │ ├── Facade-diagram.json
│ │ │ ├── Factory-diagram.json
│ │ │ ├── flowchart
│ │ │ │ ├── AbstractFactory-diagram.json
│ │ │ │ ├── Adapter-diagram.json
│ │ │ │ ├── Analyze_Mermaid_Diagram.json
│ │ │ │ ├── Builder-diagram.json
│ │ │ │ ├── Chain-diagram.json
│ │ │ │ ├── Code_Diagram_Documentation_Creator.json
│ │ │ │ ├── Command-diagram.json
│ │ │ │ ├── Decorator-diagram.json
│ │ │ │ ├── Facade-diagram.json
│ │ │ │ ├── Factory-diagram.json
│ │ │ │ ├── Generate_Mermaid_Diagram.json
│ │ │ │ ├── generated_diagram.json
│ │ │ │ ├── integration.json
│ │ │ │ ├── Iterator-diagram.json
│ │ │ │ ├── Mediator-diagram.json
│ │ │ │ ├── Memento-diagram.json
│ │ │ │ ├── Mermaid_Analysis_Expert.json
│ │ │ │ ├── Mermaid_Class_Diagram_Generator.json
│ │ │ │ ├── Mermaid_Diagram_Generator.json
│ │ │ │ ├── Mermaid_Diagram_Modifier.json
│ │ │ │ ├── Modify_Mermaid_Diagram.json
│ │ │ │ ├── Observer-diagram.json
│ │ │ │ ├── Prototype-diagram.json
│ │ │ │ ├── Proxy-diagram.json
│ │ │ │ ├── README.json
│ │ │ │ ├── Singleton-diagram.json
│ │ │ │ ├── State-diagram.json
│ │ │ │ ├── Strategy-diagram.json
│ │ │ │ ├── TemplateMethod-diagram.json
│ │ │ │ ├── theme_dark.json
│ │ │ │ ├── theme_default.json
│ │ │ │ ├── theme_pastel.json
│ │ │ │ ├── theme_vibrant.json
│ │ │ │ └── Visitor-diagram.json
│ │ │ ├── Generate_Mermaid_Diagram.json
│ │ │ ├── generated_diagram.json
│ │ │ ├── index.json
│ │ │ ├── integration.json
│ │ │ ├── Iterator-diagram.json
│ │ │ ├── Mediator-diagram.json
│ │ │ ├── Memento-diagram.json
│ │ │ ├── Mermaid_Analysis_Expert.json
│ │ │ ├── Mermaid_Class_Diagram_Generator.json
│ │ │ ├── Mermaid_Diagram_Generator.json
│ │ │ ├── Mermaid_Diagram_Modifier.json
│ │ │ ├── Modify_Mermaid_Diagram.json
│ │ │ ├── Observer-diagram.json
│ │ │ ├── Prototype-diagram.json
│ │ │ ├── Proxy-diagram.json
│ │ │ ├── README.json
│ │ │ ├── Singleton-diagram.json
│ │ │ ├── State-diagram.json
│ │ │ ├── Strategy-diagram.json
│ │ │ ├── TemplateMethod-diagram.json
│ │ │ ├── theme_dark.json
│ │ │ ├── theme_default.json
│ │ │ ├── theme_pastel.json
│ │ │ ├── theme_vibrant.json
│ │ │ └── Visitor-diagram.json
│ │ └── types.py
│ ├── project_orchestration.py
│ ├── prompt_manager
│ │ ├── __init__.py
│ │ ├── loader.py
│ │ ├── manager.py
│ │ └── template.py
│ ├── prompts
│ │ ├── __dirname.json
│ │ ├── __image_1___describe_the_icon_in_one_sen___.json
│ │ ├── __init__.py
│ │ ├── __type.json
│ │ ├── _.json
│ │ ├── _DEFAULT_OPEN_DELIMITER.json
│ │ ├── _emojiRegex.json
│ │ ├── _UUID_CHARS.json
│ │ ├── a.json
│ │ ├── A.json
│ │ ├── Aa.json
│ │ ├── aAnnotationPadding.json
│ │ ├── absoluteThresholdGroup.json
│ │ ├── add.json
│ │ ├── ADDITIONAL_PROPERTY_FLAG.json
│ │ ├── Advanced_Multi-Server_Integration_Template.json
│ │ ├── allOptionsList.json
│ │ ├── analysis
│ │ │ ├── Data_Analysis_Template.json
│ │ │ ├── index.json
│ │ │ ├── Mermaid_Analysis_Expert.json
│ │ │ ├── Sequential_Data_Analysis_with_MCP_Integration.json
│ │ │ └── SOLID_Code_Analysis_Visualizer.json
│ │ ├── Analysis_Assistant.json
│ │ ├── Analyze_Mermaid_Diagram.json
│ │ ├── ANDROID_EVERGREEN_FIRST.json
│ │ ├── ANSI_ESCAPE_BELL.json
│ │ ├── architecture
│ │ │ ├── index.json
│ │ │ └── PromptCombiner_Interface.json
│ │ ├── Architecture_Design_Assistant.json
│ │ ├── argsTag.json
│ │ ├── ARROW.json
│ │ ├── assistant
│ │ │ ├── Analysis_Assistant.json
│ │ │ ├── Architecture_Design_Assistant.json
│ │ │ ├── Code_Refactoring_Assistant.json
│ │ │ ├── Code_Review_Assistant.json
│ │ │ ├── Database_Query_Assistant.json
│ │ │ ├── Debugging_Assistant.json
│ │ │ ├── Foresight_Assistant.json
│ │ │ ├── index.json
│ │ │ ├── MCP_Integration_Assistant.json
│ │ │ ├── Project_Analysis_Assistant.json
│ │ │ └── Research_Assistant.json
│ │ ├── astralRange.json
│ │ ├── at.json
│ │ ├── authorization_endpoint.json
│ │ ├── b.json
│ │ ├── BABELIGNORE_FILENAME.json
│ │ ├── BACKSLASH.json
│ │ ├── backupId.json
│ │ ├── BANG.json
│ │ ├── BASE64_MAP.json
│ │ ├── baseFlags.json
│ │ ├── Basic_Template.json
│ │ ├── bgModel.json
│ │ ├── bignum.json
│ │ ├── blockKeywordsStr.json
│ │ ├── BOMChar.json
│ │ ├── boundary.json
│ │ ├── brackets.json
│ │ ├── BROWSER_VAR.json
│ │ ├── bt.json
│ │ ├── BUILTIN.json
│ │ ├── BULLET.json
│ │ ├── c.json
│ │ ├── C.json
│ │ ├── CACHE_VERSION.json
│ │ ├── cacheControl.json
│ │ ├── cacheProp.json
│ │ ├── category.py
│ │ ├── CHANGE_EVENT.json
│ │ ├── CHAR_CODE_0.json
│ │ ├── chars.json
│ │ ├── cjsPattern.json
│ │ ├── cKeywords.json
│ │ ├── classForPercent.json
│ │ ├── classStr.json
│ │ ├── clientFirstMessageBare.json
│ │ ├── cmd.json
│ │ ├── Code_Diagram_Documentation_Creator.json
│ │ ├── Code_Refactoring_Assistant.json
│ │ ├── Code_Review_Assistant.json
│ │ ├── code.json
│ │ ├── coding
│ │ │ ├── __dirname.json
│ │ │ ├── _.json
│ │ │ ├── _DEFAULT_OPEN_DELIMITER.json
│ │ │ ├── _emojiRegex.json
│ │ │ ├── _UUID_CHARS.json
│ │ │ ├── a.json
│ │ │ ├── A.json
│ │ │ ├── aAnnotationPadding.json
│ │ │ ├── absoluteThresholdGroup.json
│ │ │ ├── add.json
│ │ │ ├── ADDITIONAL_PROPERTY_FLAG.json
│ │ │ ├── allOptionsList.json
│ │ │ ├── ANDROID_EVERGREEN_FIRST.json
│ │ │ ├── ANSI_ESCAPE_BELL.json
│ │ │ ├── argsTag.json
│ │ │ ├── ARROW.json
│ │ │ ├── astralRange.json
│ │ │ ├── at.json
│ │ │ ├── authorization_endpoint.json
│ │ │ ├── BABELIGNORE_FILENAME.json
│ │ │ ├── BACKSLASH.json
│ │ │ ├── BANG.json
│ │ │ ├── BASE64_MAP.json
│ │ │ ├── baseFlags.json
│ │ │ ├── bgModel.json
│ │ │ ├── bignum.json
│ │ │ ├── blockKeywordsStr.json
│ │ │ ├── BOMChar.json
│ │ │ ├── boundary.json
│ │ │ ├── brackets.json
│ │ │ ├── BROWSER_VAR.json
│ │ │ ├── bt.json
│ │ │ ├── BUILTIN.json
│ │ │ ├── BULLET.json
│ │ │ ├── c.json
│ │ │ ├── C.json
│ │ │ ├── CACHE_VERSION.json
│ │ │ ├── cacheControl.json
│ │ │ ├── cacheProp.json
│ │ │ ├── CHANGE_EVENT.json
│ │ │ ├── CHAR_CODE_0.json
│ │ │ ├── chars.json
│ │ │ ├── cjsPattern.json
│ │ │ ├── cKeywords.json
│ │ │ ├── classForPercent.json
│ │ │ ├── classStr.json
│ │ │ ├── clientFirstMessageBare.json
│ │ │ ├── cmd.json
│ │ │ ├── code.json
│ │ │ ├── colorCode.json
│ │ │ ├── comma.json
│ │ │ ├── command.json
│ │ │ ├── configJsContent.json
│ │ │ ├── connectionString.json
│ │ │ ├── cssClassStr.json
│ │ │ ├── currentBoundaryParse.json
│ │ │ ├── d.json
│ │ │ ├── data.json
│ │ │ ├── DATA.json
│ │ │ ├── dataWebpackPrefix.json
│ │ │ ├── debug.json
│ │ │ ├── decodeStateVectorV2.json
│ │ │ ├── DEFAULT_DELIMITER.json
│ │ │ ├── DEFAULT_DIAGRAM_DIRECTION.json
│ │ │ ├── DEFAULT_JS_PATTERN.json
│ │ │ ├── DEFAULT_LOG_TARGET.json
│ │ │ ├── defaultHelpOpt.json
│ │ │ ├── defaultHost.json
│ │ │ ├── deferY18nLookupPrefix.json
│ │ │ ├── DELIM.json
│ │ │ ├── delimiter.json
│ │ │ ├── DEPRECATION.json
│ │ │ ├── destMain.json
│ │ │ ├── DID_NOT_THROW.json
│ │ │ ├── direction.json
│ │ │ ├── displayValue.json
│ │ │ ├── DNS.json
│ │ │ ├── doc.json
│ │ │ ├── DOCUMENTATION_NOTE.json
│ │ │ ├── DOT.json
│ │ │ ├── DOTS.json
│ │ │ ├── dummyCompoundId.json
│ │ │ ├── e.json
│ │ │ ├── E.json
│ │ │ ├── earlyHintsLink.json
│ │ │ ├── elide.json
│ │ │ ├── EMPTY.json
│ │ │ ├── end.json
│ │ │ ├── endpoint.json
│ │ │ ├── environment.json
│ │ │ ├── ERR_CODE.json
│ │ │ ├── errMessage.json
│ │ │ ├── errMsg.json
│ │ │ ├── ERROR_MESSAGE.json
│ │ │ ├── error.json
│ │ │ ├── ERROR.json
│ │ │ ├── ERRORCLASS.json
│ │ │ ├── errorMessage.json
│ │ │ ├── es6Default.json
│ │ │ ├── ESC.json
│ │ │ ├── Escapable.json
│ │ │ ├── escapedChar.json
│ │ │ ├── escapeFuncStr.json
│ │ │ ├── escSlash.json
│ │ │ ├── ev.json
│ │ │ ├── event.json
│ │ │ ├── execaMessage.json
│ │ │ ├── EXPECTED_LABEL.json
│ │ │ ├── expected.json
│ │ │ ├── expectedString.json
│ │ │ ├── expression1.json
│ │ │ ├── EXTENSION.json
│ │ │ ├── f.json
│ │ │ ├── FAIL_TEXT.json
│ │ │ ├── FILE_BROWSER_FACTORY.json
│ │ │ ├── fill.json
│ │ │ ├── findPackageJson.json
│ │ │ ├── fnKey.json
│ │ │ ├── FORMAT.json
│ │ │ ├── formatted.json
│ │ │ ├── from.json
│ │ │ ├── fullpaths.json
│ │ │ ├── FUNC_ERROR_TEXT.json
│ │ │ ├── GenStateSuspendedStart.json
│ │ │ ├── GENSYNC_EXPECTED_START.json
│ │ │ ├── gutter.json
│ │ │ ├── h.json
│ │ │ ├── handlerFuncName.json
│ │ │ ├── HASH_UNDEFINED.json
│ │ │ ├── head.json
│ │ │ ├── helpMessage.json
│ │ │ ├── HINT_ARG.json
│ │ │ ├── HOOK_RETURNED_NOTHING_ERROR_MESSAGE.json
│ │ │ ├── i.json
│ │ │ ├── id.json
│ │ │ ├── identifier.json
│ │ │ ├── Identifier.json
│ │ │ ├── INDENT.json
│ │ │ ├── indentation.json
│ │ │ ├── index.json
│ │ │ ├── INDIRECTION_FRAGMENT.json
│ │ │ ├── input.json
│ │ │ ├── inputText.json
│ │ │ ├── insert.json
│ │ │ ├── insertPromptQuery.json
│ │ │ ├── INSPECT_MAX_BYTES.json
│ │ │ ├── intToCharMap.json
│ │ │ ├── IS_ITERABLE_SENTINEL.json
│ │ │ ├── IS_KEYED_SENTINEL.json
│ │ │ ├── isConfigType.json
│ │ │ ├── isoSentinel.json
│ │ │ ├── isSourceNode.json
│ │ │ ├── j.json
│ │ │ ├── JAKE_CMD.json
│ │ │ ├── JEST_GLOBAL_NAME.json
│ │ │ ├── JEST_GLOBALS_MODULE_NAME.json
│ │ │ ├── JSON_SYNTAX_CHAR.json
│ │ │ ├── json.json
│ │ │ ├── jsonType.json
│ │ │ ├── jupyter_namespaceObject.json
│ │ │ ├── JUPYTERLAB_DOCMANAGER_PLUGIN_ID.json
│ │ │ ├── k.json
│ │ │ ├── KERNEL_STATUS_ERROR_CLASS.json
│ │ │ ├── key.json
│ │ │ ├── l.json
│ │ │ ├── labelId.json
│ │ │ ├── LATEST_PROTOCOL_VERSION.json
│ │ │ ├── LETTERDASHNUMBER.json
│ │ │ ├── LF.json
│ │ │ ├── LIMIT_REPLACE_NODE.json
│ │ │ ├── logTime.json
│ │ │ ├── lstatkey.json
│ │ │ ├── lt.json
│ │ │ ├── m.json
│ │ │ ├── maliciousPayload.json
│ │ │ ├── mask.json
│ │ │ ├── match.json
│ │ │ ├── matchingDelim.json
│ │ │ ├── MAXIMUM_MESSAGE_SIZE.json
│ │ │ ├── mdcContent.json
│ │ │ ├── MERMAID_DOM_ID_PREFIX.json
│ │ │ ├── message.json
│ │ │ ├── messages.json
│ │ │ ├── meth.json
│ │ │ ├── minimatch.json
│ │ │ ├── MOCK_CONSTRUCTOR_NAME.json
│ │ │ ├── MOCKS_PATTERN.json
│ │ │ ├── moduleDirectory.json
│ │ │ ├── msg.json
│ │ │ ├── mtr.json
│ │ │ ├── multipartType.json
│ │ │ ├── n.json
│ │ │ ├── N.json
│ │ │ ├── name.json
│ │ │ ├── NATIVE_PLATFORM.json
│ │ │ ├── newUrl.json
│ │ │ ├── NM.json
│ │ │ ├── NO_ARGUMENTS.json
│ │ │ ├── NO_DIFF_MESSAGE.json
│ │ │ ├── NODE_MODULES.json
│ │ │ ├── nodeInternalPrefix.json
│ │ │ ├── nonASCIIidentifierStartChars.json
│ │ │ ├── nonKey.json
│ │ │ ├── NOT_A_DOT.json
│ │ │ ├── notCharacterOrDash.json
│ │ │ ├── notebookURL.json
│ │ │ ├── notSelector.json
│ │ │ ├── nullTag.json
│ │ │ ├── num.json
│ │ │ ├── NUMBER.json
│ │ │ ├── o.json
│ │ │ ├── O.json
│ │ │ ├── octChar.json
│ │ │ ├── octetStreamType.json
│ │ │ ├── operators.json
│ │ │ ├── out.json
│ │ │ ├── OUTSIDE_JEST_VM_PROTOCOL.json
│ │ │ ├── override.json
│ │ │ ├── p.json
│ │ │ ├── PACKAGE_FILENAME.json
│ │ │ ├── PACKAGE_JSON.json
│ │ │ ├── packageVersion.json
│ │ │ ├── paddedNumber.json
│ │ │ ├── page.json
│ │ │ ├── parseClass.json
│ │ │ ├── path.json
│ │ │ ├── pathExt.json
│ │ │ ├── pattern.json
│ │ │ ├── PatternBoolean.json
│ │ │ ├── pBuiltins.json
│ │ │ ├── pFloatForm.json
│ │ │ ├── pkg.json
│ │ │ ├── PLUGIN_ID_DOC_MANAGER.json
│ │ │ ├── plusChar.json
│ │ │ ├── PN_CHARS.json
│ │ │ ├── point.json
│ │ │ ├── prefix.json
│ │ │ ├── PRETTY_PLACEHOLDER.json
│ │ │ ├── property_prefix.json
│ │ │ ├── pubkey256.json
│ │ │ ├── Q.json
│ │ │ ├── qmark.json
│ │ │ ├── QO.json
│ │ │ ├── query.json
│ │ │ ├── querystringType.json
│ │ │ ├── queryText.json
│ │ │ ├── r.json
│ │ │ ├── R.json
│ │ │ ├── rangeStart.json
│ │ │ ├── re.json
│ │ │ ├── reI.json
│ │ │ ├── REQUIRED_FIELD_SYMBOL.json
│ │ │ ├── reserve.json
│ │ │ ├── resolvedDestination.json
│ │ │ ├── resolverDir.json
│ │ │ ├── responseType.json
│ │ │ ├── result.json
│ │ │ ├── ROOT_DESCRIBE_BLOCK_NAME.json
│ │ │ ├── ROOT_NAMESPACE_NAME.json
│ │ │ ├── ROOT_TASK_NAME.json
│ │ │ ├── route.json
│ │ │ ├── RUNNING_TEXT.json
│ │ │ ├── s.json
│ │ │ ├── SCHEMA_PATH.json
│ │ │ ├── se.json
│ │ │ ├── SEARCHABLE_CLASS.json
│ │ │ ├── secret.json
│ │ │ ├── selector.json
│ │ │ ├── SEMVER_SPEC_VERSION.json
│ │ │ ├── sensitiveHeaders.json
│ │ │ ├── sep.json
│ │ │ ├── separator.json
│ │ │ ├── SHAPE_STATE.json
│ │ │ ├── shape.json
│ │ │ ├── SHARED.json
│ │ │ ├── short.json
│ │ │ ├── side.json
│ │ │ ├── SNAPSHOT_VERSION.json
│ │ │ ├── SOURCE_MAPPING_PREFIX.json
│ │ │ ├── source.json
│ │ │ ├── sourceMapContent.json
│ │ │ ├── SPACE_SYMBOL.json
│ │ │ ├── SPACE.json
│ │ │ ├── sqlKeywords.json
│ │ │ ├── sranges.json
│ │ │ ├── st.json
│ │ │ ├── ST.json
│ │ │ ├── stack.json
│ │ │ ├── START_HIDING.json
│ │ │ ├── START_OF_LINE.json
│ │ │ ├── startNoTraversal.json
│ │ │ ├── STATES.json
│ │ │ ├── stats.json
│ │ │ ├── statSync.json
│ │ │ ├── storageStatus.json
│ │ │ ├── storageType.json
│ │ │ ├── str.json
│ │ │ ├── stringifiedObject.json
│ │ │ ├── stringPath.json
│ │ │ ├── stringResult.json
│ │ │ ├── stringTag.json
│ │ │ ├── strValue.json
│ │ │ ├── style.json
│ │ │ ├── SUB_NAME.json
│ │ │ ├── subkey.json
│ │ │ ├── SUBPROTOCOL.json
│ │ │ ├── SUITE_NAME.json
│ │ │ ├── symbolPattern.json
│ │ │ ├── symbolTag.json
│ │ │ ├── t.json
│ │ │ ├── T.json
│ │ │ ├── templateDir.json
│ │ │ ├── tempName.json
│ │ │ ├── text.json
│ │ │ ├── time.json
│ │ │ ├── titleSeparator.json
│ │ │ ├── tmpl.json
│ │ │ ├── tn.json
│ │ │ ├── toValue.json
│ │ │ ├── transform.json
│ │ │ ├── trustProxyDefaultSymbol.json
│ │ │ ├── typeArgumentsKey.json
│ │ │ ├── typeKey.json
│ │ │ ├── typeMessage.json
│ │ │ ├── typesRegistryPackageName.json
│ │ │ ├── u.json
│ │ │ ├── UNDEFINED.json
│ │ │ ├── unit.json
│ │ │ ├── UNMATCHED_SURROGATE_PAIR_REPLACE.json
│ │ │ ├── ur.json
│ │ │ ├── USAGE.json
│ │ │ ├── value.json
│ │ │ ├── Vr.json
│ │ │ ├── watchmanURL.json
│ │ │ ├── webkit.json
│ │ │ ├── xhtml.json
│ │ │ ├── XP_DEFAULT_PATHEXT.json
│ │ │ └── y.json
│ │ ├── Collaborative_Development_with_MCP_Integration.json
│ │ ├── colorCode.json
│ │ ├── comma.json
│ │ ├── command.json
│ │ ├── completionShTemplate.json
│ │ ├── configJsContent.json
│ │ ├── connectionString.json
│ │ ├── Consolidated_TypeScript_Interfaces_Template.json
│ │ ├── Could_you_interpret_the_assumed_applicat___.json
│ │ ├── cssClassStr.json
│ │ ├── currentBoundaryParse.json
│ │ ├── d.json
│ │ ├── Data_Analysis_Template.json
│ │ ├── data.json
│ │ ├── DATA.json
│ │ ├── Database_Query_Assistant.json
│ │ ├── dataWebpackPrefix.json
│ │ ├── debug.json
│ │ ├── Debugging_Assistant.json
│ │ ├── decodeStateVectorV2.json
│ │ ├── DEFAULT_DELIMITER.json
│ │ ├── DEFAULT_DIAGRAM_DIRECTION.json
│ │ ├── DEFAULT_INDENT.json
│ │ ├── DEFAULT_JS_PATTERN.json
│ │ ├── DEFAULT_LOG_TARGET.json
│ │ ├── defaultHelpOpt.json
│ │ ├── defaultHost.json
│ │ ├── deferY18nLookupPrefix.json
│ │ ├── DELIM.json
│ │ ├── delimiter.json
│ │ ├── DEPRECATION.json
│ │ ├── DESCENDING.json
│ │ ├── destMain.json
│ │ ├── development
│ │ │ ├── Collaborative_Development_with_MCP_Integration.json
│ │ │ ├── Consolidated_TypeScript_Interfaces_Template.json
│ │ │ ├── Development_Workflow.json
│ │ │ ├── index.json
│ │ │ ├── MCP_Server_Development_Prompt_Combiner.json
│ │ │ └── Monorepo_Migration_and_Code_Organization_Guide.json
│ │ ├── Development_System_Prompt.json
│ │ ├── Development_Workflow.json
│ │ ├── devops
│ │ │ ├── Docker_Compose_Prompt_Combiner.json
│ │ │ ├── Docker_Containerization_Guide.json
│ │ │ └── index.json
│ │ ├── DID_NOT_THROW.json
│ │ ├── direction.json
│ │ ├── displayValue.json
│ │ ├── DNS.json
│ │ ├── doc.json
│ │ ├── Docker_Compose_Prompt_Combiner.json
│ │ ├── Docker_Containerization_Guide.json
│ │ ├── Docker_MCP_Servers_Orchestration_Guide.json
│ │ ├── DOCUMENTATION_NOTE.json
│ │ ├── DOT.json
│ │ ├── DOTS.json
│ │ ├── dummyCompoundId.json
│ │ ├── e.json
│ │ ├── E.json
│ │ ├── earlyHintsLink.json
│ │ ├── elide.json
│ │ ├── EMPTY.json
│ │ ├── encoded.json
│ │ ├── end.json
│ │ ├── endpoint.json
│ │ ├── environment.json
│ │ ├── ERR_CODE.json
│ │ ├── errMessage.json
│ │ ├── errMsg.json
│ │ ├── ERROR_MESSAGE.json
│ │ ├── error.json
│ │ ├── ERROR.json
│ │ ├── ERRORCLASS.json
│ │ ├── errorMessage.json
│ │ ├── es6Default.json
│ │ ├── ESC.json
│ │ ├── Escapable.json
│ │ ├── escapedChar.json
│ │ ├── escapeFuncStr.json
│ │ ├── escSlash.json
│ │ ├── ev.json
│ │ ├── event.json
│ │ ├── execaMessage.json
│ │ ├── EXPECTED_LABEL.json
│ │ ├── expected.json
│ │ ├── expectedString.json
│ │ ├── expression1.json
│ │ ├── EXTENSION.json
│ │ ├── f.json
│ │ ├── FAIL_TEXT.json
│ │ ├── FILE_BROWSER_FACTORY.json
│ │ ├── fill.json
│ │ ├── findPackageJson.json
│ │ ├── fnKey.json
│ │ ├── Foresight_Assistant.json
│ │ ├── FORMAT.json
│ │ ├── formatted.json
│ │ ├── from.json
│ │ ├── fullpaths.json
│ │ ├── FUNC_ERROR_TEXT.json
│ │ ├── general
│ │ │ └── index.json
│ │ ├── Generate_different_types_of_questions_ab___.json
│ │ ├── Generate_Mermaid_Diagram.json
│ │ ├── GenStateSuspendedStart.json
│ │ ├── GENSYNC_EXPECTED_START.json
│ │ ├── GitHub_Repository_Explorer.json
│ │ ├── gutter.json
│ │ ├── h.json
│ │ ├── handlerFuncName.json
│ │ ├── HASH_UNDEFINED.json
│ │ ├── head.json
│ │ ├── helpMessage.json
│ │ ├── HINT_ARG.json
│ │ ├── HOOK_RETURNED_NOTHING_ERROR_MESSAGE.json
│ │ ├── i.json
│ │ ├── id.json
│ │ ├── identifier.json
│ │ ├── Identifier.json
│ │ ├── INDENT.json
│ │ ├── indentation.json
│ │ ├── index.json
│ │ ├── INDIRECTION_FRAGMENT.json
│ │ ├── Initialize_project_setup_for_a_new_micro___.json
│ │ ├── input.json
│ │ ├── inputText.json
│ │ ├── insert.json
│ │ ├── insertPromptQuery.json
│ │ ├── INSPECT_MAX_BYTES.json
│ │ ├── install_dependencies__build__run__test____.json
│ │ ├── intToCharMap.json
│ │ ├── IS_ITERABLE_SENTINEL.json
│ │ ├── IS_KEYED_SENTINEL.json
│ │ ├── isConfigType.json
│ │ ├── isoSentinel.json
│ │ ├── isSourceNode.json
│ │ ├── j.json
│ │ ├── J.json
│ │ ├── JAKE_CMD.json
│ │ ├── JEST_GLOBAL_NAME.json
│ │ ├── JEST_GLOBALS_MODULE_NAME.json
│ │ ├── JSON_SYNTAX_CHAR.json
│ │ ├── json.json
│ │ ├── jsonType.json
│ │ ├── jupyter_namespaceObject.json
│ │ ├── JUPYTERLAB_DOCMANAGER_PLUGIN_ID.json
│ │ ├── k.json
│ │ ├── KERNEL_STATUS_ERROR_CLASS.json
│ │ ├── key.json
│ │ ├── l.json
│ │ ├── labelId.json
│ │ ├── LATEST_PROTOCOL_VERSION.json
│ │ ├── LETTERDASHNUMBER.json
│ │ ├── LF.json
│ │ ├── LIMIT_REPLACE_NODE.json
│ │ ├── LINE_FEED.json
│ │ ├── logTime.json
│ │ ├── lstatkey.json
│ │ ├── lt.json
│ │ ├── m.json
│ │ ├── maliciousPayload.json
│ │ ├── manager.py
│ │ ├── marker.json
│ │ ├── mask.json
│ │ ├── match.json
│ │ ├── matchingDelim.json
│ │ ├── MAXIMUM_MESSAGE_SIZE.json
│ │ ├── MCP_Integration_Assistant.json
│ │ ├── MCP_Resources_Explorer.json
│ │ ├── MCP_Resources_Integration_Guide.json
│ │ ├── MCP_Server_Development_Prompt_Combiner.json
│ │ ├── MCP_Server_Integration_Guide.json
│ │ ├── mcp-code-generator.json
│ │ ├── mdcContent.json
│ │ ├── Mermaid_Analysis_Expert.json
│ │ ├── Mermaid_Class_Diagram_Generator.json
│ │ ├── Mermaid_Diagram_Generator.json
│ │ ├── Mermaid_Diagram_Modifier.json
│ │ ├── MERMAID_DOM_ID_PREFIX.json
│ │ ├── message.json
│ │ ├── messages.json
│ │ ├── meth.json
│ │ ├── minimatch.json
│ │ ├── MOBILE_QUERY.json
│ │ ├── MOCK_CONSTRUCTOR_NAME.json
│ │ ├── MOCKS_PATTERN.json
│ │ ├── Modify_Mermaid_Diagram.json
│ │ ├── moduleDirectory.json
│ │ ├── Monorepo_Migration_and_Code_Organization_Guide.json
│ │ ├── msg.json
│ │ ├── mtr.json
│ │ ├── Multi-Resource_Context_Assistant.json
│ │ ├── multipartType.json
│ │ ├── n.json
│ │ ├── N.json
│ │ ├── name.json
│ │ ├── NATIVE_PLATFORM.json
│ │ ├── newUrl.json
│ │ ├── NM.json
│ │ ├── NO_ARGUMENTS.json
│ │ ├── NO_DIFF_MESSAGE.json
│ │ ├── NODE_MODULES.json
│ │ ├── nodeInternalPrefix.json
│ │ ├── nonASCIIidentifierStartChars.json
│ │ ├── nonKey.json
│ │ ├── NOT_A_DOT.json
│ │ ├── notCharacterOrDash.json
│ │ ├── notebookURL.json
│ │ ├── notSelector.json
│ │ ├── nullTag.json
│ │ ├── num.json
│ │ ├── NUMBER.json
│ │ ├── o.json
│ │ ├── O.json
│ │ ├── octChar.json
│ │ ├── octetStreamType.json
│ │ ├── operators.json
│ │ ├── other
│ │ │ ├── __image_1___describe_the_icon_in_one_sen___.json
│ │ │ ├── __type.json
│ │ │ ├── Advanced_Multi-Server_Integration_Template.json
│ │ │ ├── Analyze_Mermaid_Diagram.json
│ │ │ ├── Basic_Template.json
│ │ │ ├── Code_Diagram_Documentation_Creator.json
│ │ │ ├── Collaborative_Development_with_MCP_Integration.json
│ │ │ ├── completionShTemplate.json
│ │ │ ├── Could_you_interpret_the_assumed_applicat___.json
│ │ │ ├── DEFAULT_INDENT.json
│ │ │ ├── Docker_MCP_Servers_Orchestration_Guide.json
│ │ │ ├── Generate_different_types_of_questions_ab___.json
│ │ │ ├── Generate_Mermaid_Diagram.json
│ │ │ ├── GitHub_Repository_Explorer.json
│ │ │ ├── index.json
│ │ │ ├── Initialize_project_setup_for_a_new_micro___.json
│ │ │ ├── install_dependencies__build__run__test____.json
│ │ │ ├── LINE_FEED.json
│ │ │ ├── MCP_Resources_Explorer.json
│ │ │ ├── MCP_Resources_Integration_Guide.json
│ │ │ ├── MCP_Server_Integration_Guide.json
│ │ │ ├── mcp-code-generator.json
│ │ │ ├── Mermaid_Class_Diagram_Generator.json
│ │ │ ├── Mermaid_Diagram_Generator.json
│ │ │ ├── Mermaid_Diagram_Modifier.json
│ │ │ ├── Modify_Mermaid_Diagram.json
│ │ │ ├── Multi-Resource_Context_Assistant.json
│ │ │ ├── output.json
│ │ │ ├── sseUrl.json
│ │ │ ├── string.json
│ │ │ ├── Task_List_Helper.json
│ │ │ ├── Template-Based_MCP_Integration.json
│ │ │ ├── Test_Prompt.json
│ │ │ ├── type.json
│ │ │ ├── VERSION.json
│ │ │ ├── WIN_SLASH.json
│ │ │ └── You_are_limited_to_respond_Yes_or_No_onl___.json
│ │ ├── out.json
│ │ ├── output.json
│ │ ├── OUTSIDE_JEST_VM_PROTOCOL.json
│ │ ├── override.json
│ │ ├── p.json
│ │ ├── PACKAGE_FILENAME.json
│ │ ├── PACKAGE_JSON.json
│ │ ├── packageVersion.json
│ │ ├── paddedNumber.json
│ │ ├── page.json
│ │ ├── parseClass.json
│ │ ├── PATH_NODE_MODULES.json
│ │ ├── path.json
│ │ ├── pathExt.json
│ │ ├── pattern.json
│ │ ├── PatternBoolean.json
│ │ ├── pBuiltins.json
│ │ ├── pFloatForm.json
│ │ ├── pkg.json
│ │ ├── PLUGIN_ID_DOC_MANAGER.json
│ │ ├── plusChar.json
│ │ ├── PN_CHARS.json
│ │ ├── point.json
│ │ ├── prefix.json
│ │ ├── PRETTY_PLACEHOLDER.json
│ │ ├── Project_Analysis_Assistant.json
│ │ ├── ProjectsUpdatedInBackgroundEvent.json
│ │ ├── PromptCombiner_Interface.json
│ │ ├── promptId.json
│ │ ├── property_prefix.json
│ │ ├── pubkey256.json
│ │ ├── Q.json
│ │ ├── qmark.json
│ │ ├── QO.json
│ │ ├── query.json
│ │ ├── querystringType.json
│ │ ├── queryText.json
│ │ ├── r.json
│ │ ├── R.json
│ │ ├── rangeStart.json
│ │ ├── re.json
│ │ ├── reI.json
│ │ ├── REQUIRED_FIELD_SYMBOL.json
│ │ ├── Research_Assistant.json
│ │ ├── reserve.json
│ │ ├── resolvedDestination.json
│ │ ├── resolverDir.json
│ │ ├── responseType.json
│ │ ├── result.json
│ │ ├── ROOT_DESCRIBE_BLOCK_NAME.json
│ │ ├── ROOT_NAMESPACE_NAME.json
│ │ ├── ROOT_TASK_NAME.json
│ │ ├── route.json
│ │ ├── RUNNING_TEXT.json
│ │ ├── RXstyle.json
│ │ ├── s.json
│ │ ├── SCHEMA_PATH.json
│ │ ├── schemaQuery.json
│ │ ├── se.json
│ │ ├── SEARCHABLE_CLASS.json
│ │ ├── secret.json
│ │ ├── selector.json
│ │ ├── SEMVER_SPEC_VERSION.json
│ │ ├── sensitiveHeaders.json
│ │ ├── sep.json
│ │ ├── separator.json
│ │ ├── Sequential_Data_Analysis_with_MCP_Integration.json
│ │ ├── SHAPE_STATE.json
│ │ ├── shape.json
│ │ ├── SHARED.json
│ │ ├── short.json
│ │ ├── side.json
│ │ ├── SNAPSHOT_VERSION.json
│ │ ├── SOLID_Code_Analysis_Visualizer.json
│ │ ├── SOURCE_MAPPING_PREFIX.json
│ │ ├── source.json
│ │ ├── sourceMapContent.json
│ │ ├── SPACE_SYMBOL.json
│ │ ├── SPACE.json
│ │ ├── sqlKeywords.json
│ │ ├── sranges.json
│ │ ├── sseUrl.json
│ │ ├── st.json
│ │ ├── ST.json
│ │ ├── stack.json
│ │ ├── START_HIDING.json
│ │ ├── START_OF_LINE.json
│ │ ├── startNoTraversal.json
│ │ ├── STATES.json
│ │ ├── stats.json
│ │ ├── statSync.json
│ │ ├── status.json
│ │ ├── storageStatus.json
│ │ ├── storageType.json
│ │ ├── str.json
│ │ ├── string.json
│ │ ├── stringifiedObject.json
│ │ ├── stringPath.json
│ │ ├── stringResult.json
│ │ ├── stringTag.json
│ │ ├── strValue.json
│ │ ├── style.json
│ │ ├── SUB_NAME.json
│ │ ├── subkey.json
│ │ ├── SUBPROTOCOL.json
│ │ ├── SUITE_NAME.json
│ │ ├── symbolPattern.json
│ │ ├── symbolTag.json
│ │ ├── system
│ │ │ ├── Aa.json
│ │ │ ├── b.json
│ │ │ ├── Development_System_Prompt.json
│ │ │ ├── index.json
│ │ │ ├── marker.json
│ │ │ ├── PATH_NODE_MODULES.json
│ │ │ ├── ProjectsUpdatedInBackgroundEvent.json
│ │ │ ├── RXstyle.json
│ │ │ ├── status.json
│ │ │ └── versionMajorMinor.json
│ │ ├── t.json
│ │ ├── T.json
│ │ ├── Task_List_Helper.json
│ │ ├── Template-Based_MCP_Integration.json
│ │ ├── template.py
│ │ ├── templateDir.json
│ │ ├── tempName.json
│ │ ├── Test_Prompt.json
│ │ ├── text.json
│ │ ├── time.json
│ │ ├── titleSeparator.json
│ │ ├── tmpl.json
│ │ ├── tn.json
│ │ ├── TOPBAR_FACTORY.json
│ │ ├── toValue.json
│ │ ├── transform.json
│ │ ├── trustProxyDefaultSymbol.json
│ │ ├── txt.json
│ │ ├── type.json
│ │ ├── typeArgumentsKey.json
│ │ ├── typeKey.json
│ │ ├── typeMessage.json
│ │ ├── typesRegistryPackageName.json
│ │ ├── u.json
│ │ ├── UNDEFINED.json
│ │ ├── unit.json
│ │ ├── UNMATCHED_SURROGATE_PAIR_REPLACE.json
│ │ ├── ur.json
│ │ ├── usage.json
│ │ ├── USAGE.json
│ │ ├── user
│ │ │ ├── backupId.json
│ │ │ ├── DESCENDING.json
│ │ │ ├── encoded.json
│ │ │ ├── index.json
│ │ │ ├── J.json
│ │ │ ├── MOBILE_QUERY.json
│ │ │ ├── promptId.json
│ │ │ ├── schemaQuery.json
│ │ │ ├── TOPBAR_FACTORY.json
│ │ │ ├── txt.json
│ │ │ └── usage.json
│ │ ├── value.json
│ │ ├── VERSION.json
│ │ ├── version.py
│ │ ├── versionMajorMinor.json
│ │ ├── Vr.json
│ │ ├── watchmanURL.json
│ │ ├── webkit.json
│ │ ├── WIN_SLASH.json
│ │ ├── xhtml.json
│ │ ├── XP_DEFAULT_PATHEXT.json
│ │ ├── y.json
│ │ └── You_are_limited_to_respond_Yes_or_No_onl___.json
│ ├── resources
│ │ ├── __init__.py
│ │ ├── code_examples
│ │ │ └── index.json
│ │ ├── config
│ │ │ └── index.json
│ │ ├── documentation
│ │ │ └── index.json
│ │ ├── images
│ │ │ └── index.json
│ │ ├── index.json
│ │ └── other
│ │ └── index.json
│ ├── server.py
│ ├── templates
│ │ ├── __init__.py
│ │ ├── AbstractFactory.json
│ │ ├── Adapter.json
│ │ ├── base.py
│ │ ├── Builder.json
│ │ ├── Chain.json
│ │ ├── Command.json
│ │ ├── component
│ │ │ ├── AbstractFactory.json
│ │ │ ├── Adapter.json
│ │ │ ├── Builder.json
│ │ │ ├── Chain.json
│ │ │ ├── Command.json
│ │ │ ├── Decorator.json
│ │ │ ├── Facade.json
│ │ │ ├── Factory.json
│ │ │ ├── Iterator.json
│ │ │ ├── Mediator.json
│ │ │ ├── Memento.json
│ │ │ ├── Observer.json
│ │ │ ├── Prototype.json
│ │ │ ├── Proxy.json
│ │ │ ├── Singleton.json
│ │ │ ├── State.json
│ │ │ ├── Strategy.json
│ │ │ ├── TemplateMethod.json
│ │ │ └── Visitor.json
│ │ ├── component.py
│ │ ├── Decorator.json
│ │ ├── Facade.json
│ │ ├── Factory.json
│ │ ├── index.json
│ │ ├── Iterator.json
│ │ ├── manager.py
│ │ ├── Mediator.json
│ │ ├── Memento.json
│ │ ├── Observer.json
│ │ ├── project.py
│ │ ├── Prototype.json
│ │ ├── Proxy.json
│ │ ├── renderer.py
│ │ ├── Singleton.json
│ │ ├── State.json
│ │ ├── Strategy.json
│ │ ├── template_manager.py
│ │ ├── TemplateMethod.json
│ │ ├── types.py
│ │ └── Visitor.json
│ └── utils
│ └── __init__.py
├── SUMMARY.md
├── TASK_COMPLETION_SUMMARY.md
├── templates
│ └── openssl
│ ├── files
│ │ ├── CMakeLists.txt.jinja2
│ │ ├── conanfile.py.jinja2
│ │ ├── main.cpp.jinja2
│ │ └── README.md.jinja2
│ ├── openssl-consumer.json
│ └── template.json
├── test_openssl_integration.sh
├── test_package
│ └── conanfile.py
└── tests
├── __init__.py
├── conftest.py
├── integration
│ ├── test_core_integration.py
│ ├── test_mermaid_integration.py
│ ├── test_prompt_manager_integration.py
│ └── test_server_integration.py
├── test_aws_mcp.py
├── test_base_classes.py
├── test_config.py
├── test_exceptions.py
├── test_mermaid.py
├── test_prompts.py
└── test_templates.py
```
# Files
--------------------------------------------------------------------------------
/src/mcp_project_orchestrator/prompts/Docker_MCP_Servers_Orchestration_Guide.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "name": "Docker MCP Servers Orchestration Guide",
3 | "description": "A comprehensive guide for setting up, configuring, and orchestrating multiple MCP servers in a Docker environment",
4 | "type": "prompt",
5 | "category": "other",
6 | "content": "# Docker MCP Servers Orchestration Guide\\n\\n## Overview\\n\\nThis guide will help you set up a containerized environment with multiple integrated MCP servers for {{use_case}}. The architecture leverages Docker Compose to orchestrate these servers, providing a robust foundation for AI-powered applications with enhanced context capabilities.\\n\\n## Prerequisites\\n\\n- Docker and Docker Compose installed\\n- Basic understanding of containerization concepts\\n- Git for cloning repositories\\n- {{additional_prerequisites}}\\n\\n## Core MCP Servers Architecture\\n\\n```mermaid\\ngraph TD\\n subgraph \\\\\\\"Docker Compose Network\\\\\\\"\\n subgraph \\\\\\\"Core Service\\\\\\\"\\n MCP[MCP Prompts Server]\\n end\\n \\n subgraph \\\\\\\"MCP Resource Servers\\\\\\\"\\n FS[Filesystem Server]\\n MEM[Memory Server]\\n GH[GitHub Server]\\n ST[Sequential Thinking]\\n EL[ElevenLabs Server]\\n {{additional_servers}}\\n end\\n \\n subgraph \\\\\\\"Storage Options\\\\\\\"\\n File[(File Storage)]\\n PG[(PostgreSQL)]\\n PGAI[(PGAI/TimescaleDB)]\\n end\\n end\\n \\n Client[AI Client] -->|Requests| MCP\\n MCP -->|Resource URI Requests| FS\\n MCP -->|Resource URI Requests| MEM\\n MCP -->|Resource URI Requests| GH\\n MCP -->|Resource URI Requests| ST\\n MCP -->|Resource URI Requests| EL\\n \\n MCP -->|Storage| File\\n MCP -->|Storage| PG\\n MCP -->|Storage| PGAI\\n \\n FS -->|Access| LocalFiles[(Local Files)]\\n GH -->|API Calls| GitHub[(GitHub API)]\\n EL -->|API Calls| ElevenLabsAPI[(ElevenLabs API)]\\n \\n classDef core fill:#f9a,stroke:#d87,stroke-width:2px\\n classDef server fill:#adf,stroke:#7ad,stroke-width:1px\\n classDef storage fill:#ad8,stroke:#7a6,stroke-width:1px\\n classDef external fill:#ddd,stroke:#999,stroke-width:1px\\n \\n class MCP core\\n class FS,MEM,GH,ST,EL server\\n class File,PG,PGAI storage\\n class Client,LocalFiles,GitHub,ElevenLabsAPI external\\n```\\n\\n## Setting Up Your Environment\\n\\n### 1. Base Docker Compose Configuration\\n\\nCreate a base Docker Compose file (`docker-compose.base.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n mcp-prompts:\\n image: {{registry}}/mcp-prompts:latest\\n container_name: mcp-prompts\\n environment:\\n - NODE_ENV=production\\n - PORT=3000\\n - HOST=0.0.0.0\\n - STORAGE_TYPE=file\\n - PROMPTS_DIR=/app/data/prompts\\n - BACKUPS_DIR=/app/data/backups\\n - LOG_LEVEL=info\\n volumes:\\n - mcp-data:/app/data\\n ports:\\n - \\\\\\\"3000:3000\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD\\\\\\\", \\\\\\\"node\\\\\\\", \\\\\\\"-e\\\\\\\", \\\\\\\"require('http').request({hostname: 'localhost', port: 3000, path: '/health', timeout: 2000}, (res) => process.exit(res.statusCode !== 200)).end()\\\\\\\"]\\n interval: 30s\\n timeout: 10s\\n retries: 3\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nnetworks:\\n mcp-network:\\n driver: bridge\\n\\nvolumes:\\n mcp-data:\\n name: mcp-data\\n```\\n\\n### 2. Resource Servers Configuration\\n\\nCreate an integration configuration file (`docker-compose.integration.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service with integration configuration\\n mcp-prompts:\\n environment:\\n - MCP_INTEGRATION=true\\n - MCP_MEMORY_URL=http://mcp-memory:3000\\n - MCP_FILESYSTEM_URL=http://mcp-filesystem:3000\\n - MCP_GITHUB_URL=http://mcp-github:3000\\n - MCP_THINKING_URL=http://mcp-sequential-thinking:3000\\n - MCP_ELEVENLABS_URL=http://mcp-elevenlabs:3000\\n depends_on:\\n - mcp-memory\\n - mcp-filesystem\\n - mcp-github\\n - mcp-sequential-thinking\\n - mcp-elevenlabs\\n\\n # MCP Memory Server\\n mcp-memory:\\n image: node:20-alpine\\n container_name: mcp-memory\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-memory && npx -y @modelcontextprotocol/server-memory\\\\\\\"\\n ports:\\n - \\\\\\\"3020:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP Filesystem Server\\n mcp-filesystem:\\n image: node:20-alpine\\n container_name: mcp-filesystem\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-filesystem && npx -y @modelcontextprotocol/server-filesystem /data\\\\\\\"\\n volumes:\\n - mcp-filesystem-data:/data\\n ports:\\n - \\\\\\\"3021:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP GitHub Server\\n mcp-github:\\n image: node:20-alpine\\n container_name: mcp-github\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-github && npx -y @modelcontextprotocol/server-github\\\\\\\"\\n environment:\\n - GITHUB_PERSONAL_ACCESS_TOKEN={{github_token}}\\n ports:\\n - \\\\\\\"3022:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP Sequential Thinking Server\\n mcp-sequential-thinking:\\n image: node:20-alpine\\n container_name: mcp-sequential-thinking\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-sequential-thinking && npx -y @modelcontextprotocol/server-sequential-thinking\\\\\\\"\\n ports:\\n - \\\\\\\"3023:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP ElevenLabs Server\\n mcp-elevenlabs:\\n image: node:20-alpine\\n container_name: mcp-elevenlabs\\n command: sh -c \\\\\\\"npm install -g elevenlabs-mcp-server && npx -y elevenlabs-mcp-server\\\\\\\"\\n environment:\\n - ELEVENLABS_API_KEY={{elevenlabs_api_key}}\\n - ELEVENLABS_VOICE_ID={{elevenlabs_voice_id}}\\n - ELEVENLABS_MODEL_ID={{elevenlabs_model_id}}\\n - ELEVENLABS_OUTPUT_DIR=/data/audio\\n volumes:\\n - mcp-elevenlabs-data:/data\\n ports:\\n - \\\\\\\"3024:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-filesystem-data:\\n name: mcp-filesystem-data\\n mcp-elevenlabs-data:\\n name: mcp-elevenlabs-data\\n```\\n\\n### 3. Storage Options\\n\\n#### File Storage (Default)\\nUses the default file storage mounted as a Docker volume.\\n\\n#### PostgreSQL Storage\\nCreate a PostgreSQL configuration file (`docker-compose.postgres.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service to use PostgreSQL\\n mcp-prompts:\\n environment:\\n - STORAGE_TYPE=postgres\\n - POSTGRES_HOST=postgres\\n - POSTGRES_PORT=5432\\n - POSTGRES_USER={{postgres_user}}\\n - POSTGRES_PASSWORD={{postgres_password}}\\n - POSTGRES_DATABASE={{postgres_database}}\\n depends_on:\\n postgres:\\n condition: service_healthy\\n\\n # PostgreSQL Database\\n postgres:\\n image: postgres:14-alpine\\n container_name: mcp-prompts-postgres\\n environment:\\n - POSTGRES_USER={{postgres_user}}\\n - POSTGRES_PASSWORD={{postgres_password}}\\n - POSTGRES_DB={{postgres_database}}\\n volumes:\\n - mcp-prompts-postgres-data:/var/lib/postgresql/data\\n - ./postgres/init:/docker-entrypoint-initdb.d\\n ports:\\n - \\\\\\\"5432:5432\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD-SHELL\\\\\\\", \\\\\\\"pg_isready -U {{postgres_user}}\\\\\\\"]\\n interval: 10s\\n timeout: 5s\\n retries: 5\\n start_period: 10s\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # Adminer for database management\\n adminer:\\n image: adminer:latest\\n container_name: mcp-prompts-adminer\\n ports:\\n - \\\\\\\"8080:8080\\\\\\\"\\n depends_on:\\n - postgres\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-prompts-postgres-data:\\n name: mcp-prompts-postgres-data\\n```\\n\\n#### PGAI/TimescaleDB (Vector Storage)\\nCreate a PGAI configuration file (`docker-compose.pgai.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service to use PGAI\\n mcp-prompts:\\n environment:\\n - STORAGE_TYPE=pgai\\n - PGAI_HOST=pgai\\n - PGAI_PORT=5432\\n - PGAI_USER=postgres\\n - PGAI_PASSWORD=postgres\\n - PGAI_DATABASE=mcp_prompts\\n - PGAI_API_KEY={{pgai_api_key}}\\n - PGAI_COLLECTION=mcp_prompts\\n depends_on:\\n pgai:\\n condition: service_healthy\\n\\n # TimescaleDB with PGAI extension\\n pgai:\\n image: timescale/timescaledb-pgai:pg15\\n container_name: mcp-prompts-pgai\\n environment:\\n - POSTGRES_USER=postgres\\n - POSTGRES_PASSWORD=postgres\\n - POSTGRES_DB=mcp_prompts\\n volumes:\\n - mcp-prompts-pgai-data:/var/lib/postgresql/data\\n - ./postgres/pgai-init:/docker-entrypoint-initdb.d\\n ports:\\n - \\\\\\\"5433:5432\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD-SHELL\\\\\\\", \\\\\\\"pg_isready -U postgres\\\\\\\"]\\n interval: 10s\\n timeout: 5s\\n retries: 5\\n start_period: 30s\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # Adminer for PGAI database management\\n pgai-adminer:\\n image: adminer:latest\\n container_name: mcp-prompts-pgai-adminer\\n ports:\\n - \\\\\\\"8081:8080\\\\\\\"\\n environment:\\n - ADMINER_DEFAULT_SERVER=pgai\\n depends_on:\\n - pgai\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-prompts-pgai-data:\\n name: mcp-prompts-pgai-data\\n```\\n\\n## Deployment and Management\\n\\n### Docker Compose Manager Script\\n\\nCreate a management script (`docker-compose-manager.sh`) for easier orchestration:\\n\\n```bash\\n#!/bin/bash\\n\\n# Colors for output\\nGREEN=\\\\\\\"\\\\\\\\033[0;32m\\\\\\\"\\nYELLOW=\\\\\\\"\\\\\\\\033[1;33m\\\\\\\"\\nBLUE=\\\\\\\"\\\\\\\\033[0;34m\\\\\\\"\\nRED=\\\\\\\"\\\\\\\\033[0;31m\\\\\\\"\\nNC=\\\\\\\"\\\\\\\\033[0m\\\\\\\" # No Color\\n\\n# Base directory for Docker Compose files\\nCOMPOSE_DIR=\\\\\\\"docker/compose\\\\\\\"\\nBASE_COMPOSE=\\\\\\\"$COMPOSE_DIR/docker-compose.base.yml\\\\\\\"\\n\\n# Display help message\\nfunction show_help {\\n echo -e \\\\\\\"${BLUE}MCP Prompts Docker Compose Manager${NC}\\\\\\\"\\n echo -e \\\\\\\"${YELLOW}Usage:${NC} $0 [command] [environment] [options]\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Commands:${NC}\\\\\\\"\\n echo -e \\\\\\\" up Start services\\\\\\\"\\n echo -e \\\\\\\" down Stop services and remove containers\\\\\\\"\\n echo -e \\\\\\\" ps List running services\\\\\\\"\\n echo -e \\\\\\\" logs View logs\\\\\\\"\\n echo -e \\\\\\\" restart Restart services\\\\\\\"\\n echo -e \\\\\\\" image Build Docker images\\\\\\\"\\n echo -e \\\\\\\" publish Build and publish Docker images\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Environments:${NC}\\\\\\\"\\n echo -e \\\\\\\" base Base MCP Prompts service\\\\\\\"\\n echo -e \\\\\\\" development Development environment with hot-reloading\\\\\\\"\\n echo -e \\\\\\\" postgres PostgreSQL storage\\\\\\\"\\n echo -e \\\\\\\" pgai PGAI TimescaleDB storage\\\\\\\"\\n echo -e \\\\\\\" test Testing environment\\\\\\\"\\n echo -e \\\\\\\" integration Multiple MCP servers integration\\\\\\\"\\n echo -e \\\\\\\" sse Server-Sent Events transport\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Options:${NC}\\\\\\\"\\n echo -e \\\\\\\" -d, --detach Run in detached mode\\\\\\\"\\n echo -e \\\\\\\" -t, --tag TAG Specify tag for Docker images\\\\\\\"\\n echo -e \\\\\\\" -h, --help Show this help message\\\\\\\"\\n}\\n\\n# Default values\\nDETACHED=\\\\\\\"\\\\\\\"\\nTAG=\\\\\\\"latest\\\\\\\"\\n\\n# Parse options\\nwhile [[ $# -gt 0 ]]; do\\n case $1 in\\n -h|--help)\\n show_help\\n exit 0\\n ;;\\n -d|--detach)\\n DETACHED=\\\\\\\"-d\\\\\\\"\\n shift\\n ;;\\n -t|--tag)\\n TAG=\\\\\\\"$2\\\\\\\"\\n shift 2\\n ;;\\n *)\\n break\\n ;;\\n esac\\ndone\\n\\n# Check if at least command and environment are provided\\nif [ $# -lt 2 ]; then\\n show_help\\n exit 1\\nfi\\n\\nCOMMAND=$1\\nENV=$2\\n\\n# Validate environment\\nCOMPOSE_FILE=\\\\\\\"\\\\\\\"\\ncase $ENV in\\n base)\\n COMPOSE_FILE=\\\\\\\"$BASE_COMPOSE\\\\\\\"\\n ;;\\n development)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.development.yml\\\\\\\"\\n ;;\\n postgres)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.postgres.yml\\\\\\\"\\n ;;\\n pgai)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.pgai.yml\\\\\\\"\\n ;;\\n test)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.test.yml\\\\\\\"\\n ;;\\n integration)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.integration.yml\\\\\\\"\\n ;;\\n sse)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.sse.yml\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Invalid environment: $ENV${NC}\\\\\\\"\\n show_help\\n exit 1\\n ;;\\nesac\\n\\n# Execute the appropriate command\\ncase $COMMAND in\\n up)\\n echo -e \\\\\\\"${GREEN}Starting MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE up $DETACHED\\n ;;\\n down)\\n echo -e \\\\\\\"${GREEN}Stopping MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE down\\n ;;\\n ps)\\n echo -e \\\\\\\"${GREEN}Listing MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE ps\\n ;;\\n logs)\\n echo -e \\\\\\\"${GREEN}Showing logs for MCP Prompts services in environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE logs -f\\n ;;\\n restart)\\n echo -e \\\\\\\"${GREEN}Restarting MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE restart\\n ;;\\n image)\\n echo -e \\\\\\\"${GREEN}Building Docker image for environment: $ENV with tag: $TAG${NC}\\\\\\\"\\n case $ENV in\\n base|production)\\n docker build -t {{registry}}/mcp-prompts:$TAG -f docker/Dockerfile.prod .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG${NC}\\\\\\\"\\n ;;\\n development)\\n docker build -t {{registry}}/mcp-prompts:$TAG-dev -f docker/Dockerfile.development .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG-dev${NC}\\\\\\\"\\n ;;\\n test)\\n docker build -t {{registry}}/mcp-prompts:$TAG-test -f docker/Dockerfile.testing .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG-test${NC}\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Image building not supported for environment: $ENV${NC}\\\\\\\"\\n exit 1\\n ;;\\n esac\\n ;;\\n publish)\\n echo -e \\\\\\\"${GREEN}Building and publishing Docker images with tag: $TAG${NC}\\\\\\\"\\n \\n # Build images\\n docker build -t {{registry}}/mcp-prompts:$TAG -f docker/Dockerfile.prod .\\n docker build -t {{registry}}/mcp-prompts:$TAG-dev -f docker/Dockerfile.development .\\n docker build -t {{registry}}/mcp-prompts:$TAG-test -f docker/Dockerfile.testing .\\n \\n # Push images\\n echo -e \\\\\\\"${GREEN}Publishing images to Docker registry${NC}\\\\\\\"\\n docker push {{registry}}/mcp-prompts:$TAG\\n docker push {{registry}}/mcp-prompts:$TAG-dev\\n docker push {{registry}}/mcp-prompts:$TAG-test\\n \\n echo -e \\\\\\\"${GREEN}Published images:${NC}\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG-dev\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG-test\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Invalid command: $COMMAND${NC}\\\\\\\"\\n show_help\\n exit 1\\n ;;\\nesac\\n```\\n\\nMake the script executable:\\n\\n```bash\\nchmod +x docker-compose-manager.sh\\n```\\n\\n## Launching the Environment\\n\\n### 1. Start the Base Environment\\n\\n```bash\\n./docker-compose-manager.sh up base -d\\n```\\n\\n### 2. Start with MCP Integration\\n\\n```bash\\n./docker-compose-manager.sh up integration -d\\n```\\n\\n### 3. Start with PostgreSQL Storage\\n\\n```bash\\n./docker-compose-manager.sh up postgres -d\\n```\\n\\n### 4. Start with PGAI Vector Storage\\n\\n```bash\\n./docker-compose-manager.sh up pgai -d\\n```\\n\\n## Environment Configuration\\n\\n### Core Services Configuration\\n\\n1. **MCP Prompts Server Configuration**\\n ```\\n # Server Configuration\\n PORT=3000\\n HOST=0.0.0.0\\n NODE_ENV=production\\n LOG_LEVEL=info\\n \\n # Storage Configuration\\n STORAGE_TYPE=file # Options: file, postgres, pgai\\n PROMPTS_DIR=/app/data/prompts\\n BACKUPS_DIR=/app/data/backups\\n \\n # Integration Configuration\\n MCP_INTEGRATION=true\\n MCP_MEMORY_URL=http://mcp-memory:3000\\n MCP_FILESYSTEM_URL=http://mcp-filesystem:3000\\n MCP_GITHUB_URL=http://mcp-github:3000\\n MCP_THINKING_URL=http://mcp-sequential-thinking:3000\\n MCP_ELEVENLABS_URL=http://mcp-elevenlabs:3000\\n ```\\n\\n2. **GitHub Integration**\\n ```\\n # GitHub API Configuration\\n GITHUB_PERSONAL_ACCESS_TOKEN=your_token_here\\n ```\\n\\n3. **ElevenLabs Integration**\\n ```\\n # ElevenLabs API Configuration\\n ELEVENLABS_API_KEY=your_api_key_here\\n ELEVENLABS_VOICE_ID=your_voice_id\\n ELEVENLABS_MODEL_ID=eleven_monolingual_v1\\n ELEVENLABS_OUTPUT_DIR=/data/audio\\n ```\\n\\n### PostgreSQL Configuration\\n\\n```\\n# PostgreSQL Configuration\\nPOSTGRES_USER=postgres\\nPOSTGRES_PASSWORD=secure_password_here\\nPOSTGRES_DATABASE=mcp_prompts\\n```\\n\\n### PGAI/TimescaleDB Configuration\\n\\n```\\n# PGAI Configuration\\nPGAI_HOST=pgai\\nPGAI_PORT=5432\\nPGAI_USER=postgres\\nPGAI_PASSWORD=postgres\\nPGAI_DATABASE=mcp_prompts\\nPGAI_API_KEY=your_pgai_key_here\\nPGAI_COLLECTION=mcp_prompts\\n```\\n\\n## Integration Verification\\n\\n### 1. Health Check\\n\\nCheck if all services are running:\\n\\n```bash\\n./docker-compose-manager.sh ps integration\\n```\\n\\n### 2. Test MCP Prompts Server\\n\\n```bash\\ncurl http://localhost:3000/health\\n```\\n\\n### 3. Test Resource Servers\\n\\n```bash\\n# Test Memory Server\\ncurl http://localhost:3020/health\\n\\n# Test Filesystem Server\\ncurl http://localhost:3021/health\\n\\n# Test GitHub Server\\ncurl http://localhost:3022/health\\n\\n# Test Sequential Thinking Server\\ncurl http://localhost:3023/health\\n\\n# Test ElevenLabs Server\\ncurl http://localhost:3024/health\\n```\\n\\n## Troubleshooting Common Issues\\n\\n### Container Startup Issues\\n\\n1. **Container fails to start**\\n - Check logs: `./docker-compose-manager.sh logs integration`\\n - Verify environment variables are correctly set\\n - Ensure ports are not already in use\\n\\n2. **Network connectivity issues**\\n - Verify all containers are on the same network\\n - Check Docker network configuration: `docker network inspect mcp-network`\\n\\n3. **Storage issues**\\n - Ensure volume permissions are correctly set\\n - Verify database initialization scripts are valid\\n\\n## Resource Management\\n\\n### Clean Up Unused Resources\\n\\n```bash\\n# Remove stopped containers\\ndocker container prune\\n\\n# Remove unused volumes\\ndocker volume prune\\n\\n# Remove unused networks\\ndocker network prune\\n\\n# Remove dangling images\\ndocker image prune\\n```\\n\\n### Data Persistence\\n\\nDocker volumes ensure your data persists across container restarts:\\n\\n```\\nvolumes:\\n mcp-data: # MCP Prompts data\\n mcp-filesystem-data: # Filesystem server data\\n mcp-elevenlabs-data: # Audio output data\\n mcp-prompts-postgres-data: # PostgreSQL data\\n mcp-prompts-pgai-data: # PGAI/TimescaleDB data\\n```\\n\\n## Best Practices for Production\\n\\n1. **Security Considerations**\\n - Use environment files for secrets\\n - Configure proper network isolation\\n - Set up user permissions for service accounts\\n - Enable HTTPS with proper certificates\\n\\n2. **High Availability**\\n - Implement container restart policies\\n - Consider Docker Swarm or Kubernetes for clustering\\n - Set up monitoring and alerting\\n - Establish backup and recovery procedures\\n\\n3. **Performance Optimization**\\n - Tune PostgreSQL/PGAI for your workload\\n - Configure appropriate resource limits\\n - Implement caching strategies\\n - Monitor resource usage\\n\\n## Advanced Customization\\n\\n### Adding Custom MCP Servers\\n\\n1. Create a Dockerfile for your custom server\\n2. Add the service to your Docker Compose file\\n3. Configure environment variables for integration\\n4. Update the MCP Prompts server configuration\\n\\n### Extending with Additional Services\\n\\n```yaml\\nservices:\\n # Your custom MCP server\\n mcp-custom:\\n image: node:20-alpine\\n container_name: mcp-custom\\n command: sh -c \\\\\\\"npm install -g your-custom-mcp-server && npx -y your-custom-mcp-server\\\\\\\"\\n environment:\\n - CUSTOM_API_KEY={{custom_api_key}}\\n ports:\\n - \\\\\\\"3025:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n```\\n\\n## Next Steps\\n\\n1. Explore integration with AI clients like Claude Desktop, Zed, and LibreChat\\n2. Implement monitoring and logging solutions\\n3. Set up CI/CD pipelines for deployment\\n4. Explore advanced use cases for your specific domain\\n\\n## Additional Resources\\n\\n- [MCP Protocol Documentation](https://modelcontextprotocol.io/)\\n- [Docker Documentation](https://docs.docker.com/)\\n- [MCP Servers Repository](https://github.com/modelcontextprotocol/servers)\\n- {{additional_resources}}\\n\\nWhat specific aspect of this Docker-based MCP integration would you like me to elaborate on further?\\\",\\n \\\"isTemplate\\\": true,\\n \\\"variables\\\": [\\n \\\"use_case\\\",\\n \\\"additional_prerequisites\\\",\\n \\\"additional_servers\\\",\\n \\\"registry\\\",\\n \\\"github_token\\\",\\n \\\"elevenlabs_api_key\\\",\\n \\\"elevenlabs_voice_id\\\",\\n \\\"elevenlabs_model_id\\\",\\n \\\"postgres_user\\\",\\n \\\"postgres_password\\\",\\n \\\"postgres_database\\\",\\n \\\"pgai_api_key\\\",\\n \\\"custom_api_key\\\",\\n \\\"additional_resources\\\"\\n ],\\n \\\"tags\\\": [\\n \\\"docker\\\",\\n \\\"mcp-integration\\\",\\n \\\"multi-server\\\",\\n \\\"orchestration\\\",\\n \\\"containerization\\\",\\n \\\"devops\\\",\\n \\\"tutorial\\\"\\n ],\\n \\\"createdAt\\\": \\\"2025-03-15T21:00:00.000Z\\\",\\n \\\"updatedAt\\\": \\\"2025-03-15T21:00:00.000Z\\\",\\n \\\"version\\\": 1,\\n \\\"metadata\\\": {\\n \\\"recommended_servers\\\": [\\n \\\"@modelcontextprotocol/server-filesystem\\\",\\n \\\"@modelcontextprotocol/server-memory\\\",\\n \\\"@modelcontextprotocol/server-github\\\",\\n \\\"@modelcontextprotocol/server-sequential-thinking\\\",\\n \\\"elevenlabs-mcp-server\\\"\\n ],\\n \\\"example_values\\\": {\\n \\\"use_case\\\": \\\"AI-powered code analysis and documentation\\\",\\n \\\"additional_prerequisites\\\": \\\"Node.js 18+ for local development\\\",\\n \\\"registry\\\": \\\"sparesparrow\\\",\\n \\\"postgres_user\\\": \\\"postgres\\\",\\n \\\"postgres_password\\\": \\\"secure_password_here\\\",\\n \\\"postgres_database\\\": \\\"mcp_prompts",
7 | "variables": {},
8 | "metadata": {
9 | "source": "/home/sparrow/projects/mcp-prompts/prompts/docker-mcp-servers-orchestration.json",
10 | "imported": true
11 | }
12 | }
```
--------------------------------------------------------------------------------
/src/mcp_project_orchestrator/prompts/other/Docker_MCP_Servers_Orchestration_Guide.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "name": "Docker MCP Servers Orchestration Guide",
3 | "description": "A comprehensive guide for setting up, configuring, and orchestrating multiple MCP servers in a Docker environment",
4 | "type": "prompt",
5 | "category": "other",
6 | "content": "# Docker MCP Servers Orchestration Guide\\n\\n## Overview\\n\\nThis guide will help you set up a containerized environment with multiple integrated MCP servers for {{use_case}}. The architecture leverages Docker Compose to orchestrate these servers, providing a robust foundation for AI-powered applications with enhanced context capabilities.\\n\\n## Prerequisites\\n\\n- Docker and Docker Compose installed\\n- Basic understanding of containerization concepts\\n- Git for cloning repositories\\n- {{additional_prerequisites}}\\n\\n## Core MCP Servers Architecture\\n\\n```mermaid\\ngraph TD\\n subgraph \\\\\\\"Docker Compose Network\\\\\\\"\\n subgraph \\\\\\\"Core Service\\\\\\\"\\n MCP[MCP Prompts Server]\\n end\\n \\n subgraph \\\\\\\"MCP Resource Servers\\\\\\\"\\n FS[Filesystem Server]\\n MEM[Memory Server]\\n GH[GitHub Server]\\n ST[Sequential Thinking]\\n EL[ElevenLabs Server]\\n {{additional_servers}}\\n end\\n \\n subgraph \\\\\\\"Storage Options\\\\\\\"\\n File[(File Storage)]\\n PG[(PostgreSQL)]\\n PGAI[(PGAI/TimescaleDB)]\\n end\\n end\\n \\n Client[AI Client] -->|Requests| MCP\\n MCP -->|Resource URI Requests| FS\\n MCP -->|Resource URI Requests| MEM\\n MCP -->|Resource URI Requests| GH\\n MCP -->|Resource URI Requests| ST\\n MCP -->|Resource URI Requests| EL\\n \\n MCP -->|Storage| File\\n MCP -->|Storage| PG\\n MCP -->|Storage| PGAI\\n \\n FS -->|Access| LocalFiles[(Local Files)]\\n GH -->|API Calls| GitHub[(GitHub API)]\\n EL -->|API Calls| ElevenLabsAPI[(ElevenLabs API)]\\n \\n classDef core fill:#f9a,stroke:#d87,stroke-width:2px\\n classDef server fill:#adf,stroke:#7ad,stroke-width:1px\\n classDef storage fill:#ad8,stroke:#7a6,stroke-width:1px\\n classDef external fill:#ddd,stroke:#999,stroke-width:1px\\n \\n class MCP core\\n class FS,MEM,GH,ST,EL server\\n class File,PG,PGAI storage\\n class Client,LocalFiles,GitHub,ElevenLabsAPI external\\n```\\n\\n## Setting Up Your Environment\\n\\n### 1. Base Docker Compose Configuration\\n\\nCreate a base Docker Compose file (`docker-compose.base.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n mcp-prompts:\\n image: {{registry}}/mcp-prompts:latest\\n container_name: mcp-prompts\\n environment:\\n - NODE_ENV=production\\n - PORT=3000\\n - HOST=0.0.0.0\\n - STORAGE_TYPE=file\\n - PROMPTS_DIR=/app/data/prompts\\n - BACKUPS_DIR=/app/data/backups\\n - LOG_LEVEL=info\\n volumes:\\n - mcp-data:/app/data\\n ports:\\n - \\\\\\\"3000:3000\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD\\\\\\\", \\\\\\\"node\\\\\\\", \\\\\\\"-e\\\\\\\", \\\\\\\"require('http').request({hostname: 'localhost', port: 3000, path: '/health', timeout: 2000}, (res) => process.exit(res.statusCode !== 200)).end()\\\\\\\"]\\n interval: 30s\\n timeout: 10s\\n retries: 3\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nnetworks:\\n mcp-network:\\n driver: bridge\\n\\nvolumes:\\n mcp-data:\\n name: mcp-data\\n```\\n\\n### 2. Resource Servers Configuration\\n\\nCreate an integration configuration file (`docker-compose.integration.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service with integration configuration\\n mcp-prompts:\\n environment:\\n - MCP_INTEGRATION=true\\n - MCP_MEMORY_URL=http://mcp-memory:3000\\n - MCP_FILESYSTEM_URL=http://mcp-filesystem:3000\\n - MCP_GITHUB_URL=http://mcp-github:3000\\n - MCP_THINKING_URL=http://mcp-sequential-thinking:3000\\n - MCP_ELEVENLABS_URL=http://mcp-elevenlabs:3000\\n depends_on:\\n - mcp-memory\\n - mcp-filesystem\\n - mcp-github\\n - mcp-sequential-thinking\\n - mcp-elevenlabs\\n\\n # MCP Memory Server\\n mcp-memory:\\n image: node:20-alpine\\n container_name: mcp-memory\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-memory && npx -y @modelcontextprotocol/server-memory\\\\\\\"\\n ports:\\n - \\\\\\\"3020:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP Filesystem Server\\n mcp-filesystem:\\n image: node:20-alpine\\n container_name: mcp-filesystem\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-filesystem && npx -y @modelcontextprotocol/server-filesystem /data\\\\\\\"\\n volumes:\\n - mcp-filesystem-data:/data\\n ports:\\n - \\\\\\\"3021:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP GitHub Server\\n mcp-github:\\n image: node:20-alpine\\n container_name: mcp-github\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-github && npx -y @modelcontextprotocol/server-github\\\\\\\"\\n environment:\\n - GITHUB_PERSONAL_ACCESS_TOKEN={{github_token}}\\n ports:\\n - \\\\\\\"3022:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP Sequential Thinking Server\\n mcp-sequential-thinking:\\n image: node:20-alpine\\n container_name: mcp-sequential-thinking\\n command: sh -c \\\\\\\"npm install -g @modelcontextprotocol/server-sequential-thinking && npx -y @modelcontextprotocol/server-sequential-thinking\\\\\\\"\\n ports:\\n - \\\\\\\"3023:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # MCP ElevenLabs Server\\n mcp-elevenlabs:\\n image: node:20-alpine\\n container_name: mcp-elevenlabs\\n command: sh -c \\\\\\\"npm install -g elevenlabs-mcp-server && npx -y elevenlabs-mcp-server\\\\\\\"\\n environment:\\n - ELEVENLABS_API_KEY={{elevenlabs_api_key}}\\n - ELEVENLABS_VOICE_ID={{elevenlabs_voice_id}}\\n - ELEVENLABS_MODEL_ID={{elevenlabs_model_id}}\\n - ELEVENLABS_OUTPUT_DIR=/data/audio\\n volumes:\\n - mcp-elevenlabs-data:/data\\n ports:\\n - \\\\\\\"3024:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-filesystem-data:\\n name: mcp-filesystem-data\\n mcp-elevenlabs-data:\\n name: mcp-elevenlabs-data\\n```\\n\\n### 3. Storage Options\\n\\n#### File Storage (Default)\\nUses the default file storage mounted as a Docker volume.\\n\\n#### PostgreSQL Storage\\nCreate a PostgreSQL configuration file (`docker-compose.postgres.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service to use PostgreSQL\\n mcp-prompts:\\n environment:\\n - STORAGE_TYPE=postgres\\n - POSTGRES_HOST=postgres\\n - POSTGRES_PORT=5432\\n - POSTGRES_USER={{postgres_user}}\\n - POSTGRES_PASSWORD={{postgres_password}}\\n - POSTGRES_DATABASE={{postgres_database}}\\n depends_on:\\n postgres:\\n condition: service_healthy\\n\\n # PostgreSQL Database\\n postgres:\\n image: postgres:14-alpine\\n container_name: mcp-prompts-postgres\\n environment:\\n - POSTGRES_USER={{postgres_user}}\\n - POSTGRES_PASSWORD={{postgres_password}}\\n - POSTGRES_DB={{postgres_database}}\\n volumes:\\n - mcp-prompts-postgres-data:/var/lib/postgresql/data\\n - ./postgres/init:/docker-entrypoint-initdb.d\\n ports:\\n - \\\\\\\"5432:5432\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD-SHELL\\\\\\\", \\\\\\\"pg_isready -U {{postgres_user}}\\\\\\\"]\\n interval: 10s\\n timeout: 5s\\n retries: 5\\n start_period: 10s\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # Adminer for database management\\n adminer:\\n image: adminer:latest\\n container_name: mcp-prompts-adminer\\n ports:\\n - \\\\\\\"8080:8080\\\\\\\"\\n depends_on:\\n - postgres\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-prompts-postgres-data:\\n name: mcp-prompts-postgres-data\\n```\\n\\n#### PGAI/TimescaleDB (Vector Storage)\\nCreate a PGAI configuration file (`docker-compose.pgai.yml`):\\n\\n```yaml\\nversion: '3'\\n\\nservices:\\n # Override the base service to use PGAI\\n mcp-prompts:\\n environment:\\n - STORAGE_TYPE=pgai\\n - PGAI_HOST=pgai\\n - PGAI_PORT=5432\\n - PGAI_USER=postgres\\n - PGAI_PASSWORD=postgres\\n - PGAI_DATABASE=mcp_prompts\\n - PGAI_API_KEY={{pgai_api_key}}\\n - PGAI_COLLECTION=mcp_prompts\\n depends_on:\\n pgai:\\n condition: service_healthy\\n\\n # TimescaleDB with PGAI extension\\n pgai:\\n image: timescale/timescaledb-pgai:pg15\\n container_name: mcp-prompts-pgai\\n environment:\\n - POSTGRES_USER=postgres\\n - POSTGRES_PASSWORD=postgres\\n - POSTGRES_DB=mcp_prompts\\n volumes:\\n - mcp-prompts-pgai-data:/var/lib/postgresql/data\\n - ./postgres/pgai-init:/docker-entrypoint-initdb.d\\n ports:\\n - \\\\\\\"5433:5432\\\\\\\"\\n healthcheck:\\n test: [\\\\\\\"CMD-SHELL\\\\\\\", \\\\\\\"pg_isready -U postgres\\\\\\\"]\\n interval: 10s\\n timeout: 5s\\n retries: 5\\n start_period: 30s\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\n # Adminer for PGAI database management\\n pgai-adminer:\\n image: adminer:latest\\n container_name: mcp-prompts-pgai-adminer\\n ports:\\n - \\\\\\\"8081:8080\\\\\\\"\\n environment:\\n - ADMINER_DEFAULT_SERVER=pgai\\n depends_on:\\n - pgai\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n\\nvolumes:\\n mcp-prompts-pgai-data:\\n name: mcp-prompts-pgai-data\\n```\\n\\n## Deployment and Management\\n\\n### Docker Compose Manager Script\\n\\nCreate a management script (`docker-compose-manager.sh`) for easier orchestration:\\n\\n```bash\\n#!/bin/bash\\n\\n# Colors for output\\nGREEN=\\\\\\\"\\\\\\\\033[0;32m\\\\\\\"\\nYELLOW=\\\\\\\"\\\\\\\\033[1;33m\\\\\\\"\\nBLUE=\\\\\\\"\\\\\\\\033[0;34m\\\\\\\"\\nRED=\\\\\\\"\\\\\\\\033[0;31m\\\\\\\"\\nNC=\\\\\\\"\\\\\\\\033[0m\\\\\\\" # No Color\\n\\n# Base directory for Docker Compose files\\nCOMPOSE_DIR=\\\\\\\"docker/compose\\\\\\\"\\nBASE_COMPOSE=\\\\\\\"$COMPOSE_DIR/docker-compose.base.yml\\\\\\\"\\n\\n# Display help message\\nfunction show_help {\\n echo -e \\\\\\\"${BLUE}MCP Prompts Docker Compose Manager${NC}\\\\\\\"\\n echo -e \\\\\\\"${YELLOW}Usage:${NC} $0 [command] [environment] [options]\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Commands:${NC}\\\\\\\"\\n echo -e \\\\\\\" up Start services\\\\\\\"\\n echo -e \\\\\\\" down Stop services and remove containers\\\\\\\"\\n echo -e \\\\\\\" ps List running services\\\\\\\"\\n echo -e \\\\\\\" logs View logs\\\\\\\"\\n echo -e \\\\\\\" restart Restart services\\\\\\\"\\n echo -e \\\\\\\" image Build Docker images\\\\\\\"\\n echo -e \\\\\\\" publish Build and publish Docker images\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Environments:${NC}\\\\\\\"\\n echo -e \\\\\\\" base Base MCP Prompts service\\\\\\\"\\n echo -e \\\\\\\" development Development environment with hot-reloading\\\\\\\"\\n echo -e \\\\\\\" postgres PostgreSQL storage\\\\\\\"\\n echo -e \\\\\\\" pgai PGAI TimescaleDB storage\\\\\\\"\\n echo -e \\\\\\\" test Testing environment\\\\\\\"\\n echo -e \\\\\\\" integration Multiple MCP servers integration\\\\\\\"\\n echo -e \\\\\\\" sse Server-Sent Events transport\\\\\\\"\\n echo\\n echo -e \\\\\\\"${YELLOW}Options:${NC}\\\\\\\"\\n echo -e \\\\\\\" -d, --detach Run in detached mode\\\\\\\"\\n echo -e \\\\\\\" -t, --tag TAG Specify tag for Docker images\\\\\\\"\\n echo -e \\\\\\\" -h, --help Show this help message\\\\\\\"\\n}\\n\\n# Default values\\nDETACHED=\\\\\\\"\\\\\\\"\\nTAG=\\\\\\\"latest\\\\\\\"\\n\\n# Parse options\\nwhile [[ $# -gt 0 ]]; do\\n case $1 in\\n -h|--help)\\n show_help\\n exit 0\\n ;;\\n -d|--detach)\\n DETACHED=\\\\\\\"-d\\\\\\\"\\n shift\\n ;;\\n -t|--tag)\\n TAG=\\\\\\\"$2\\\\\\\"\\n shift 2\\n ;;\\n *)\\n break\\n ;;\\n esac\\ndone\\n\\n# Check if at least command and environment are provided\\nif [ $# -lt 2 ]; then\\n show_help\\n exit 1\\nfi\\n\\nCOMMAND=$1\\nENV=$2\\n\\n# Validate environment\\nCOMPOSE_FILE=\\\\\\\"\\\\\\\"\\ncase $ENV in\\n base)\\n COMPOSE_FILE=\\\\\\\"$BASE_COMPOSE\\\\\\\"\\n ;;\\n development)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.development.yml\\\\\\\"\\n ;;\\n postgres)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.postgres.yml\\\\\\\"\\n ;;\\n pgai)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.pgai.yml\\\\\\\"\\n ;;\\n test)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.test.yml\\\\\\\"\\n ;;\\n integration)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.integration.yml\\\\\\\"\\n ;;\\n sse)\\n COMPOSE_FILE=\\\\\\\"-f $BASE_COMPOSE -f $COMPOSE_DIR/docker-compose.sse.yml\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Invalid environment: $ENV${NC}\\\\\\\"\\n show_help\\n exit 1\\n ;;\\nesac\\n\\n# Execute the appropriate command\\ncase $COMMAND in\\n up)\\n echo -e \\\\\\\"${GREEN}Starting MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE up $DETACHED\\n ;;\\n down)\\n echo -e \\\\\\\"${GREEN}Stopping MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE down\\n ;;\\n ps)\\n echo -e \\\\\\\"${GREEN}Listing MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE ps\\n ;;\\n logs)\\n echo -e \\\\\\\"${GREEN}Showing logs for MCP Prompts services in environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE logs -f\\n ;;\\n restart)\\n echo -e \\\\\\\"${GREEN}Restarting MCP Prompts services for environment: $ENV${NC}\\\\\\\"\\n docker compose $COMPOSE_FILE restart\\n ;;\\n image)\\n echo -e \\\\\\\"${GREEN}Building Docker image for environment: $ENV with tag: $TAG${NC}\\\\\\\"\\n case $ENV in\\n base|production)\\n docker build -t {{registry}}/mcp-prompts:$TAG -f docker/Dockerfile.prod .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG${NC}\\\\\\\"\\n ;;\\n development)\\n docker build -t {{registry}}/mcp-prompts:$TAG-dev -f docker/Dockerfile.development .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG-dev${NC}\\\\\\\"\\n ;;\\n test)\\n docker build -t {{registry}}/mcp-prompts:$TAG-test -f docker/Dockerfile.testing .\\n echo -e \\\\\\\"${GREEN}Built: {{registry}}/mcp-prompts:$TAG-test${NC}\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Image building not supported for environment: $ENV${NC}\\\\\\\"\\n exit 1\\n ;;\\n esac\\n ;;\\n publish)\\n echo -e \\\\\\\"${GREEN}Building and publishing Docker images with tag: $TAG${NC}\\\\\\\"\\n \\n # Build images\\n docker build -t {{registry}}/mcp-prompts:$TAG -f docker/Dockerfile.prod .\\n docker build -t {{registry}}/mcp-prompts:$TAG-dev -f docker/Dockerfile.development .\\n docker build -t {{registry}}/mcp-prompts:$TAG-test -f docker/Dockerfile.testing .\\n \\n # Push images\\n echo -e \\\\\\\"${GREEN}Publishing images to Docker registry${NC}\\\\\\\"\\n docker push {{registry}}/mcp-prompts:$TAG\\n docker push {{registry}}/mcp-prompts:$TAG-dev\\n docker push {{registry}}/mcp-prompts:$TAG-test\\n \\n echo -e \\\\\\\"${GREEN}Published images:${NC}\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG-dev\\\\\\\"\\n echo -e \\\\\\\" {{registry}}/mcp-prompts:$TAG-test\\\\\\\"\\n ;;\\n *)\\n echo -e \\\\\\\"${RED}Invalid command: $COMMAND${NC}\\\\\\\"\\n show_help\\n exit 1\\n ;;\\nesac\\n```\\n\\nMake the script executable:\\n\\n```bash\\nchmod +x docker-compose-manager.sh\\n```\\n\\n## Launching the Environment\\n\\n### 1. Start the Base Environment\\n\\n```bash\\n./docker-compose-manager.sh up base -d\\n```\\n\\n### 2. Start with MCP Integration\\n\\n```bash\\n./docker-compose-manager.sh up integration -d\\n```\\n\\n### 3. Start with PostgreSQL Storage\\n\\n```bash\\n./docker-compose-manager.sh up postgres -d\\n```\\n\\n### 4. Start with PGAI Vector Storage\\n\\n```bash\\n./docker-compose-manager.sh up pgai -d\\n```\\n\\n## Environment Configuration\\n\\n### Core Services Configuration\\n\\n1. **MCP Prompts Server Configuration**\\n ```\\n # Server Configuration\\n PORT=3000\\n HOST=0.0.0.0\\n NODE_ENV=production\\n LOG_LEVEL=info\\n \\n # Storage Configuration\\n STORAGE_TYPE=file # Options: file, postgres, pgai\\n PROMPTS_DIR=/app/data/prompts\\n BACKUPS_DIR=/app/data/backups\\n \\n # Integration Configuration\\n MCP_INTEGRATION=true\\n MCP_MEMORY_URL=http://mcp-memory:3000\\n MCP_FILESYSTEM_URL=http://mcp-filesystem:3000\\n MCP_GITHUB_URL=http://mcp-github:3000\\n MCP_THINKING_URL=http://mcp-sequential-thinking:3000\\n MCP_ELEVENLABS_URL=http://mcp-elevenlabs:3000\\n ```\\n\\n2. **GitHub Integration**\\n ```\\n # GitHub API Configuration\\n GITHUB_PERSONAL_ACCESS_TOKEN=your_token_here\\n ```\\n\\n3. **ElevenLabs Integration**\\n ```\\n # ElevenLabs API Configuration\\n ELEVENLABS_API_KEY=your_api_key_here\\n ELEVENLABS_VOICE_ID=your_voice_id\\n ELEVENLABS_MODEL_ID=eleven_monolingual_v1\\n ELEVENLABS_OUTPUT_DIR=/data/audio\\n ```\\n\\n### PostgreSQL Configuration\\n\\n```\\n# PostgreSQL Configuration\\nPOSTGRES_USER=postgres\\nPOSTGRES_PASSWORD=secure_password_here\\nPOSTGRES_DATABASE=mcp_prompts\\n```\\n\\n### PGAI/TimescaleDB Configuration\\n\\n```\\n# PGAI Configuration\\nPGAI_HOST=pgai\\nPGAI_PORT=5432\\nPGAI_USER=postgres\\nPGAI_PASSWORD=postgres\\nPGAI_DATABASE=mcp_prompts\\nPGAI_API_KEY=your_pgai_key_here\\nPGAI_COLLECTION=mcp_prompts\\n```\\n\\n## Integration Verification\\n\\n### 1. Health Check\\n\\nCheck if all services are running:\\n\\n```bash\\n./docker-compose-manager.sh ps integration\\n```\\n\\n### 2. Test MCP Prompts Server\\n\\n```bash\\ncurl http://localhost:3000/health\\n```\\n\\n### 3. Test Resource Servers\\n\\n```bash\\n# Test Memory Server\\ncurl http://localhost:3020/health\\n\\n# Test Filesystem Server\\ncurl http://localhost:3021/health\\n\\n# Test GitHub Server\\ncurl http://localhost:3022/health\\n\\n# Test Sequential Thinking Server\\ncurl http://localhost:3023/health\\n\\n# Test ElevenLabs Server\\ncurl http://localhost:3024/health\\n```\\n\\n## Troubleshooting Common Issues\\n\\n### Container Startup Issues\\n\\n1. **Container fails to start**\\n - Check logs: `./docker-compose-manager.sh logs integration`\\n - Verify environment variables are correctly set\\n - Ensure ports are not already in use\\n\\n2. **Network connectivity issues**\\n - Verify all containers are on the same network\\n - Check Docker network configuration: `docker network inspect mcp-network`\\n\\n3. **Storage issues**\\n - Ensure volume permissions are correctly set\\n - Verify database initialization scripts are valid\\n\\n## Resource Management\\n\\n### Clean Up Unused Resources\\n\\n```bash\\n# Remove stopped containers\\ndocker container prune\\n\\n# Remove unused volumes\\ndocker volume prune\\n\\n# Remove unused networks\\ndocker network prune\\n\\n# Remove dangling images\\ndocker image prune\\n```\\n\\n### Data Persistence\\n\\nDocker volumes ensure your data persists across container restarts:\\n\\n```\\nvolumes:\\n mcp-data: # MCP Prompts data\\n mcp-filesystem-data: # Filesystem server data\\n mcp-elevenlabs-data: # Audio output data\\n mcp-prompts-postgres-data: # PostgreSQL data\\n mcp-prompts-pgai-data: # PGAI/TimescaleDB data\\n```\\n\\n## Best Practices for Production\\n\\n1. **Security Considerations**\\n - Use environment files for secrets\\n - Configure proper network isolation\\n - Set up user permissions for service accounts\\n - Enable HTTPS with proper certificates\\n\\n2. **High Availability**\\n - Implement container restart policies\\n - Consider Docker Swarm or Kubernetes for clustering\\n - Set up monitoring and alerting\\n - Establish backup and recovery procedures\\n\\n3. **Performance Optimization**\\n - Tune PostgreSQL/PGAI for your workload\\n - Configure appropriate resource limits\\n - Implement caching strategies\\n - Monitor resource usage\\n\\n## Advanced Customization\\n\\n### Adding Custom MCP Servers\\n\\n1. Create a Dockerfile for your custom server\\n2. Add the service to your Docker Compose file\\n3. Configure environment variables for integration\\n4. Update the MCP Prompts server configuration\\n\\n### Extending with Additional Services\\n\\n```yaml\\nservices:\\n # Your custom MCP server\\n mcp-custom:\\n image: node:20-alpine\\n container_name: mcp-custom\\n command: sh -c \\\\\\\"npm install -g your-custom-mcp-server && npx -y your-custom-mcp-server\\\\\\\"\\n environment:\\n - CUSTOM_API_KEY={{custom_api_key}}\\n ports:\\n - \\\\\\\"3025:3000\\\\\\\"\\n restart: unless-stopped\\n networks:\\n - mcp-network\\n```\\n\\n## Next Steps\\n\\n1. Explore integration with AI clients like Claude Desktop, Zed, and LibreChat\\n2. Implement monitoring and logging solutions\\n3. Set up CI/CD pipelines for deployment\\n4. Explore advanced use cases for your specific domain\\n\\n## Additional Resources\\n\\n- [MCP Protocol Documentation](https://modelcontextprotocol.io/)\\n- [Docker Documentation](https://docs.docker.com/)\\n- [MCP Servers Repository](https://github.com/modelcontextprotocol/servers)\\n- {{additional_resources}}\\n\\nWhat specific aspect of this Docker-based MCP integration would you like me to elaborate on further?\\\",\\n \\\"isTemplate\\\": true,\\n \\\"variables\\\": [\\n \\\"use_case\\\",\\n \\\"additional_prerequisites\\\",\\n \\\"additional_servers\\\",\\n \\\"registry\\\",\\n \\\"github_token\\\",\\n \\\"elevenlabs_api_key\\\",\\n \\\"elevenlabs_voice_id\\\",\\n \\\"elevenlabs_model_id\\\",\\n \\\"postgres_user\\\",\\n \\\"postgres_password\\\",\\n \\\"postgres_database\\\",\\n \\\"pgai_api_key\\\",\\n \\\"custom_api_key\\\",\\n \\\"additional_resources\\\"\\n ],\\n \\\"tags\\\": [\\n \\\"docker\\\",\\n \\\"mcp-integration\\\",\\n \\\"multi-server\\\",\\n \\\"orchestration\\\",\\n \\\"containerization\\\",\\n \\\"devops\\\",\\n \\\"tutorial\\\"\\n ],\\n \\\"createdAt\\\": \\\"2025-03-15T21:00:00.000Z\\\",\\n \\\"updatedAt\\\": \\\"2025-03-15T21:00:00.000Z\\\",\\n \\\"version\\\": 1,\\n \\\"metadata\\\": {\\n \\\"recommended_servers\\\": [\\n \\\"@modelcontextprotocol/server-filesystem\\\",\\n \\\"@modelcontextprotocol/server-memory\\\",\\n \\\"@modelcontextprotocol/server-github\\\",\\n \\\"@modelcontextprotocol/server-sequential-thinking\\\",\\n \\\"elevenlabs-mcp-server\\\"\\n ],\\n \\\"example_values\\\": {\\n \\\"use_case\\\": \\\"AI-powered code analysis and documentation\\\",\\n \\\"additional_prerequisites\\\": \\\"Node.js 18+ for local development\\\",\\n \\\"registry\\\": \\\"sparesparrow\\\",\\n \\\"postgres_user\\\": \\\"postgres\\\",\\n \\\"postgres_password\\\": \\\"secure_password_here\\\",\\n \\\"postgres_database\\\": \\\"mcp_prompts",
7 | "variables": {},
8 | "metadata": {
9 | "source": "/home/sparrow/projects/mcp-prompts/prompts/docker-mcp-servers-orchestration.json",
10 | "imported": true
11 | }
12 | }
```
--------------------------------------------------------------------------------
/printcast-agent/src/orchestration/workflow.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Main workflow orchestrator for PrintCast Agent.
3 |
4 | Coordinates the entire voice-to-print-to-delivery workflow.
5 | """
6 |
7 | import asyncio
8 | import json
9 | from typing import Any, Dict, List, Optional
10 | from datetime import datetime
11 | from enum import Enum
12 |
13 | import structlog
14 | from pydantic import BaseModel, Field
15 |
16 | from ..integrations.asterisk import AsteriskManager
17 | from ..integrations.elevenlabs import ElevenLabsAgent
18 | from ..integrations.content import ContentFetcher, ContentItem
19 | from ..integrations.printing import PrintManager
20 | from ..integrations.delivery import DeliveryService, Address
21 |
22 | logger = structlog.get_logger(__name__)
23 |
24 |
25 | class WorkflowState(Enum):
26 | """Workflow states."""
27 | IDLE = "idle"
28 | CALL_INITIATED = "call_initiated"
29 | GREETING = "greeting"
30 | CONTENT_SELECTION = "content_selection"
31 | USER_SELECTION = "user_selection"
32 | ADDRESS_COLLECTION = "address_collection"
33 | CONFIRMATION = "confirmation"
34 | PROCESSING = "processing"
35 | PRINTING = "printing"
36 | SHIPPING = "shipping"
37 | COMPLETED = "completed"
38 | FAILED = "failed"
39 | CANCELLED = "cancelled"
40 |
41 |
42 | class WorkflowContext(BaseModel):
43 | """Context for workflow execution."""
44 |
45 | workflow_id: str
46 | session_id: str
47 | caller_id: str
48 | state: WorkflowState = WorkflowState.IDLE
49 | language: str = "cs"
50 | content_type: Optional[str] = None
51 | available_content: List[ContentItem] = Field(default_factory=list)
52 | selected_items: List[str] = Field(default_factory=list)
53 | delivery_address: Optional[Address] = None
54 | delivery_method: str = "post"
55 | print_job_ids: List[str] = Field(default_factory=list)
56 | shipment_id: Optional[str] = None
57 | start_time: datetime = Field(default_factory=datetime.now)
58 | end_time: Optional[datetime] = None
59 | metadata: Dict[str, Any] = Field(default_factory=dict)
60 | error: Optional[str] = None
61 |
62 |
63 | class WorkflowOrchestrator:
64 | """
65 | Orchestrates the complete voice-to-print workflow.
66 |
67 | Manages state transitions and coordinates all services.
68 | """
69 |
70 | def __init__(
71 | self,
72 | asterisk: AsteriskManager,
73 | elevenlabs: ElevenLabsAgent,
74 | content: ContentFetcher,
75 | printer: PrintManager,
76 | delivery: DeliveryService
77 | ):
78 | """
79 | Initialize workflow orchestrator.
80 |
81 | Args:
82 | asterisk: Asterisk manager
83 | elevenlabs: ElevenLabs agent
84 | content: Content fetcher
85 | printer: Print manager
86 | delivery: Delivery service
87 | """
88 | self.asterisk = asterisk
89 | self.elevenlabs = elevenlabs
90 | self.content = content
91 | self.printer = printer
92 | self.delivery = delivery
93 |
94 | self.workflows: Dict[str, WorkflowContext] = {}
95 | self.workflow_counter = 0
96 |
97 | logger.info("Workflow orchestrator initialized")
98 |
99 | async def start_workflow(
100 | self,
101 | caller_id: str,
102 | session_id: str,
103 | language: str = "cs"
104 | ) -> str:
105 | """
106 | Start a new workflow for incoming call.
107 |
108 | Args:
109 | caller_id: Caller phone number
110 | session_id: Call session ID
111 | language: Preferred language
112 |
113 | Returns:
114 | Workflow ID
115 | """
116 | try:
117 | # Create workflow context
118 | self.workflow_counter += 1
119 | workflow_id = f"wf_{self.workflow_counter}_{datetime.now().strftime('%Y%m%d%H%M%S')}"
120 |
121 | context = WorkflowContext(
122 | workflow_id=workflow_id,
123 | session_id=session_id,
124 | caller_id=caller_id,
125 | language=language,
126 | state=WorkflowState.CALL_INITIATED
127 | )
128 |
129 | self.workflows[workflow_id] = context
130 |
131 | # Start workflow execution
132 | asyncio.create_task(self._execute_workflow(workflow_id))
133 |
134 | logger.info(
135 | "Workflow started",
136 | workflow_id=workflow_id,
137 | caller_id=caller_id,
138 | session_id=session_id
139 | )
140 |
141 | return workflow_id
142 |
143 | except Exception as e:
144 | logger.error("Failed to start workflow", error=str(e))
145 | raise
146 |
147 | async def _execute_workflow(self, workflow_id: str):
148 | """
149 | Execute the complete workflow.
150 |
151 | Args:
152 | workflow_id: Workflow ID
153 | """
154 | context = self.workflows.get(workflow_id)
155 | if not context:
156 | return
157 |
158 | try:
159 | # State machine execution
160 | while context.state not in [WorkflowState.COMPLETED, WorkflowState.FAILED, WorkflowState.CANCELLED]:
161 |
162 | if context.state == WorkflowState.CALL_INITIATED:
163 | await self._handle_call_initiated(context)
164 |
165 | elif context.state == WorkflowState.GREETING:
166 | await self._handle_greeting(context)
167 |
168 | elif context.state == WorkflowState.CONTENT_SELECTION:
169 | await self._handle_content_selection(context)
170 |
171 | elif context.state == WorkflowState.USER_SELECTION:
172 | await self._handle_user_selection(context)
173 |
174 | elif context.state == WorkflowState.ADDRESS_COLLECTION:
175 | await self._handle_address_collection(context)
176 |
177 | elif context.state == WorkflowState.CONFIRMATION:
178 | await self._handle_confirmation(context)
179 |
180 | elif context.state == WorkflowState.PROCESSING:
181 | await self._handle_processing(context)
182 |
183 | elif context.state == WorkflowState.PRINTING:
184 | await self._handle_printing(context)
185 |
186 | elif context.state == WorkflowState.SHIPPING:
187 | await self._handle_shipping(context)
188 |
189 | else:
190 | logger.warning(
191 | "Unknown workflow state",
192 | state=context.state,
193 | workflow_id=workflow_id
194 | )
195 | context.state = WorkflowState.FAILED
196 |
197 | # Small delay between state transitions
198 | await asyncio.sleep(0.1)
199 |
200 | # Workflow completed
201 | context.end_time = datetime.now()
202 | duration = (context.end_time - context.start_time).total_seconds()
203 |
204 | logger.info(
205 | "Workflow completed",
206 | workflow_id=workflow_id,
207 | state=context.state,
208 | duration=duration
209 | )
210 |
211 | except Exception as e:
212 | logger.error(
213 | "Workflow execution failed",
214 | workflow_id=workflow_id,
215 | error=str(e)
216 | )
217 | context.state = WorkflowState.FAILED
218 | context.error = str(e)
219 |
220 | async def _handle_call_initiated(self, context: WorkflowContext):
221 | """Handle call initiated state."""
222 | try:
223 | # Start ElevenLabs conversation
224 | await self.elevenlabs.start_conversation(
225 | session_id=context.session_id,
226 | language=context.language
227 | )
228 |
229 | context.state = WorkflowState.GREETING
230 |
231 | except Exception as e:
232 | logger.error("Failed to initiate call", error=str(e))
233 | context.state = WorkflowState.FAILED
234 | context.error = str(e)
235 |
236 | async def _handle_greeting(self, context: WorkflowContext):
237 | """Handle greeting state."""
238 | try:
239 | # Generate and play greeting
240 | greeting = self._get_greeting_text(context.language)
241 |
242 | response = await self.elevenlabs.text_to_speech(
243 | greeting,
244 | language=context.language
245 | )
246 |
247 | # Play audio through Asterisk
248 | # In production, would stream audio through SIP
249 |
250 | context.state = WorkflowState.CONTENT_SELECTION
251 |
252 | except Exception as e:
253 | logger.error("Failed to play greeting", error=str(e))
254 | context.state = WorkflowState.FAILED
255 | context.error = str(e)
256 |
257 | async def _handle_content_selection(self, context: WorkflowContext):
258 | """Handle content type selection."""
259 | try:
260 | # Ask user what content they want
261 | prompt = self._get_content_selection_prompt(context.language)
262 |
263 | await self.elevenlabs.send_message(
264 | context.session_id,
265 | prompt
266 | )
267 |
268 | # Wait for user response (simulated)
269 | await asyncio.sleep(2)
270 |
271 | # For demo, default to GitHub trending
272 | context.content_type = "github"
273 |
274 | # Fetch content
275 | context.available_content = await self.content.fetch_github_trending(
276 | limit=5
277 | )
278 |
279 | # Generate summary
280 | summary = await self.elevenlabs.generate_content_summary(
281 | [item.dict() for item in context.available_content],
282 | language=context.language,
283 | max_items=5
284 | )
285 |
286 | # Read summary to user
287 | await self.elevenlabs.send_message(
288 | context.session_id,
289 | summary
290 | )
291 |
292 | context.state = WorkflowState.USER_SELECTION
293 |
294 | except Exception as e:
295 | logger.error("Failed in content selection", error=str(e))
296 | context.state = WorkflowState.FAILED
297 | context.error = str(e)
298 |
299 | async def _handle_user_selection(self, context: WorkflowContext):
300 | """Handle user's content selection."""
301 | try:
302 | # Wait for user selection (simulated)
303 | # In production, would process DTMF or voice input
304 | await asyncio.sleep(3)
305 |
306 | # For demo, select first two items
307 | if len(context.available_content) >= 2:
308 | context.selected_items = [
309 | context.available_content[0].id,
310 | context.available_content[1].id
311 | ]
312 | else:
313 | context.selected_items = [item.id for item in context.available_content]
314 |
315 | # Confirm selection
316 | confirmation = self._get_selection_confirmation(
317 | context.selected_items,
318 | context.language
319 | )
320 |
321 | await self.elevenlabs.send_message(
322 | context.session_id,
323 | confirmation
324 | )
325 |
326 | context.state = WorkflowState.ADDRESS_COLLECTION
327 |
328 | except Exception as e:
329 | logger.error("Failed in user selection", error=str(e))
330 | context.state = WorkflowState.FAILED
331 | context.error = str(e)
332 |
333 | async def _handle_address_collection(self, context: WorkflowContext):
334 | """Handle delivery address collection."""
335 | try:
336 | # Ask for delivery address
337 | prompt = self._get_address_prompt(context.language)
338 |
339 | await self.elevenlabs.send_message(
340 | context.session_id,
341 | prompt
342 | )
343 |
344 | # For demo, use default address
345 | context.delivery_address = Address(
346 | name="Test Recipient",
347 | street="Václavské náměstí 1",
348 | city="Praha",
349 | postal_code="11000",
350 | country="CZ",
351 | phone=context.caller_id
352 | )
353 |
354 | # Confirm address
355 | address_confirmation = self._format_address_confirmation(
356 | context.delivery_address,
357 | context.language
358 | )
359 |
360 | await self.elevenlabs.send_message(
361 | context.session_id,
362 | address_confirmation
363 | )
364 |
365 | context.state = WorkflowState.CONFIRMATION
366 |
367 | except Exception as e:
368 | logger.error("Failed in address collection", error=str(e))
369 | context.state = WorkflowState.FAILED
370 | context.error = str(e)
371 |
372 | async def _handle_confirmation(self, context: WorkflowContext):
373 | """Handle order confirmation."""
374 | try:
375 | # Generate final confirmation
376 | summary = self._generate_order_summary(context)
377 |
378 | await self.elevenlabs.send_message(
379 | context.session_id,
380 | summary
381 | )
382 |
383 | # Wait for confirmation (simulated)
384 | await asyncio.sleep(2)
385 |
386 | # Assume confirmed
387 | context.state = WorkflowState.PROCESSING
388 |
389 | # Thank user
390 | thanks = self._get_thank_you_message(context.language)
391 | await self.elevenlabs.send_message(
392 | context.session_id,
393 | thanks
394 | )
395 |
396 | except Exception as e:
397 | logger.error("Failed in confirmation", error=str(e))
398 | context.state = WorkflowState.FAILED
399 | context.error = str(e)
400 |
401 | async def _handle_processing(self, context: WorkflowContext):
402 | """Handle order processing."""
403 | try:
404 | # Process the order
405 | result = await self.process_order(
406 | context.session_id,
407 | context.selected_items,
408 | context.delivery_address.dict() if context.delivery_address else {},
409 | context.delivery_method
410 | )
411 |
412 | context.print_job_ids = result.get("print_jobs", [])
413 | context.shipment_id = result.get("shipment_id")
414 |
415 | context.state = WorkflowState.PRINTING
416 |
417 | except Exception as e:
418 | logger.error("Failed in processing", error=str(e))
419 | context.state = WorkflowState.FAILED
420 | context.error = str(e)
421 |
422 | async def _handle_printing(self, context: WorkflowContext):
423 | """Handle printing state."""
424 | try:
425 | # Monitor print jobs
426 | all_completed = True
427 |
428 | for job_id in context.print_job_ids:
429 | status = self.printer.get_job_status(job_id)
430 | if status and status["status"] not in ["completed", "simulated"]:
431 | all_completed = False
432 |
433 | if all_completed:
434 | context.state = WorkflowState.SHIPPING
435 | else:
436 | # Wait and check again
437 | await asyncio.sleep(5)
438 |
439 | except Exception as e:
440 | logger.error("Failed in printing", error=str(e))
441 | context.state = WorkflowState.FAILED
442 | context.error = str(e)
443 |
444 | async def _handle_shipping(self, context: WorkflowContext):
445 | """Handle shipping state."""
446 | try:
447 | if context.shipment_id:
448 | # Mark as shipped
449 | await self.delivery.ship_package(context.shipment_id)
450 |
451 | context.state = WorkflowState.COMPLETED
452 |
453 | except Exception as e:
454 | logger.error("Failed in shipping", error=str(e))
455 | context.state = WorkflowState.FAILED
456 | context.error = str(e)
457 |
458 | async def process_order(
459 | self,
460 | session_id: str,
461 | selected_items: List[str],
462 | delivery_address: Dict[str, Any],
463 | delivery_method: str = "post"
464 | ) -> Dict[str, Any]:
465 | """
466 | Process complete order from selection to shipping.
467 |
468 | Args:
469 | session_id: Session ID
470 | selected_items: Selected content IDs
471 | delivery_address: Delivery address
472 | delivery_method: Delivery method
473 |
474 | Returns:
475 | Order result with tracking information
476 | """
477 | try:
478 | # Get selected content
479 | content_items = await self.content.get_content_by_ids(selected_items)
480 |
481 | if not content_items:
482 | raise ValueError("No content items found")
483 |
484 | # Format content for printing
485 | formatted_content = self.content.format_for_print(
486 | content_items,
487 | format="markdown"
488 | )
489 |
490 | # Generate PDF
491 | pdf_path = await self.printer.generate_pdf(
492 | formatted_content,
493 | title=f"PrintCast Order {session_id}"
494 | )
495 |
496 | # Print document
497 | print_job_id = await self.printer.print_document(pdf_path)
498 |
499 | # Create shipment
500 | address = Address(**delivery_address) if isinstance(delivery_address, dict) else delivery_address
501 |
502 | shipment_id = await self.delivery.create_shipment(
503 | recipient=address,
504 | method=delivery_method,
505 | weight=100, # Estimate
506 | metadata={
507 | "session_id": session_id,
508 | "content_count": len(content_items)
509 | }
510 | )
511 |
512 | # Get tracking info
513 | tracking_info = self.delivery.get_shipment_status(shipment_id)
514 |
515 | logger.info(
516 | "Order processed",
517 | session_id=session_id,
518 | print_job=print_job_id,
519 | shipment=shipment_id
520 | )
521 |
522 | return {
523 | "success": True,
524 | "session_id": session_id,
525 | "print_jobs": [print_job_id],
526 | "shipment_id": shipment_id,
527 | "tracking_number": tracking_info.get("tracking_number") if tracking_info else None,
528 | "estimated_delivery": tracking_info.get("estimated_delivery") if tracking_info else None,
529 | "total_items": len(content_items)
530 | }
531 |
532 | except Exception as e:
533 | logger.error("Failed to process order", error=str(e))
534 | raise
535 |
536 | def _get_greeting_text(self, language: str) -> str:
537 | """Get greeting text."""
538 | greetings = {
539 | "cs": "Dobrý den! Vítejte v PrintCast. Mohu vám pomoci vytisknout a doručit nejnovější trendy z GitHubu, RSS kanálů nebo zpráv. Co by vás zajímalo?",
540 | "en": "Hello! Welcome to PrintCast. I can help you print and deliver the latest trends from GitHub, RSS feeds, or news. What would you like to explore?"
541 | }
542 | return greetings.get(language, greetings["en"])
543 |
544 | def _get_content_selection_prompt(self, language: str) -> str:
545 | """Get content selection prompt."""
546 | prompts = {
547 | "cs": "Řekněte 'GitHub' pro trendující repozitáře, 'RSS' pro nejnovější články, nebo 'zprávy' pro aktuální novinky.",
548 | "en": "Say 'GitHub' for trending repositories, 'RSS' for latest articles, or 'news' for current news."
549 | }
550 | return prompts.get(language, prompts["en"])
551 |
552 | def _get_selection_confirmation(self, items: List[str], language: str) -> str:
553 | """Get selection confirmation."""
554 | count = len(items)
555 | if language == "cs":
556 | return f"Vybrali jste {count} položek k tisku. Nyní potřebuji vaši doručovací adresu."
557 | else:
558 | return f"You've selected {count} items to print. Now I need your delivery address."
559 |
560 | def _get_address_prompt(self, language: str) -> str:
561 | """Get address prompt."""
562 | prompts = {
563 | "cs": "Prosím, řekněte mi vaši doručovací adresu včetně jména, ulice, města a PSČ.",
564 | "en": "Please tell me your delivery address including name, street, city, and postal code."
565 | }
566 | return prompts.get(language, prompts["en"])
567 |
568 | def _format_address_confirmation(self, address: Address, language: str) -> str:
569 | """Format address confirmation."""
570 | if language == "cs":
571 | return f"Doručovací adresa: {address.name}, {address.street}, {address.postal_code} {address.city}. Je to správně?"
572 | else:
573 | return f"Delivery address: {address.name}, {address.street}, {address.postal_code} {address.city}. Is this correct?"
574 |
575 | def _generate_order_summary(self, context: WorkflowContext) -> str:
576 | """Generate order summary."""
577 | items_count = len(context.selected_items)
578 |
579 | if context.language == "cs":
580 | return f"Shrnutí objednávky: {items_count} položek k tisku, doručení {context.delivery_method} na adresu {context.delivery_address.city if context.delivery_address else 'neznámá'}. Potvrzujete objednávku?"
581 | else:
582 | return f"Order summary: {items_count} items to print, {context.delivery_method} delivery to {context.delivery_address.city if context.delivery_address else 'unknown'}. Do you confirm the order?"
583 |
584 | def _get_thank_you_message(self, language: str) -> str:
585 | """Get thank you message."""
586 | messages = {
587 | "cs": "Děkuji za vaši objednávku! Vaše dokumenty budou vytištěny a odeslány. Obdržíte sledovací číslo SMS zprávou.",
588 | "en": "Thank you for your order! Your documents will be printed and shipped. You'll receive a tracking number via SMS."
589 | }
590 | return messages.get(language, messages["en"])
591 |
592 | async def cancel_workflow(self, workflow_id: str, reason: str = "user_request") -> bool:
593 | """
594 | Cancel a workflow.
595 |
596 | Args:
597 | workflow_id: Workflow ID
598 | reason: Cancellation reason
599 |
600 | Returns:
601 | True if cancelled successfully
602 | """
603 | context = self.workflows.get(workflow_id)
604 | if not context:
605 | return False
606 |
607 | if context.state in [WorkflowState.COMPLETED, WorkflowState.FAILED, WorkflowState.CANCELLED]:
608 | return False
609 |
610 | try:
611 | # Cancel print jobs
612 | for job_id in context.print_job_ids:
613 | await self.printer.cancel_print_job(job_id)
614 |
615 | # Cancel shipment
616 | if context.shipment_id:
617 | await self.delivery.cancel_shipment(context.shipment_id)
618 |
619 | # End conversation
620 | await self.elevenlabs.end_conversation(context.session_id)
621 |
622 | context.state = WorkflowState.CANCELLED
623 | context.end_time = datetime.now()
624 | context.metadata["cancellation_reason"] = reason
625 |
626 | logger.info(
627 | "Workflow cancelled",
628 | workflow_id=workflow_id,
629 | reason=reason
630 | )
631 |
632 | return True
633 |
634 | except Exception as e:
635 | logger.error(
636 | "Failed to cancel workflow",
637 | workflow_id=workflow_id,
638 | error=str(e)
639 | )
640 | return False
641 |
642 | def get_workflow_status(self, workflow_id: str) -> Optional[Dict[str, Any]]:
643 | """Get workflow status."""
644 | context = self.workflows.get(workflow_id)
645 | if not context:
646 | return None
647 |
648 | duration = None
649 | if context.end_time:
650 | duration = (context.end_time - context.start_time).total_seconds()
651 | elif context.state not in [WorkflowState.COMPLETED, WorkflowState.FAILED, WorkflowState.CANCELLED]:
652 | duration = (datetime.now() - context.start_time).total_seconds()
653 |
654 | return {
655 | "workflow_id": workflow_id,
656 | "session_id": context.session_id,
657 | "caller_id": context.caller_id,
658 | "state": context.state.value,
659 | "language": context.language,
660 | "selected_items": len(context.selected_items),
661 | "print_jobs": context.print_job_ids,
662 | "shipment_id": context.shipment_id,
663 | "start_time": context.start_time.isoformat(),
664 | "end_time": context.end_time.isoformat() if context.end_time else None,
665 | "duration_seconds": duration,
666 | "error": context.error
667 | }
```
--------------------------------------------------------------------------------
/data/prompts/templates/mcp-code-generator.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "id": "unknown-id",
3 | "name": "mcp-code-generator",
4 | "description": "An advanced code generation prompt that leverages multiple MCP resources to create contextually-aware, high-quality code with minimal hallucination.",
5 | "content": " \\\"mcp-code-generator\\\",\\n \\\"version\\\": \\\"1.0.0\\\",\\n \\\"description\\\": \\\"An advanced code generation prompt that leverages multiple MCP resources to create contextually-aware, high-quality code with minimal hallucination.\\\",\\n \\\"prompt_text\\\": \\\"# MCP-Powered Code Generator\\\\n\\\\nYou are an expert coding assistant with access to multiple MCP resources. Your task is to generate high-quality, contextually-appropriate code based on the user's requirements while leveraging the following MCP resources to reduce hallucination and improve accuracy:\\\\n\\\\n- **Filesystem** (@file:// URIs): Access to project files and directory structure\\\\n- **GitHub** (@github:// URIs): Access to repositories, code examples, and documentation\\\\n- **Sequential Thinking** (@thinking:// URIs): Step-by-step reasoning for complex algorithms\\\\n- **Memory** (@memory:// URIs): Previous code snippets and user preferences\\\\n\\\\n## Code Generation Process\\\\n\\\\n1. **Analyze Requirements**\\\\n - Break down the user's request into specific coding tasks\\\\n - Identify key functionalities, interfaces, and constraints\\\\n - Determine appropriate language, framework, or library to use\\\\n\\\\n2. **Resource Collection**\\\\n - Check current project structure (if available): `@file:///project`\\\\n - Find related examples on GitHub: `@github://relevant-repos`\\\\n - Retrieve user preferences if available: `@memory://coding-preferences`\\\\n\\\\n3. **Design Phase**\\\\n - Create a high-level design outline\\\\n - Determine classes, functions, or components needed\\\\n - Establish interfaces and relationships\\\\n\\\\n4. **Implementation Phase**\\\\n - Write clean, well-documented code that follows best practices\\\\n - Include proper error handling and edge cases\\\\n - Ensure compatibility with existing codebase (if applicable)\\\\n - Add appropriate comments and documentation\\\\n\\\\n5. **Testing Considerations**\\\\n - Include unit test examples or strategies when appropriate\\\\n - Consider edge cases and potential failures\\\\n - Provide sample usage examples\\\\n\\\\n## Code Quality Guidelines\\\\n\\\\n- **Readability**: Write clear, self-explanatory code with consistent formatting\\\\n- **Maintainability**: Use descriptive variable names and follow language conventions\\\\n- **Performance**: Consider algorithmic efficiency and resource usage\\\\n- **Security**: Follow security best practices and avoid common vulnerabilities\\\\n- **Reusability**: Create modular, reusable components when appropriate\\\\n\\\\n## Output Format\\\\n\\\\nYour response should include:\\\\n\\\\n1. A brief explanation of the approach taken\\\\n2. The generated code in properly formatted code blocks\\\\n3. Installation instructions or dependencies (if applicable)\\\\n4. Usage examples\\\\n5. References to any MCP resources used\\\\n\\\\n## Contextual Adaptation\\\\n\\\\nTailor your code generation based on:\\\\n\\\\n- The programming language specified or inferred from context\\\\n- The user's preferred coding style (if known)\\\\n- The complexity level appropriate for the task\\\\n- The target environment (web, mobile, desktop, server, etc.)\\\\n\\\\n{{code_requirements}}\\\\n\\\\n{{additional_context}}\\\",\\n \\\"variables\\\": [\\n \\\"code_requirements\\\",\\n \\\"additional_context\\\"\\n ],\\n \\\"tags\\\": [\\n \\\"code-generation\\\",\\n \\\"multi-resource\\\",\\n \\\"mcp-integration\\\",\\n \\\"development\\\",\\n \\\"programming\\\"\\n ],\\n \\\"examples\\\": [\\n {\\n \\\"name\\\": \\\"React Component Generator\\\",\\n \\\"variables\\\": {\\n \\\"code_requirements\\\": \\\"Create a React component for a customizable data table with sorting, filtering, and pagination capabilities. The component should be reusable across our application.\\\",\\n \\\"additional_context\\\": \\\"Our project uses TypeScript, React 18, and follows a functional component approach with hooks. We prefer using styled-components for styling. The existing component structure can be found at @file:///project/src/components/.\\\"\\n },\\n \\\"expected_response\\\": \\\"# Customizable Data Table Component\\\\n\\\\nI'll create a reusable React component for a data table with sorting, filtering, and pagination capabilities, following your project's TypeScript and React 18 standards with styled-components for styling.\\\\n\\\\n## Approach\\\\n\\\\nAfter examining your project structure at `@file:///project/src/components/`, I notice you're using a functional component pattern with hooks. I'll create:\\\\n\\\\n1. A main `DataTable` component that handles the core functionality\\\\n2. Several sub-components for table elements (header, row, cell, pagination)\\\\n3. Custom hooks for sorting, filtering, and pagination logic\\\\n4. TypeScript interfaces for strong typing\\\\n\\\\n## Component Structure\\\\n\\\\n```typescript\\\\n// DataTable.tsx\\\\nimport React, { useState, useMemo, useCallback } from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { TableHeader } from './TableHeader';\\\\nimport { TableRow } from './TableRow';\\\\nimport { Pagination } from './Pagination';\\\\nimport { useSort } from '../hooks/useSort';\\\\nimport { useFilter } from '../hooks/useFilter';\\\\nimport { usePagination } from '../hooks/usePagination';\\\\n\\\\n// TypeScript interfaces\\\\nexport interface Column<T> {\\\\n key: string;\\\\n header: string;\\\\n renderCell?: (item: T) => React.ReactNode;\\\\n sortable?: boolean;\\\\n filterable?: boolean;\\\\n}\\\\n\\\\nexport interface DataTableProps<T> {\\\\n data: T[];\\\\n columns: Column<T>[];\\\\n initialSortKey?: string;\\\\n initialSortDirection?: 'asc' | 'desc';\\\\n rowsPerPageOptions?: number[];\\\\n initialRowsPerPage?: number;\\\\n onRowClick?: (item: T) => void;\\\\n className?: string;\\\\n}\\\\n\\\\n// Styled components\\\\nconst TableContainer = styled.div`\\\\n width: 100%;\\\\n overflow-x: auto;\\\\n border-radius: 4px;\\\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\\\\n`;\\\\n\\\\nconst Table = styled.table`\\\\n width: 100%;\\\\n border-collapse: collapse;\\\\n font-size: 14px;\\\\n`;\\\\n\\\\nconst TableBody = styled.tbody`\\\\n & tr:nth-child(odd) {\\\\n background-color: #f9f9f9;\\\\n }\\\\n \\\\n & tr:hover {\\\\n background-color: #f1f1f1;\\\\n }\\\\n`;\\\\n\\\\nconst FilterContainer = styled.div`\\\\n margin-bottom: 16px;\\\\n display: flex;\\\\n justify-content: flex-end;\\\\n`;\\\\n\\\\nconst FilterInput = styled.input`\\\\n padding: 8px 12px;\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n font-size: 14px;\\\\n width: 250px;\\\\n`;\\\\n\\\\n// Main component\\\\nexport function DataTable<T extends Record<string, any>>({ \\\\n data, \\\\n columns, \\\\n initialSortKey,\\\\n initialSortDirection = 'asc',\\\\n rowsPerPageOptions = [10, 25, 50],\\\\n initialRowsPerPage = 10,\\\\n onRowClick,\\\\n className\\\\n}: DataTableProps<T>) {\\\\n // Global filter state\\\\n const [filterValue, setFilterValue] = useState('');\\\\n \\\\n // Hook usage\\\\n const { sortedData, sortKey, sortDirection, handleSort } = useSort(data, initialSortKey, initialSortDirection);\\\\n const { filteredData } = useFilter(sortedData, filterValue, columns);\\\\n const { \\\\n currentPageData, \\\\n currentPage, \\\\n totalPages, \\\\n rowsPerPage,\\\\n setCurrentPage, \\\\n setRowsPerPage \\\\n } = usePagination(filteredData, initialRowsPerPage);\\\\n\\\\n // Filter change handler\\\\n const handleFilterChange = useCallback(\\\\n (e: React.ChangeEvent<HTMLInputElement>) => {\\\\n setFilterValue(e.target.value);\\\\n setCurrentPage(1); // Reset to first page when filtering\\\\n }, \\\\n [setCurrentPage]\\\\n );\\\\n\\\\n // Memoize filterable columns\\\\n const filterableColumns = useMemo(\\\\n () => columns.filter(column => column.filterable),\\\\n [columns]\\\\n );\\\\n\\\\n return (\\\\n <div className={className}>\\\\n {filterableColumns.length > 0 && (\\\\n <FilterContainer>\\\\n <FilterInput \\\\\\n type=\\\\\\\"text\\\\\\\" \\\\\\n placeholder=\\\\\\\"Filter table...\\\\\\\"\\\\\\n value={filterValue}\\\\\\n onChange={handleFilterChange}\\\\\\n />\\\\\\n </FilterContainer>\\\\\\n )}\\\\\\n \\\\\\n <TableContainer>\\\\\\n <Table>\\\\\\n <TableHeader \\\\\\n columns={columns} \\\\\\n sortKey={sortKey} \\\\\\n sortDirection={sortDirection} \\\\\\n onSort={handleSort} \\\\\\n />\\\\\\n <TableBody>\\\\\\n {currentPageData.map((item, index) => (\\\\\\n <TableRow \\\\\\n key={index} \\\\\\n item={item} \\\\\\n columns={columns} \\\\\\n onClick={onRowClick ? () => onRowClick(item) : undefined} \\\\\\n />\\\\\\n ))}\\\\\\n {currentPageData.length === 0 && (\\\\\\n <tr>\\\\\\n <td colSpan={columns.length} style={{ textAlign: 'center', padding: '16px' }}>\\\\\\n No records found\\\\\\n </td>\\\\\\n </tr>\\\\\\n )}\\\\\\n </TableBody>\\\\\\n </Table>\\\\\\n </TableContainer>\\\\\\n \\\\\\n <Pagination \\\\\\n currentPage={currentPage}\\\\\\n totalPages={totalPages}\\\\\\n rowsPerPage={rowsPerPage}\\\\\\n rowsPerPageOptions={rowsPerPageOptions}\\\\\\n onPageChange={setCurrentPage}\\\\\\n onRowsPerPageChange={setRowsPerPage}\\\\\\n totalItems={filteredData.length}\\\\\\n />\\\\\\n </div>\\\\\\n );\\\\\\n}\\\\n```\\\\n\\\\n## Custom Hooks Implementation\\\\n\\\\n```typescript\\\\n// hooks/useSort.ts\\\\nimport { useState, useMemo } from 'react';\\\\n\\\\nexport function useSort<T extends Record<string, any>>(\\\\n data: T[], \\\\\\n initialSortKey?: string, \\\\\\n initialSortDirection: 'asc' | 'desc' = 'asc'\\\\n) {\\\\n const [sortKey, setSortKey] = useState<string | undefined>(initialSortKey);\\\\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>(initialSortDirection);\\\\n\\\\n const handleSort = (key: string) => {\\\\n if (sortKey === key) {\\\\n // Toggle direction if already sorting by this key\\\\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\\\\n } else {\\\\n // New sort key, set to ascending by default\\\\n setSortKey(key);\\\\n setSortDirection('asc');\\\\n }\\\\n };\\\\n\\\\n const sortedData = useMemo(() => {\\\\n if (!sortKey) return [...data];\\\\n\\\\n return [...data].sort((a, b) => {\\\\n const aValue = a[sortKey];\\\\n const bValue = b[sortKey];\\\\n\\\\n // Handle different data types\\\\n if (typeof aValue === 'string' && typeof bValue === 'string') {\\\\n return sortDirection === 'asc' \\\\\\n ? aValue.localeCompare(bValue) \\\\\\n : bValue.localeCompare(aValue);\\\\n }\\\\n\\\\n if (aValue === bValue) return 0;\\\\n \\\\n if (sortDirection === 'asc') {\\\\n return aValue > bValue ? 1 : -1;\\\\n } else {\\\\n return aValue < bValue ? 1 : -1;\\\\n }\\\\n });\\\\n }, [data, sortKey, sortDirection]);\\\\n\\\\n return { sortedData, sortKey, sortDirection, handleSort };\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// hooks/useFilter.ts\\\\nimport { useMemo } from 'react';\\\\nimport { Column } from '../components/DataTable';\\\\n\\\\nexport function useFilter<T extends Record<string, any>>(\\\\n data: T[], \\\\\\n filterValue: string,\\\\n columns: Column<T>[]\\\\n) {\\\\n const filteredData = useMemo(() => {\\\\n if (!filterValue) return data;\\\\n \\\\n const lowercasedFilter = filterValue.toLowerCase();\\\\n \\\\n return data.filter(item => {\\\\n return columns.some(column => {\\\\n const value = item[column.key];\\\\n if (value == null) return false;\\\\n \\\\n return String(value).toLowerCase().includes(lowercasedFilter);\\\\n });\\\\n });\\\\n }, [data, filterValue, columns]);\\\\n\\\\n return { filteredData };\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// hooks/usePagination.ts\\\\nimport { useState, useMemo, useEffect } from 'react';\\\\n\\\\nexport function usePagination<T>(\\\\n data: T[], \\\\\\n initialRowsPerPage: number\\\\n) {\\\\n const [currentPage, setCurrentPage] = useState(1);\\\\n const [rowsPerPage, setRowsPerPage] = useState(initialRowsPerPage);\\\\n\\\\n // Reset to first page when data changes\\\\n useEffect(() => {\\\\n setCurrentPage(1);\\\\n }, [data.length]);\\\\n\\\\n const totalPages = useMemo(() => \\\\\\n Math.max(1, Math.ceil(data.length / rowsPerPage)),\\\\n [data.length, rowsPerPage]\\\\n );\\\\n\\\\n // Keep current page in bounds\\\\n useEffect(() => {\\\\n if (currentPage > totalPages) {\\\\n setCurrentPage(totalPages);\\\\n }\\\\n }, [currentPage, totalPages]);\\\\n\\\\n const currentPageData = useMemo(() => {\\\\n const startIndex = (currentPage - 1) * rowsPerPage;\\\\n return data.slice(startIndex, startIndex + rowsPerPage);\\\\n }, [data, currentPage, rowsPerPage]);\\\\n\\\\n return { \\\\\\n currentPageData, \\\\\\n currentPage, \\\\\\n totalPages, \\\\\\n rowsPerPage,\\\\n setCurrentPage, \\\\\\n setRowsPerPage \\\\n };\\\\n}\\\\n```\\\\n\\\\n## Supporting Components\\\\n\\\\n```typescript\\\\n// TableHeader.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { Column } from './DataTable';\\\\n\\\\nconst HeaderRow = styled.tr`\\\\n background-color: #f5f5f5;\\\\n border-bottom: 2px solid #ddd;\\\\n`;\\\\n\\\\nconst HeaderCell = styled.th<{ sortable: boolean }>`\\\\n padding: 12px 16px;\\\\n text-align: left;\\\\n font-weight: 600;\\\\n cursor: ${props => props.sortable ? 'pointer' : 'default'};\\\\n user-select: none;\\\\n position: relative;\\\\n`;\\\\n\\\\nconst SortIcon = styled.span<{ direction: 'asc' | 'desc' }>`\\\\n margin-left: 8px;\\\\n &:after {\\\\n content: '${props => props.direction === 'asc' ? '↑' : '↓'}';\\\\n font-size: 14px;\\\\n }\\\\n`;\\\\n\\\\ninterface TableHeaderProps<T> {\\\\n columns: Column<T>[];\\\\n sortKey?: string;\\\\n sortDirection: 'asc' | 'desc';\\\\n onSort: (key: string) => void;\\\\n}\\\\n\\\\nexport function TableHeader<T>({ \\\\\\n columns, \\\\\\n sortKey, \\\\\\n sortDirection, \\\\\\n onSort \\\\n}: TableHeaderProps<T>) {\\\\n return (\\\\n <thead>\\\\n <HeaderRow>\\\\n {columns.map(column => (\\\\n <HeaderCell \\\\\\n key={column.key} \\\\\\n sortable={!!column.sortable}\\\\\\n onClick={column.sortable ? () => onSort(column.key) : undefined}\\\\\\n >\\\\\\n {column.header}\\\\\\n {sortKey === column.key && (\\\\n <SortIcon direction={sortDirection} />\\\\n )}\\\\\\n </HeaderCell>\\\\n ))}\\\\\\n </HeaderRow>\\\\n </thead>\\\\n );\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// TableRow.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { Column } from './DataTable';\\\\n\\\\nconst Row = styled.tr<{ clickable: boolean }>`\\\\n cursor: ${props => props.clickable ? 'pointer' : 'default'};\\\\n`;\\\\n\\\\nconst Cell = styled.td`\\\\n padding: 12px 16px;\\\\n border-bottom: 1px solid #eee;\\\\n vertical-align: top;\\\\n`;\\\\n\\\\ninterface TableRowProps<T> {\\\\n item: T;\\\\n columns: Column<T>[];\\\\n onClick?: () => void;\\\\n}\\\\n\\\\nexport function TableRow<T>({ item, columns, onClick }: TableRowProps<T>) {\\\\n return (\\\\n <Row clickable={!!onClick} onClick={onClick}>\\\\\\n {columns.map(column => (\\\\n <Cell key={column.key}>\\\\\\n {column.renderCell ? column.renderCell(item) : String(item[column.key] ?? '')}\\\\\\n </Cell>\\\\n ))}\\\\\\n </Row>\\\\n );\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// Pagination.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\n\\\\nconst PaginationContainer = styled.div`\\\\n display: flex;\\\\n justify-content: space-between;\\\\n align-items: center;\\\\n margin-top: 16px;\\\\n font-size: 14px;\\\\n`;\\\\n\\\\nconst PageInfo = styled.div`\\\\n color: #666;\\\\n`;\\\\n\\\\nconst PageControls = styled.div`\\\\n display: flex;\\\\n align-items: center;\\\\n`;\\\\n\\\\nconst PageButton = styled.button<{ active?: boolean }>`\\\\n padding: 6px 12px;\\\\n margin: 0 4px;\\\\n background-color: ${props => props.active ? '#007bff' : 'white'};\\\\n color: ${props => props.active ? 'white' : '#333'};\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n cursor: pointer;\\\\n \\\\n &:disabled {\\\\n opacity: 0.5;\\\\n cursor: not-allowed;\\\\n }\\\\n \\\\n &:hover:not(:disabled) {\\\\n background-color: ${props => props.active ? '#007bff' : '#f1f1f1'};\\\\n }\\\\n`;\\\\n\\\\nconst RowsPerPageSelect = styled.select`\\\\n padding: 6px 8px;\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n margin-left: 8px;\\\\n`;\\\\n\\\\ninterface PaginationProps {\\\\n currentPage: number;\\\\n totalPages: number;\\\\n rowsPerPage: number;\\\\n rowsPerPageOptions: number[];\\\\n totalItems: number;\\\\n onPageChange: (page: number) => void;\\\\n onRowsPerPageChange: (rowsPerPage: number) => void;\\\\n}\\\\n\\\\nexport function Pagination({ \\\\\\n currentPage, \\\\\\n totalPages, \\\\\\n rowsPerPage, \\\\\\n rowsPerPageOptions, \\\\\\n totalItems,\\\\n onPageChange, \\\\\\n onRowsPerPageChange \\\\n}: PaginationProps) {\\\\n // Calculate start and end item numbers\\\\n const startItem = Math.min(totalItems, (currentPage - 1) * rowsPerPage + 1);\\\\n const endItem = Math.min(totalItems, startItem + rowsPerPage - 1);\\\\n \\\\n // Generate page buttons\\\\n const getPageButtons = () => {\\\\n const buttons = [];\\\\n \\\\n // Always show first page\\\\n buttons.push(\\\\n <PageButton \\\\\\n key=\\\\\\\"first\\\\\\\" \\\\\\n active={currentPage === 1}\\\\\\n onClick={() => onPageChange(1)}\\\\\\n disabled={currentPage === 1}\\\\\\n >\\\\\\n 1\\\\\\n </PageButton>\\\\n );\\\\n \\\\n // Show ellipsis if needed\\\\n if (currentPage > 3) {\\\\n buttons.push(<span key=\\\\\\\"ellipsis1\\\\\\\">...</span>);\\\\n }\\\\n \\\\n // Show pages around current page\\\\n for (let i = Math.max(2, currentPage - 1); i <= Math.min(totalPages - 1, currentPage + 1); i++) {\\\\n buttons.push(\\\\n <PageButton \\\\\\n key={i} \\\\\\n active={currentPage === i}\\\\\\n onClick={() => onPageChange(i)}\\\\\\n >\\\\\\n {i}\\\\\\n </PageButton>\\\\n );\\\\n }\\\\n \\\\n // Show ellipsis if needed\\\\n if (currentPage < totalPages - 2) {\\\\n buttons.push(<span key=\\\\\\\"ellipsis2\\\\\\\">...</span>);\\\\n }\\\\n \\\\n // Always show last page if there's more than one page\\\\n if (totalPages > 1) {\\\\n buttons.push(\\\\n <PageButton \\\\\\n key=\\\\\\\"last\\\\\\\" \\\\\\n active={currentPage === totalPages}\\\\\\n onClick={() => onPageChange(totalPages)}\\\\\\n disabled={currentPage === totalPages}\\\\\\n >\\\\\\n {totalPages}\\\\\\n </PageButton>\\\\n );\\\\n }\\\\n \\\\n return buttons;\\\\n };\\\\n\\\\n return (\\\\n <PaginationContainer>\\\\n <PageInfo>\\\\n Showing {totalItems ? `${startItem}-${endItem} of ${totalItems}` : '0'} results\\\\n </PageInfo>\\\\n \\\\n <PageControls>\\\\n <PageButton \\\\\\n onClick={() => onPageChange(currentPage - 1)}\\\\\\n disabled={currentPage === 1}\\\\\\n >\\\\\\n Previous\\\\\\n </PageButton>\\\\n \\\\\\n {getPageButtons()}\\\\\\n \\\\\\n <PageButton \\\\\\n onClick={() => onPageChange(currentPage + 1)}\\\\\\n disabled={currentPage === totalPages}\\\\\\n >\\\\\\n Next\\\\\\n </PageButton>\\\\n \\\\\\n <span style={{ marginLeft: '16px' }}>Rows per page:</span>\\\\\\n <RowsPerPageSelect \\\\\\n value={rowsPerPage}\\\\\\n onChange={(e) => onRowsPerPageChange(Number(e.target.value))}\\\\\\n >\\\\\\n {rowsPerPageOptions.map(option => (\\\\n <option key={option} value={option}>{option}</option>\\\\n ))}\\\\\\n </RowsPerPageSelect>\\\\\\n </PageControls>\\\\\\n </PaginationContainer>\\\\n );\\\\n}\\\\n```\\\\n\\\\n## Usage Example\\\\n\\\\n```tsx\\\\nimport React from 'react';\\\\nimport { DataTable } from './components/DataTable';\\\\n\\\\ninterface User {\\\\n id: number;\\\\n name: string;\\\\n email: string;\\\\n role: string;\\\\n status: 'active' | 'inactive';\\\\n lastLogin: string;\\\\n}\\\\n\\\\nconst users: User[] = [\\\\n { id: 1, name: 'John Doe', email: '[email protected]', role: 'Admin', status: 'active', lastLogin: '2023-05-15T10:30:00Z' },\\\\n { id: 2, name: 'Jane Smith', email: '[email protected]', role: 'Editor', status: 'active', lastLogin: '2023-05-14T09:15:00Z' },\\\\n // Add more users as needed\\\\n];\\\\n\\\\nfunction UserTable() {\\\\n const columns = [\\\\n { key: 'id', header: 'ID', sortable: true },\\\\n { key: 'name', header: 'Name', sortable: true, filterable: true },\\\\n { key: 'email', header: 'Email', filterable: true },\\\\n { key: 'role', header: 'Role', sortable: true, filterable: true },\\\\n { \\\\\\n key: 'status', \\\\\\n header: 'Status', \\\\\\n sortable: true,\\\\\\n renderCell: (user: User) => (\\\\n <span style={{ \\\\\\n color: user.status === 'active' ? 'green' : 'red',\\\\\\n fontWeight: 'bold'\\\\\\n }}>\\\\\\n {user.status}\\\\\\n </span>\\\\n )\\\\n },\\\\n { \\\\\\n key: 'lastLogin', \\\\\\n header: 'Last Login', \\\\\\n sortable: true,\\\\\\n renderCell: (user: User) => new Date(user.lastLogin).toLocaleString()\\\\n },\\\\n ];\\\\n\\\\n const handleRowClick = (user: User) => {\\\\n console.log('User clicked:', user);\\\\n // Navigate to user detail page or show modal\\\\n };\\\\n\\\\n return (\\\\n <div>\\\\n <h1>User Management</h1>\\\\n <DataTable \\\\\\n data={users}\\\\\\n columns={columns}\\\\\\n initialSortKey=\\\\\\\"id\\\\\\\"\\\\\\n initialRowsPerPage={10}\\\\\\n rowsPerPageOptions={[5, 10, 25, 50]}\\\\\\n onRowClick={handleRowClick}\\\\\\n />\\\\n </div>\\\\n );\\\\n}\\\\n\\\\nexport default UserTable;\\\\n```\\\\n\\\\n## Installation Instructions\\\\n\\\\nTo use this component, you'll need to have these dependencies installed:\\\\n\\\\n```bash\\\\nnpm install styled-components @types/styled-components\\\\n```\\\\n\\\\nor\\\\n\\\\n```bash\\\\nyarn add styled-components @types/styled-components\\\\n```\\\\n\\\\n## MCP Resources Used\\\\n\\\\n- `@file:///project/src/components/` - Examined your existing component structure to match the styling approach and component patterns\\\\n- `@memory://coding-preferences` - Retrieved your preference for functional components, React 18, and TypeScript\\\\n\\\\nThe component follows modern React best practices with proper TypeScript typing, modular structure, and optimized performance through memoization. The styled-components implementation ensures consistent styling that can be customized to match your application's design system.\\\"\\n }\\n ],\\n \\\"metadata\\\": {\\n \\\"created_at\\\": \\\"2023-05-15T12:00:00Z\\\",\\n \\\"updated_at\\\": \\\"2023-05-15T12:00:00Z\\\",\\n \\\"author\\\": \\\"MCP-Prompts Team\\\",\\n \\\"category\\\": \\\"development\\\",\\n \\\"mcp_requirements\\\": [\\n \\\"MCP Filesystem Server\\\",\\n \\\"MCP GitHub Server\\\",\\n \\\"MCP Sequential Thinking Server\\\",\\n \\\"MCP Memory Server"
6 | }
```
--------------------------------------------------------------------------------
/src/mcp_project_orchestrator/prompts/mcp-code-generator.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "name": "mcp-code-generator",
3 | "description": "An advanced code generation prompt that leverages multiple MCP resources to create contextually-aware, high-quality code with minimal hallucination.",
4 | "type": "prompt",
5 | "category": "other",
6 | "content": " \\\"mcp-code-generator\\\",\\n \\\"version\\\": \\\"1.0.0\\\",\\n \\\"description\\\": \\\"An advanced code generation prompt that leverages multiple MCP resources to create contextually-aware, high-quality code with minimal hallucination.\\\",\\n \\\"prompt_text\\\": \\\"# MCP-Powered Code Generator\\\\n\\\\nYou are an expert coding assistant with access to multiple MCP resources. Your task is to generate high-quality, contextually-appropriate code based on the user's requirements while leveraging the following MCP resources to reduce hallucination and improve accuracy:\\\\n\\\\n- **Filesystem** (@file:// URIs): Access to project files and directory structure\\\\n- **GitHub** (@github:// URIs): Access to repositories, code examples, and documentation\\\\n- **Sequential Thinking** (@thinking:// URIs): Step-by-step reasoning for complex algorithms\\\\n- **Memory** (@memory:// URIs): Previous code snippets and user preferences\\\\n\\\\n## Code Generation Process\\\\n\\\\n1. **Analyze Requirements**\\\\n - Break down the user's request into specific coding tasks\\\\n - Identify key functionalities, interfaces, and constraints\\\\n - Determine appropriate language, framework, or library to use\\\\n\\\\n2. **Resource Collection**\\\\n - Check current project structure (if available): `@file:///project`\\\\n - Find related examples on GitHub: `@github://relevant-repos`\\\\n - Retrieve user preferences if available: `@memory://coding-preferences`\\\\n\\\\n3. **Design Phase**\\\\n - Create a high-level design outline\\\\n - Determine classes, functions, or components needed\\\\n - Establish interfaces and relationships\\\\n\\\\n4. **Implementation Phase**\\\\n - Write clean, well-documented code that follows best practices\\\\n - Include proper error handling and edge cases\\\\n - Ensure compatibility with existing codebase (if applicable)\\\\n - Add appropriate comments and documentation\\\\n\\\\n5. **Testing Considerations**\\\\n - Include unit test examples or strategies when appropriate\\\\n - Consider edge cases and potential failures\\\\n - Provide sample usage examples\\\\n\\\\n## Code Quality Guidelines\\\\n\\\\n- **Readability**: Write clear, self-explanatory code with consistent formatting\\\\n- **Maintainability**: Use descriptive variable names and follow language conventions\\\\n- **Performance**: Consider algorithmic efficiency and resource usage\\\\n- **Security**: Follow security best practices and avoid common vulnerabilities\\\\n- **Reusability**: Create modular, reusable components when appropriate\\\\n\\\\n## Output Format\\\\n\\\\nYour response should include:\\\\n\\\\n1. A brief explanation of the approach taken\\\\n2. The generated code in properly formatted code blocks\\\\n3. Installation instructions or dependencies (if applicable)\\\\n4. Usage examples\\\\n5. References to any MCP resources used\\\\n\\\\n## Contextual Adaptation\\\\n\\\\nTailor your code generation based on:\\\\n\\\\n- The programming language specified or inferred from context\\\\n- The user's preferred coding style (if known)\\\\n- The complexity level appropriate for the task\\\\n- The target environment (web, mobile, desktop, server, etc.)\\\\n\\\\n{{code_requirements}}\\\\n\\\\n{{additional_context}}\\\",\\n \\\"variables\\\": [\\n \\\"code_requirements\\\",\\n \\\"additional_context\\\"\\n ],\\n \\\"tags\\\": [\\n \\\"code-generation\\\",\\n \\\"multi-resource\\\",\\n \\\"mcp-integration\\\",\\n \\\"development\\\",\\n \\\"programming\\\"\\n ],\\n \\\"examples\\\": [\\n {\\n \\\"name\\\": \\\"React Component Generator\\\",\\n \\\"variables\\\": {\\n \\\"code_requirements\\\": \\\"Create a React component for a customizable data table with sorting, filtering, and pagination capabilities. The component should be reusable across our application.\\\",\\n \\\"additional_context\\\": \\\"Our project uses TypeScript, React 18, and follows a functional component approach with hooks. We prefer using styled-components for styling. The existing component structure can be found at @file:///project/src/components/.\\\"\\n },\\n \\\"expected_response\\\": \\\"# Customizable Data Table Component\\\\n\\\\nI'll create a reusable React component for a data table with sorting, filtering, and pagination capabilities, following your project's TypeScript and React 18 standards with styled-components for styling.\\\\n\\\\n## Approach\\\\n\\\\nAfter examining your project structure at `@file:///project/src/components/`, I notice you're using a functional component pattern with hooks. I'll create:\\\\n\\\\n1. A main `DataTable` component that handles the core functionality\\\\n2. Several sub-components for table elements (header, row, cell, pagination)\\\\n3. Custom hooks for sorting, filtering, and pagination logic\\\\n4. TypeScript interfaces for strong typing\\\\n\\\\n## Component Structure\\\\n\\\\n```typescript\\\\n// DataTable.tsx\\\\nimport React, { useState, useMemo, useCallback } from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { TableHeader } from './TableHeader';\\\\nimport { TableRow } from './TableRow';\\\\nimport { Pagination } from './Pagination';\\\\nimport { useSort } from '../hooks/useSort';\\\\nimport { useFilter } from '../hooks/useFilter';\\\\nimport { usePagination } from '../hooks/usePagination';\\\\n\\\\n// TypeScript interfaces\\\\nexport interface Column<T> {\\\\n key: string;\\\\n header: string;\\\\n renderCell?: (item: T) => React.ReactNode;\\\\n sortable?: boolean;\\\\n filterable?: boolean;\\\\n}\\\\n\\\\nexport interface DataTableProps<T> {\\\\n data: T[];\\\\n columns: Column<T>[];\\\\n initialSortKey?: string;\\\\n initialSortDirection?: 'asc' | 'desc';\\\\n rowsPerPageOptions?: number[];\\\\n initialRowsPerPage?: number;\\\\n onRowClick?: (item: T) => void;\\\\n className?: string;\\\\n}\\\\n\\\\n// Styled components\\\\nconst TableContainer = styled.div`\\\\n width: 100%;\\\\n overflow-x: auto;\\\\n border-radius: 4px;\\\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\\\\n`;\\\\n\\\\nconst Table = styled.table`\\\\n width: 100%;\\\\n border-collapse: collapse;\\\\n font-size: 14px;\\\\n`;\\\\n\\\\nconst TableBody = styled.tbody`\\\\n & tr:nth-child(odd) {\\\\n background-color: #f9f9f9;\\\\n }\\\\n \\\\n & tr:hover {\\\\n background-color: #f1f1f1;\\\\n }\\\\n`;\\\\n\\\\nconst FilterContainer = styled.div`\\\\n margin-bottom: 16px;\\\\n display: flex;\\\\n justify-content: flex-end;\\\\n`;\\\\n\\\\nconst FilterInput = styled.input`\\\\n padding: 8px 12px;\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n font-size: 14px;\\\\n width: 250px;\\\\n`;\\\\n\\\\n// Main component\\\\nexport function DataTable<T extends Record<string, any>>({ \\\\n data, \\\\n columns, \\\\n initialSortKey,\\\\n initialSortDirection = 'asc',\\\\n rowsPerPageOptions = [10, 25, 50],\\\\n initialRowsPerPage = 10,\\\\n onRowClick,\\\\n className\\\\n}: DataTableProps<T>) {\\\\n // Global filter state\\\\n const [filterValue, setFilterValue] = useState('');\\\\n \\\\n // Hook usage\\\\n const { sortedData, sortKey, sortDirection, handleSort } = useSort(data, initialSortKey, initialSortDirection);\\\\n const { filteredData } = useFilter(sortedData, filterValue, columns);\\\\n const { \\\\n currentPageData, \\\\n currentPage, \\\\n totalPages, \\\\n rowsPerPage,\\\\n setCurrentPage, \\\\n setRowsPerPage \\\\n } = usePagination(filteredData, initialRowsPerPage);\\\\n\\\\n // Filter change handler\\\\n const handleFilterChange = useCallback(\\\\n (e: React.ChangeEvent<HTMLInputElement>) => {\\\\n setFilterValue(e.target.value);\\\\n setCurrentPage(1); // Reset to first page when filtering\\\\n }, \\\\n [setCurrentPage]\\\\n );\\\\n\\\\n // Memoize filterable columns\\\\n const filterableColumns = useMemo(\\\\n () => columns.filter(column => column.filterable),\\\\n [columns]\\\\n );\\\\n\\\\n return (\\\\n <div className={className}>\\\\n {filterableColumns.length > 0 && (\\\\n <FilterContainer>\\\\n <FilterInput \\\\\\n type=\\\\\\\"text\\\\\\\" \\\\\\n placeholder=\\\\\\\"Filter table...\\\\\\\"\\\\\\n value={filterValue}\\\\\\n onChange={handleFilterChange}\\\\\\n />\\\\\\n </FilterContainer>\\\\\\n )}\\\\\\n \\\\\\n <TableContainer>\\\\\\n <Table>\\\\\\n <TableHeader \\\\\\n columns={columns} \\\\\\n sortKey={sortKey} \\\\\\n sortDirection={sortDirection} \\\\\\n onSort={handleSort} \\\\\\n />\\\\\\n <TableBody>\\\\\\n {currentPageData.map((item, index) => (\\\\\\n <TableRow \\\\\\n key={index} \\\\\\n item={item} \\\\\\n columns={columns} \\\\\\n onClick={onRowClick ? () => onRowClick(item) : undefined} \\\\\\n />\\\\\\n ))}\\\\\\n {currentPageData.length === 0 && (\\\\\\n <tr>\\\\\\n <td colSpan={columns.length} style={{ textAlign: 'center', padding: '16px' }}>\\\\\\n No records found\\\\\\n </td>\\\\\\n </tr>\\\\\\n )}\\\\\\n </TableBody>\\\\\\n </Table>\\\\\\n </TableContainer>\\\\\\n \\\\\\n <Pagination \\\\\\n currentPage={currentPage}\\\\\\n totalPages={totalPages}\\\\\\n rowsPerPage={rowsPerPage}\\\\\\n rowsPerPageOptions={rowsPerPageOptions}\\\\\\n onPageChange={setCurrentPage}\\\\\\n onRowsPerPageChange={setRowsPerPage}\\\\\\n totalItems={filteredData.length}\\\\\\n />\\\\\\n </div>\\\\\\n );\\\\\\n}\\\\n```\\\\n\\\\n## Custom Hooks Implementation\\\\n\\\\n```typescript\\\\n// hooks/useSort.ts\\\\nimport { useState, useMemo } from 'react';\\\\n\\\\nexport function useSort<T extends Record<string, any>>(\\\\n data: T[], \\\\\\n initialSortKey?: string, \\\\\\n initialSortDirection: 'asc' | 'desc' = 'asc'\\\\n) {\\\\n const [sortKey, setSortKey] = useState<string | undefined>(initialSortKey);\\\\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>(initialSortDirection);\\\\n\\\\n const handleSort = (key: string) => {\\\\n if (sortKey === key) {\\\\n // Toggle direction if already sorting by this key\\\\n setSortDirection(prev => prev === 'asc' ? 'desc' : 'asc');\\\\n } else {\\\\n // New sort key, set to ascending by default\\\\n setSortKey(key);\\\\n setSortDirection('asc');\\\\n }\\\\n };\\\\n\\\\n const sortedData = useMemo(() => {\\\\n if (!sortKey) return [...data];\\\\n\\\\n return [...data].sort((a, b) => {\\\\n const aValue = a[sortKey];\\\\n const bValue = b[sortKey];\\\\n\\\\n // Handle different data types\\\\n if (typeof aValue === 'string' && typeof bValue === 'string') {\\\\n return sortDirection === 'asc' \\\\\\n ? aValue.localeCompare(bValue) \\\\\\n : bValue.localeCompare(aValue);\\\\n }\\\\n\\\\n if (aValue === bValue) return 0;\\\\n \\\\n if (sortDirection === 'asc') {\\\\n return aValue > bValue ? 1 : -1;\\\\n } else {\\\\n return aValue < bValue ? 1 : -1;\\\\n }\\\\n });\\\\n }, [data, sortKey, sortDirection]);\\\\n\\\\n return { sortedData, sortKey, sortDirection, handleSort };\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// hooks/useFilter.ts\\\\nimport { useMemo } from 'react';\\\\nimport { Column } from '../components/DataTable';\\\\n\\\\nexport function useFilter<T extends Record<string, any>>(\\\\n data: T[], \\\\\\n filterValue: string,\\\\n columns: Column<T>[]\\\\n) {\\\\n const filteredData = useMemo(() => {\\\\n if (!filterValue) return data;\\\\n \\\\n const lowercasedFilter = filterValue.toLowerCase();\\\\n \\\\n return data.filter(item => {\\\\n return columns.some(column => {\\\\n const value = item[column.key];\\\\n if (value == null) return false;\\\\n \\\\n return String(value).toLowerCase().includes(lowercasedFilter);\\\\n });\\\\n });\\\\n }, [data, filterValue, columns]);\\\\n\\\\n return { filteredData };\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// hooks/usePagination.ts\\\\nimport { useState, useMemo, useEffect } from 'react';\\\\n\\\\nexport function usePagination<T>(\\\\n data: T[], \\\\\\n initialRowsPerPage: number\\\\n) {\\\\n const [currentPage, setCurrentPage] = useState(1);\\\\n const [rowsPerPage, setRowsPerPage] = useState(initialRowsPerPage);\\\\n\\\\n // Reset to first page when data changes\\\\n useEffect(() => {\\\\n setCurrentPage(1);\\\\n }, [data.length]);\\\\n\\\\n const totalPages = useMemo(() => \\\\\\n Math.max(1, Math.ceil(data.length / rowsPerPage)),\\\\n [data.length, rowsPerPage]\\\\n );\\\\n\\\\n // Keep current page in bounds\\\\n useEffect(() => {\\\\n if (currentPage > totalPages) {\\\\n setCurrentPage(totalPages);\\\\n }\\\\n }, [currentPage, totalPages]);\\\\n\\\\n const currentPageData = useMemo(() => {\\\\n const startIndex = (currentPage - 1) * rowsPerPage;\\\\n return data.slice(startIndex, startIndex + rowsPerPage);\\\\n }, [data, currentPage, rowsPerPage]);\\\\n\\\\n return { \\\\\\n currentPageData, \\\\\\n currentPage, \\\\\\n totalPages, \\\\\\n rowsPerPage,\\\\n setCurrentPage, \\\\\\n setRowsPerPage \\\\n };\\\\n}\\\\n```\\\\n\\\\n## Supporting Components\\\\n\\\\n```typescript\\\\n// TableHeader.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { Column } from './DataTable';\\\\n\\\\nconst HeaderRow = styled.tr`\\\\n background-color: #f5f5f5;\\\\n border-bottom: 2px solid #ddd;\\\\n`;\\\\n\\\\nconst HeaderCell = styled.th<{ sortable: boolean }>`\\\\n padding: 12px 16px;\\\\n text-align: left;\\\\n font-weight: 600;\\\\n cursor: ${props => props.sortable ? 'pointer' : 'default'};\\\\n user-select: none;\\\\n position: relative;\\\\n`;\\\\n\\\\nconst SortIcon = styled.span<{ direction: 'asc' | 'desc' }>`\\\\n margin-left: 8px;\\\\n &:after {\\\\n content: '${props => props.direction === 'asc' ? '\u2191' : '\u2193'}';\\\\n font-size: 14px;\\\\n }\\\\n`;\\\\n\\\\ninterface TableHeaderProps<T> {\\\\n columns: Column<T>[];\\\\n sortKey?: string;\\\\n sortDirection: 'asc' | 'desc';\\\\n onSort: (key: string) => void;\\\\n}\\\\n\\\\nexport function TableHeader<T>({ \\\\\\n columns, \\\\\\n sortKey, \\\\\\n sortDirection, \\\\\\n onSort \\\\n}: TableHeaderProps<T>) {\\\\n return (\\\\n <thead>\\\\n <HeaderRow>\\\\n {columns.map(column => (\\\\n <HeaderCell \\\\\\n key={column.key} \\\\\\n sortable={!!column.sortable}\\\\\\n onClick={column.sortable ? () => onSort(column.key) : undefined}\\\\\\n >\\\\\\n {column.header}\\\\\\n {sortKey === column.key && (\\\\n <SortIcon direction={sortDirection} />\\\\n )}\\\\\\n </HeaderCell>\\\\n ))}\\\\\\n </HeaderRow>\\\\n </thead>\\\\n );\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// TableRow.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\nimport { Column } from './DataTable';\\\\n\\\\nconst Row = styled.tr<{ clickable: boolean }>`\\\\n cursor: ${props => props.clickable ? 'pointer' : 'default'};\\\\n`;\\\\n\\\\nconst Cell = styled.td`\\\\n padding: 12px 16px;\\\\n border-bottom: 1px solid #eee;\\\\n vertical-align: top;\\\\n`;\\\\n\\\\ninterface TableRowProps<T> {\\\\n item: T;\\\\n columns: Column<T>[];\\\\n onClick?: () => void;\\\\n}\\\\n\\\\nexport function TableRow<T>({ item, columns, onClick }: TableRowProps<T>) {\\\\n return (\\\\n <Row clickable={!!onClick} onClick={onClick}>\\\\\\n {columns.map(column => (\\\\n <Cell key={column.key}>\\\\\\n {column.renderCell ? column.renderCell(item) : String(item[column.key] ?? '')}\\\\\\n </Cell>\\\\n ))}\\\\\\n </Row>\\\\n );\\\\n}\\\\n```\\\\n\\\\n```typescript\\\\n// Pagination.tsx\\\\nimport React from 'react';\\\\nimport styled from 'styled-components';\\\\n\\\\nconst PaginationContainer = styled.div`\\\\n display: flex;\\\\n justify-content: space-between;\\\\n align-items: center;\\\\n margin-top: 16px;\\\\n font-size: 14px;\\\\n`;\\\\n\\\\nconst PageInfo = styled.div`\\\\n color: #666;\\\\n`;\\\\n\\\\nconst PageControls = styled.div`\\\\n display: flex;\\\\n align-items: center;\\\\n`;\\\\n\\\\nconst PageButton = styled.button<{ active?: boolean }>`\\\\n padding: 6px 12px;\\\\n margin: 0 4px;\\\\n background-color: ${props => props.active ? '#007bff' : 'white'};\\\\n color: ${props => props.active ? 'white' : '#333'};\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n cursor: pointer;\\\\n \\\\n &:disabled {\\\\n opacity: 0.5;\\\\n cursor: not-allowed;\\\\n }\\\\n \\\\n &:hover:not(:disabled) {\\\\n background-color: ${props => props.active ? '#007bff' : '#f1f1f1'};\\\\n }\\\\n`;\\\\n\\\\nconst RowsPerPageSelect = styled.select`\\\\n padding: 6px 8px;\\\\n border: 1px solid #ddd;\\\\n border-radius: 4px;\\\\n margin-left: 8px;\\\\n`;\\\\n\\\\ninterface PaginationProps {\\\\n currentPage: number;\\\\n totalPages: number;\\\\n rowsPerPage: number;\\\\n rowsPerPageOptions: number[];\\\\n totalItems: number;\\\\n onPageChange: (page: number) => void;\\\\n onRowsPerPageChange: (rowsPerPage: number) => void;\\\\n}\\\\n\\\\nexport function Pagination({ \\\\\\n currentPage, \\\\\\n totalPages, \\\\\\n rowsPerPage, \\\\\\n rowsPerPageOptions, \\\\\\n totalItems,\\\\n onPageChange, \\\\\\n onRowsPerPageChange \\\\n}: PaginationProps) {\\\\n // Calculate start and end item numbers\\\\n const startItem = Math.min(totalItems, (currentPage - 1) * rowsPerPage + 1);\\\\n const endItem = Math.min(totalItems, startItem + rowsPerPage - 1);\\\\n \\\\n // Generate page buttons\\\\n const getPageButtons = () => {\\\\n const buttons = [];\\\\n \\\\n // Always show first page\\\\n buttons.push(\\\\n <PageButton \\\\\\n key=\\\\\\\"first\\\\\\\" \\\\\\n active={currentPage === 1}\\\\\\n onClick={() => onPageChange(1)}\\\\\\n disabled={currentPage === 1}\\\\\\n >\\\\\\n 1\\\\\\n </PageButton>\\\\n );\\\\n \\\\n // Show ellipsis if needed\\\\n if (currentPage > 3) {\\\\n buttons.push(<span key=\\\\\\\"ellipsis1\\\\\\\">...</span>);\\\\n }\\\\n \\\\n // Show pages around current page\\\\n for (let i = Math.max(2, currentPage - 1); i <= Math.min(totalPages - 1, currentPage + 1); i++) {\\\\n buttons.push(\\\\n <PageButton \\\\\\n key={i} \\\\\\n active={currentPage === i}\\\\\\n onClick={() => onPageChange(i)}\\\\\\n >\\\\\\n {i}\\\\\\n </PageButton>\\\\n );\\\\n }\\\\n \\\\n // Show ellipsis if needed\\\\n if (currentPage < totalPages - 2) {\\\\n buttons.push(<span key=\\\\\\\"ellipsis2\\\\\\\">...</span>);\\\\n }\\\\n \\\\n // Always show last page if there's more than one page\\\\n if (totalPages > 1) {\\\\n buttons.push(\\\\n <PageButton \\\\\\n key=\\\\\\\"last\\\\\\\" \\\\\\n active={currentPage === totalPages}\\\\\\n onClick={() => onPageChange(totalPages)}\\\\\\n disabled={currentPage === totalPages}\\\\\\n >\\\\\\n {totalPages}\\\\\\n </PageButton>\\\\n );\\\\n }\\\\n \\\\n return buttons;\\\\n };\\\\n\\\\n return (\\\\n <PaginationContainer>\\\\n <PageInfo>\\\\n Showing {totalItems ? `${startItem}-${endItem} of ${totalItems}` : '0'} results\\\\n </PageInfo>\\\\n \\\\n <PageControls>\\\\n <PageButton \\\\\\n onClick={() => onPageChange(currentPage - 1)}\\\\\\n disabled={currentPage === 1}\\\\\\n >\\\\\\n Previous\\\\\\n </PageButton>\\\\n \\\\\\n {getPageButtons()}\\\\\\n \\\\\\n <PageButton \\\\\\n onClick={() => onPageChange(currentPage + 1)}\\\\\\n disabled={currentPage === totalPages}\\\\\\n >\\\\\\n Next\\\\\\n </PageButton>\\\\n \\\\\\n <span style={{ marginLeft: '16px' }}>Rows per page:</span>\\\\\\n <RowsPerPageSelect \\\\\\n value={rowsPerPage}\\\\\\n onChange={(e) => onRowsPerPageChange(Number(e.target.value))}\\\\\\n >\\\\\\n {rowsPerPageOptions.map(option => (\\\\n <option key={option} value={option}>{option}</option>\\\\n ))}\\\\\\n </RowsPerPageSelect>\\\\\\n </PageControls>\\\\\\n </PaginationContainer>\\\\n );\\\\n}\\\\n```\\\\n\\\\n## Usage Example\\\\n\\\\n```tsx\\\\nimport React from 'react';\\\\nimport { DataTable } from './components/DataTable';\\\\n\\\\ninterface User {\\\\n id: number;\\\\n name: string;\\\\n email: string;\\\\n role: string;\\\\n status: 'active' | 'inactive';\\\\n lastLogin: string;\\\\n}\\\\n\\\\nconst users: User[] = [\\\\n { id: 1, name: 'John Doe', email: '[email protected]', role: 'Admin', status: 'active', lastLogin: '2023-05-15T10:30:00Z' },\\\\n { id: 2, name: 'Jane Smith', email: '[email protected]', role: 'Editor', status: 'active', lastLogin: '2023-05-14T09:15:00Z' },\\\\n // Add more users as needed\\\\n];\\\\n\\\\nfunction UserTable() {\\\\n const columns = [\\\\n { key: 'id', header: 'ID', sortable: true },\\\\n { key: 'name', header: 'Name', sortable: true, filterable: true },\\\\n { key: 'email', header: 'Email', filterable: true },\\\\n { key: 'role', header: 'Role', sortable: true, filterable: true },\\\\n { \\\\\\n key: 'status', \\\\\\n header: 'Status', \\\\\\n sortable: true,\\\\\\n renderCell: (user: User) => (\\\\n <span style={{ \\\\\\n color: user.status === 'active' ? 'green' : 'red',\\\\\\n fontWeight: 'bold'\\\\\\n }}>\\\\\\n {user.status}\\\\\\n </span>\\\\n )\\\\n },\\\\n { \\\\\\n key: 'lastLogin', \\\\\\n header: 'Last Login', \\\\\\n sortable: true,\\\\\\n renderCell: (user: User) => new Date(user.lastLogin).toLocaleString()\\\\n },\\\\n ];\\\\n\\\\n const handleRowClick = (user: User) => {\\\\n console.log('User clicked:', user);\\\\n // Navigate to user detail page or show modal\\\\n };\\\\n\\\\n return (\\\\n <div>\\\\n <h1>User Management</h1>\\\\n <DataTable \\\\\\n data={users}\\\\\\n columns={columns}\\\\\\n initialSortKey=\\\\\\\"id\\\\\\\"\\\\\\n initialRowsPerPage={10}\\\\\\n rowsPerPageOptions={[5, 10, 25, 50]}\\\\\\n onRowClick={handleRowClick}\\\\\\n />\\\\n </div>\\\\n );\\\\n}\\\\n\\\\nexport default UserTable;\\\\n```\\\\n\\\\n## Installation Instructions\\\\n\\\\nTo use this component, you'll need to have these dependencies installed:\\\\n\\\\n```bash\\\\nnpm install styled-components @types/styled-components\\\\n```\\\\n\\\\nor\\\\n\\\\n```bash\\\\nyarn add styled-components @types/styled-components\\\\n```\\\\n\\\\n## MCP Resources Used\\\\n\\\\n- `@file:///project/src/components/` - Examined your existing component structure to match the styling approach and component patterns\\\\n- `@memory://coding-preferences` - Retrieved your preference for functional components, React 18, and TypeScript\\\\n\\\\nThe component follows modern React best practices with proper TypeScript typing, modular structure, and optimized performance through memoization. The styled-components implementation ensures consistent styling that can be customized to match your application's design system.\\\"\\n }\\n ],\\n \\\"metadata\\\": {\\n \\\"created_at\\\": \\\"2023-05-15T12:00:00Z\\\",\\n \\\"updated_at\\\": \\\"2023-05-15T12:00:00Z\\\",\\n \\\"author\\\": \\\"MCP-Prompts Team\\\",\\n \\\"category\\\": \\\"development\\\",\\n \\\"mcp_requirements\\\": [\\n \\\"MCP Filesystem Server\\\",\\n \\\"MCP GitHub Server\\\",\\n \\\"MCP Sequential Thinking Server\\\",\\n \\\"MCP Memory Server",
7 | "variables": {},
8 | "metadata": {
9 | "source": "/home/sparrow/projects/mcp-prompts/prompts/mcp-code-generator.json",
10 | "imported": true
11 | }
12 | }
```