workspace-architect 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +1 -0
- package/.gitattributes +1 -0
- package/.github/workflows/manual-publish.yml +36 -0
- package/.github/workflows/sync-and-publish.yml +58 -0
- package/.release-it.json +20 -0
- package/CHANGELOG.md +43 -0
- package/README.md +62 -0
- package/assets/chatmodes/4.1-Beast.chatmode.md +152 -0
- package/assets/chatmodes/Thinking-Beast-Mode.chatmode.md +337 -0
- package/assets/chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md +644 -0
- package/assets/chatmodes/accessibility.chatmode.md +298 -0
- package/assets/chatmodes/address-comments.chatmode.md +59 -0
- package/assets/chatmodes/aem-frontend-specialist.chatmode.md +385 -0
- package/assets/chatmodes/api-architect.chatmode.md +40 -0
- package/assets/chatmodes/atlassian-requirements-to-jira.chatmode.md +444 -0
- package/assets/chatmodes/azure-logic-apps-expert.chatmode.md +100 -0
- package/assets/chatmodes/azure-principal-architect.chatmode.md +58 -0
- package/assets/chatmodes/azure-saas-architect.chatmode.md +118 -0
- package/assets/chatmodes/azure-verified-modules-bicep.chatmode.md +44 -0
- package/assets/chatmodes/azure-verified-modules-terraform.chatmode.md +58 -0
- package/assets/chatmodes/bicep-implement.chatmode.md +40 -0
- package/assets/chatmodes/bicep-plan.chatmode.md +112 -0
- package/assets/chatmodes/blueprint-mode-codex.chatmode.md +110 -0
- package/assets/chatmodes/blueprint-mode.chatmode.md +171 -0
- package/assets/chatmodes/clojure-interactive-programming.chatmode.md +174 -0
- package/assets/chatmodes/code-tour.chatmode.md +205 -0
- package/assets/chatmodes/critical-thinking.chatmode.md +23 -0
- package/assets/chatmodes/csharp-dotnet-janitor.chatmode.md +83 -0
- package/assets/chatmodes/csharp-mcp-expert.chatmode.md +69 -0
- package/assets/chatmodes/debug.chatmode.md +79 -0
- package/assets/chatmodes/declarative-agents-architect.chatmode.md +76 -0
- package/assets/chatmodes/demonstrate-understanding.chatmode.md +60 -0
- package/assets/chatmodes/dotnet-upgrade.chatmode.md +222 -0
- package/assets/chatmodes/drupal-expert.chatmode.md +687 -0
- package/assets/chatmodes/electron-angular-native.chatmode.md +285 -0
- package/assets/chatmodes/expert-cpp-software-engineer.chatmode.md +27 -0
- package/assets/chatmodes/expert-dotnet-software-engineer.chatmode.md +22 -0
- package/assets/chatmodes/expert-nextjs-developer.chatmode.md +477 -0
- package/assets/chatmodes/expert-react-frontend-engineer.chatmode.md +738 -0
- package/assets/chatmodes/gilfoyle.chatmode.md +66 -0
- package/assets/chatmodes/go-mcp-expert.chatmode.md +122 -0
- package/assets/chatmodes/gpt-5-beast-mode.chatmode.md +109 -0
- package/assets/chatmodes/hlbpa.chatmode.md +232 -0
- package/assets/chatmodes/implementation-plan.chatmode.md +159 -0
- package/assets/chatmodes/janitor.chatmode.md +89 -0
- package/assets/chatmodes/java-mcp-expert.chatmode.md +325 -0
- package/assets/chatmodes/kotlin-mcp-expert.chatmode.md +181 -0
- package/assets/chatmodes/kusto-assistant.chatmode.md +143 -0
- package/assets/chatmodes/laravel-expert-agent.chatmode.md +628 -0
- package/assets/chatmodes/mentor.chatmode.md +32 -0
- package/assets/chatmodes/meta-agentic-project-scaffold.chatmode.md +15 -0
- package/assets/chatmodes/microsoft-agent-framework-dotnet.chatmode.md +62 -0
- package/assets/chatmodes/microsoft-agent-framework-python.chatmode.md +62 -0
- package/assets/chatmodes/microsoft-study-mode.chatmode.md +32 -0
- package/assets/chatmodes/microsoft_learn_contributor.chatmode.md +388 -0
- package/assets/chatmodes/ms-sql-dba.chatmode.md +25 -0
- package/assets/chatmodes/php-mcp-expert.chatmode.md +498 -0
- package/assets/chatmodes/pimcore-expert.chatmode.md +869 -0
- package/assets/chatmodes/plan.chatmode.md +114 -0
- package/assets/chatmodes/planner.chatmode.md +14 -0
- package/assets/chatmodes/playwright-tester.chatmode.md +13 -0
- package/assets/chatmodes/postgresql-dba.chatmode.md +17 -0
- package/assets/chatmodes/power-bi-data-modeling-expert.chatmode.md +319 -0
- package/assets/chatmodes/power-bi-dax-expert.chatmode.md +334 -0
- package/assets/chatmodes/power-bi-performance-expert.chatmode.md +533 -0
- package/assets/chatmodes/power-bi-visualization-expert.chatmode.md +549 -0
- package/assets/chatmodes/power-platform-expert.chatmode.md +116 -0
- package/assets/chatmodes/power-platform-mcp-integration-expert.chatmode.md +149 -0
- package/assets/chatmodes/prd.chatmode.md +201 -0
- package/assets/chatmodes/principal-software-engineer.chatmode.md +41 -0
- package/assets/chatmodes/prompt-builder.chatmode.md +352 -0
- package/assets/chatmodes/prompt-engineer.chatmode.md +72 -0
- package/assets/chatmodes/python-mcp-expert.chatmode.md +99 -0
- package/assets/chatmodes/refine-issue.chatmode.md +34 -0
- package/assets/chatmodes/research-technical-spike.chatmode.md +169 -0
- package/assets/chatmodes/ruby-mcp-expert.chatmode.md +346 -0
- package/assets/chatmodes/rust-gpt-4.1-beast-mode.chatmode.md +197 -0
- package/assets/chatmodes/rust-mcp-expert.chatmode.md +465 -0
- package/assets/chatmodes/search-ai-optimization-expert.chatmode.md +227 -0
- package/assets/chatmodes/semantic-kernel-dotnet.chatmode.md +31 -0
- package/assets/chatmodes/semantic-kernel-python.chatmode.md +28 -0
- package/assets/chatmodes/shopify-expert.chatmode.md +681 -0
- package/assets/chatmodes/simple-app-idea-generator.chatmode.md +134 -0
- package/assets/chatmodes/software-engineer-agent-v1.chatmode.md +164 -0
- package/assets/chatmodes/specification.chatmode.md +127 -0
- package/assets/chatmodes/swift-mcp-expert.chatmode.md +240 -0
- package/assets/chatmodes/task-planner.chatmode.md +374 -0
- package/assets/chatmodes/task-researcher.chatmode.md +254 -0
- package/assets/chatmodes/tdd-green.chatmode.md +59 -0
- package/assets/chatmodes/tdd-red.chatmode.md +59 -0
- package/assets/chatmodes/tdd-refactor.chatmode.md +84 -0
- package/assets/chatmodes/tech-debt-remediation-plan.chatmode.md +49 -0
- package/assets/chatmodes/terraform-azure-implement.chatmode.md +104 -0
- package/assets/chatmodes/terraform-azure-planning.chatmode.md +157 -0
- package/assets/chatmodes/typescript-mcp-expert.chatmode.md +91 -0
- package/assets/chatmodes/voidbeast-gpt41enhanced.chatmode.md +230 -0
- package/assets/chatmodes/wg-code-alchemist.chatmode.md +61 -0
- package/assets/chatmodes/wg-code-sentinel.chatmode.md +55 -0
- package/assets/collections/ai-prompt-engineering.json +18 -0
- package/assets/collections/angular-development.json +7 -0
- package/assets/collections/azure-cloud-architect.json +29 -0
- package/assets/collections/cpp-development.json +6 -0
- package/assets/collections/database-administration.json +8 -0
- package/assets/collections/devops-sre.json +11 -0
- package/assets/collections/dotnet-development.json +22 -0
- package/assets/collections/general-productivity.json +9 -0
- package/assets/collections/go-development.json +7 -0
- package/assets/collections/java-spring-developer.json +26 -0
- package/assets/collections/learning-mentoring.json +10 -0
- package/assets/collections/legacy-migration.json +4 -0
- package/assets/collections/mcp-specialist.json +41 -0
- package/assets/collections/mobile-development.json +4 -0
- package/assets/collections/php-cms-development.json +11 -0
- package/assets/collections/power-platform-specialist.json +31 -0
- package/assets/collections/project-management.json +12 -0
- package/assets/collections/python-development.json +13 -0
- package/assets/collections/quality-assurance.json +13 -0
- package/assets/collections/ruby-development.json +9 -0
- package/assets/collections/rust-development.json +10 -0
- package/assets/collections/security-specialist.json +8 -0
- package/assets/collections/software-architect.json +25 -0
- package/assets/collections/technical-writing.json +9 -0
- package/assets/collections/web-frontend-development.json +14 -0
- package/assets/instructions/a11y.instructions.md +369 -0
- package/assets/instructions/ai-prompt-engineering-safety-best-practices.instructions.md +867 -0
- package/assets/instructions/angular.instructions.md +104 -0
- package/assets/instructions/ansible.instructions.md +88 -0
- package/assets/instructions/aspnet-rest-apis.instructions.md +110 -0
- package/assets/instructions/astro.instructions.md +182 -0
- package/assets/instructions/azure-devops-pipelines.instructions.md +185 -0
- package/assets/instructions/azure-functions-typescript.instructions.md +14 -0
- package/assets/instructions/azure-logic-apps-power-automate.instructions.md +1943 -0
- package/assets/instructions/azure-verified-modules-terraform.instructions.md +229 -0
- package/assets/instructions/bicep-code-best-practices.instructions.md +54 -0
- package/assets/instructions/blazor.instructions.md +77 -0
- package/assets/instructions/clojure.instructions.md +349 -0
- package/assets/instructions/cmake-vcpkg.instructions.md +10 -0
- package/assets/instructions/codexer.instructions.md +428 -0
- package/assets/instructions/coldfusion-cfc.instructions.md +30 -0
- package/assets/instructions/coldfusion-cfm.instructions.md +28 -0
- package/assets/instructions/collections.instructions.md +54 -0
- package/assets/instructions/containerization-docker-best-practices.instructions.md +681 -0
- package/assets/instructions/convert-jpa-to-spring-data-cosmos.instructions.md +949 -0
- package/assets/instructions/copilot-thought-logging.instructions.md +62 -0
- package/assets/instructions/csharp-ja.instructions.md +114 -0
- package/assets/instructions/csharp-ko.instructions.md +77 -0
- package/assets/instructions/csharp-mcp-server.instructions.md +95 -0
- package/assets/instructions/csharp.instructions.md +114 -0
- package/assets/instructions/dart-n-flutter.instructions.md +447 -0
- package/assets/instructions/declarative-agents-microsoft365.instructions.md +316 -0
- package/assets/instructions/devbox-image-definition.instructions.md +302 -0
- package/assets/instructions/devops-core-principles.instructions.md +167 -0
- package/assets/instructions/dotnet-architecture-good-practices.instructions.md +279 -0
- package/assets/instructions/dotnet-framework.instructions.md +113 -0
- package/assets/instructions/dotnet-maui-9-to-dotnet-maui-10-upgrade.instructions.md +1922 -0
- package/assets/instructions/dotnet-maui.instructions.md +69 -0
- package/assets/instructions/dotnet-upgrade.instructions.md +287 -0
- package/assets/instructions/dotnet-wpf.instructions.md +79 -0
- package/assets/instructions/genaiscript.instructions.md +21 -0
- package/assets/instructions/generate-modern-terraform-code-for-azure.instructions.md +82 -0
- package/assets/instructions/gilfoyle-code-review.instructions.md +114 -0
- package/assets/instructions/github-actions-ci-cd-best-practices.instructions.md +607 -0
- package/assets/instructions/go-mcp-server.instructions.md +346 -0
- package/assets/instructions/go.instructions.md +373 -0
- package/assets/instructions/instructions.instructions.md +256 -0
- package/assets/instructions/java-11-to-java-17-upgrade.instructions.md +793 -0
- package/assets/instructions/java-17-to-java-21-upgrade.instructions.md +464 -0
- package/assets/instructions/java-21-to-java-25-upgrade.instructions.md +311 -0
- package/assets/instructions/java-mcp-server.instructions.md +553 -0
- package/assets/instructions/java.instructions.md +81 -0
- package/assets/instructions/joyride-user-project.instructions.md +206 -0
- package/assets/instructions/joyride-workspace-automation.instructions.md +46 -0
- package/assets/instructions/kotlin-mcp-server.instructions.md +481 -0
- package/assets/instructions/kubernetes-deployment-best-practices.instructions.md +307 -0
- package/assets/instructions/langchain-python.instructions.md +229 -0
- package/assets/instructions/localization.instructions.md +39 -0
- package/assets/instructions/makefile.instructions.md +410 -0
- package/assets/instructions/markdown.instructions.md +52 -0
- package/assets/instructions/memory-bank.instructions.md +299 -0
- package/assets/instructions/mongo-dba.instructions.md +25 -0
- package/assets/instructions/ms-sql-dba.instructions.md +25 -0
- package/assets/instructions/nestjs.instructions.md +406 -0
- package/assets/instructions/nextjs-tailwind.instructions.md +72 -0
- package/assets/instructions/nextjs.instructions.md +143 -0
- package/assets/instructions/nodejs-javascript-vitest.instructions.md +30 -0
- package/assets/instructions/object-calisthenics.instructions.md +302 -0
- package/assets/instructions/oqtane.instructions.md +86 -0
- package/assets/instructions/performance-optimization.instructions.md +420 -0
- package/assets/instructions/php-mcp-server.instructions.md +809 -0
- package/assets/instructions/playwright-dotnet.instructions.md +101 -0
- package/assets/instructions/playwright-python.instructions.md +62 -0
- package/assets/instructions/playwright-typescript.instructions.md +86 -0
- package/assets/instructions/power-apps-canvas-yaml.instructions.md +827 -0
- package/assets/instructions/power-apps-code-apps.instructions.md +601 -0
- package/assets/instructions/power-bi-custom-visuals-development.instructions.md +810 -0
- package/assets/instructions/power-bi-data-modeling-best-practices.instructions.md +639 -0
- package/assets/instructions/power-bi-dax-best-practices.instructions.md +795 -0
- package/assets/instructions/power-bi-devops-alm-best-practices.instructions.md +623 -0
- package/assets/instructions/power-bi-report-design-best-practices.instructions.md +752 -0
- package/assets/instructions/power-bi-security-rls-best-practices.instructions.md +504 -0
- package/assets/instructions/power-platform-connector.instructions.md +430 -0
- package/assets/instructions/power-platform-mcp-development.instructions.md +88 -0
- package/assets/instructions/powershell-pester-5.instructions.md +197 -0
- package/assets/instructions/powershell.instructions.md +356 -0
- package/assets/instructions/prompt.instructions.md +73 -0
- package/assets/instructions/python-mcp-server.instructions.md +204 -0
- package/assets/instructions/python.instructions.md +56 -0
- package/assets/instructions/quarkus-mcp-server-sse.instructions.md +49 -0
- package/assets/instructions/quarkus.instructions.md +98 -0
- package/assets/instructions/r.instructions.md +116 -0
- package/assets/instructions/reactjs.instructions.md +162 -0
- package/assets/instructions/ruby-mcp-server.instructions.md +629 -0
- package/assets/instructions/ruby-on-rails.instructions.md +124 -0
- package/assets/instructions/rust-mcp-server.instructions.md +715 -0
- package/assets/instructions/rust.instructions.md +135 -0
- package/assets/instructions/security-and-owasp.instructions.md +51 -0
- package/assets/instructions/self-explanatory-code-commenting.instructions.md +162 -0
- package/assets/instructions/shell.instructions.md +132 -0
- package/assets/instructions/spec-driven-workflow-v1.instructions.md +323 -0
- package/assets/instructions/springboot.instructions.md +68 -0
- package/assets/instructions/sql-sp-generation.instructions.md +74 -0
- package/assets/instructions/svelte.instructions.md +161 -0
- package/assets/instructions/swift-mcp-server.instructions.md +498 -0
- package/assets/instructions/taming-copilot.instructions.md +40 -0
- package/assets/instructions/tanstack-start-shadcn-tailwind.instructions.md +212 -0
- package/assets/instructions/task-implementation.instructions.md +190 -0
- package/assets/instructions/tasksync.instructions.md +352 -0
- package/assets/instructions/terraform-azure.instructions.md +254 -0
- package/assets/instructions/terraform-sap-btp.instructions.md +195 -0
- package/assets/instructions/terraform.instructions.md +113 -0
- package/assets/instructions/typescript-5-es2022.instructions.md +114 -0
- package/assets/instructions/typescript-mcp-server.instructions.md +228 -0
- package/assets/instructions/update-code-from-shorthand.instructions.md +130 -0
- package/assets/instructions/vuejs3.instructions.md +153 -0
- package/assets/instructions/wordpress.instructions.md +186 -0
- package/assets/prompts/add-educational-comments.prompt.md +129 -0
- package/assets/prompts/ai-prompt-engineering-safety-review.prompt.md +230 -0
- package/assets/prompts/architecture-blueprint-generator.prompt.md +322 -0
- package/assets/prompts/aspnet-minimal-api-openapi.prompt.md +42 -0
- package/assets/prompts/az-cost-optimize.prompt.md +305 -0
- package/assets/prompts/azure-resource-health-diagnose.prompt.md +290 -0
- package/assets/prompts/boost-prompt.prompt.md +25 -0
- package/assets/prompts/breakdown-epic-arch.prompt.md +66 -0
- package/assets/prompts/breakdown-epic-pm.prompt.md +58 -0
- package/assets/prompts/breakdown-feature-implementation.prompt.md +128 -0
- package/assets/prompts/breakdown-feature-prd.prompt.md +61 -0
- package/assets/prompts/breakdown-plan.prompt.md +509 -0
- package/assets/prompts/breakdown-test.prompt.md +365 -0
- package/assets/prompts/code-exemplars-blueprint-generator.prompt.md +126 -0
- package/assets/prompts/comment-code-generate-a-tutorial.prompt.md +26 -0
- package/assets/prompts/containerize-aspnet-framework.prompt.md +455 -0
- package/assets/prompts/containerize-aspnetcore.prompt.md +393 -0
- package/assets/prompts/conventional-commit.prompt.md +73 -0
- package/assets/prompts/copilot-instructions-blueprint-generator.prompt.md +294 -0
- package/assets/prompts/cosmosdb-datamodeling.prompt.md +1045 -0
- package/assets/prompts/create-agentsmd.prompt.md +249 -0
- package/assets/prompts/create-architectural-decision-record.prompt.md +97 -0
- package/assets/prompts/create-github-action-workflow-specification.prompt.md +276 -0
- package/assets/prompts/create-github-issue-feature-from-specification.prompt.md +28 -0
- package/assets/prompts/create-github-issues-feature-from-implementation-plan.prompt.md +28 -0
- package/assets/prompts/create-github-issues-for-unmet-specification-requirements.prompt.md +35 -0
- package/assets/prompts/create-github-pull-request-from-specification.prompt.md +24 -0
- package/assets/prompts/create-implementation-plan.prompt.md +157 -0
- package/assets/prompts/create-llms.prompt.md +210 -0
- package/assets/prompts/create-oo-component-documentation.prompt.md +193 -0
- package/assets/prompts/create-readme.prompt.md +21 -0
- package/assets/prompts/create-specification.prompt.md +127 -0
- package/assets/prompts/create-spring-boot-java-project.prompt.md +163 -0
- package/assets/prompts/create-spring-boot-kotlin-project.prompt.md +147 -0
- package/assets/prompts/create-technical-spike.prompt.md +231 -0
- package/assets/prompts/csharp-async.prompt.md +50 -0
- package/assets/prompts/csharp-docs.prompt.md +63 -0
- package/assets/prompts/csharp-mcp-server-generator.prompt.md +59 -0
- package/assets/prompts/csharp-mstest.prompt.md +67 -0
- package/assets/prompts/csharp-nunit.prompt.md +72 -0
- package/assets/prompts/csharp-tunit.prompt.md +101 -0
- package/assets/prompts/csharp-xunit.prompt.md +69 -0
- package/assets/prompts/declarative-agents.prompt.md +93 -0
- package/assets/prompts/documentation-writer.prompt.md +46 -0
- package/assets/prompts/dotnet-best-practices.prompt.md +84 -0
- package/assets/prompts/dotnet-design-pattern-review.prompt.md +41 -0
- package/assets/prompts/dotnet-upgrade.prompt.md +116 -0
- package/assets/prompts/editorconfig.prompt.md +64 -0
- package/assets/prompts/ef-core.prompt.md +76 -0
- package/assets/prompts/finalize-agent-prompt.prompt.md +27 -0
- package/assets/prompts/first-ask.prompt.md +29 -0
- package/assets/prompts/folder-structure-blueprint-generator.prompt.md +405 -0
- package/assets/prompts/gen-specs-as-issues.prompt.md +165 -0
- package/assets/prompts/generate-custom-instructions-from-codebase.prompt.md +240 -0
- package/assets/prompts/git-flow-branch-creator.prompt.md +293 -0
- package/assets/prompts/github-copilot-starter.prompt.md +372 -0
- package/assets/prompts/go-mcp-server-generator.prompt.md +334 -0
- package/assets/prompts/java-docs.prompt.md +24 -0
- package/assets/prompts/java-junit.prompt.md +64 -0
- package/assets/prompts/java-mcp-server-generator.prompt.md +756 -0
- package/assets/prompts/java-refactoring-extract-method.prompt.md +105 -0
- package/assets/prompts/java-refactoring-remove-parameter.prompt.md +85 -0
- package/assets/prompts/java-springboot.prompt.md +66 -0
- package/assets/prompts/javascript-typescript-jest.prompt.md +44 -0
- package/assets/prompts/kotlin-mcp-server-generator.prompt.md +449 -0
- package/assets/prompts/kotlin-springboot.prompt.md +71 -0
- package/assets/prompts/mcp-copilot-studio-server-generator.prompt.md +118 -0
- package/assets/prompts/memory-merger.prompt.md +107 -0
- package/assets/prompts/mkdocs-translations.prompt.md +110 -0
- package/assets/prompts/model-recommendation.prompt.md +677 -0
- package/assets/prompts/multi-stage-dockerfile.prompt.md +47 -0
- package/assets/prompts/my-issues.prompt.md +9 -0
- package/assets/prompts/my-pull-requests.prompt.md +15 -0
- package/assets/prompts/next-intl-add-language.prompt.md +20 -0
- package/assets/prompts/php-mcp-server-generator.prompt.md +522 -0
- package/assets/prompts/playwright-automation-fill-in-form.prompt.md +30 -0
- package/assets/prompts/playwright-explore-website.prompt.md +19 -0
- package/assets/prompts/playwright-generate-test.prompt.md +19 -0
- package/assets/prompts/postgresql-code-review.prompt.md +214 -0
- package/assets/prompts/postgresql-optimization.prompt.md +406 -0
- package/assets/prompts/power-apps-code-app-scaffold.prompt.md +150 -0
- package/assets/prompts/power-bi-dax-optimization.prompt.md +175 -0
- package/assets/prompts/power-bi-model-design-review.prompt.md +405 -0
- package/assets/prompts/power-bi-performance-troubleshooting.prompt.md +384 -0
- package/assets/prompts/power-bi-report-design-consultation.prompt.md +353 -0
- package/assets/prompts/power-platform-mcp-connector-suite.prompt.md +156 -0
- package/assets/prompts/project-workflow-analysis-blueprint-generator.prompt.md +294 -0
- package/assets/prompts/prompt-builder.prompt.md +142 -0
- package/assets/prompts/pytest-coverage.prompt.md +28 -0
- package/assets/prompts/python-mcp-server-generator.prompt.md +105 -0
- package/assets/prompts/readme-blueprint-generator.prompt.md +79 -0
- package/assets/prompts/remember-interactive-programming.prompt.md +13 -0
- package/assets/prompts/remember.prompt.md +125 -0
- package/assets/prompts/repo-story-time.prompt.md +156 -0
- package/assets/prompts/review-and-refactor.prompt.md +15 -0
- package/assets/prompts/ruby-mcp-server-generator.prompt.md +660 -0
- package/assets/prompts/rust-mcp-server-generator.prompt.md +578 -0
- package/assets/prompts/shuffle-json-data.prompt.md +151 -0
- package/assets/prompts/sql-code-review.prompt.md +303 -0
- package/assets/prompts/sql-optimization.prompt.md +298 -0
- package/assets/prompts/suggest-awesome-github-copilot-agents.prompt.md +72 -0
- package/assets/prompts/suggest-awesome-github-copilot-chatmodes.prompt.md +71 -0
- package/assets/prompts/suggest-awesome-github-copilot-collections.prompt.md +149 -0
- package/assets/prompts/suggest-awesome-github-copilot-instructions.prompt.md +88 -0
- package/assets/prompts/suggest-awesome-github-copilot-prompts.prompt.md +71 -0
- package/assets/prompts/swift-mcp-server-generator.prompt.md +669 -0
- package/assets/prompts/technology-stack-blueprint-generator.prompt.md +242 -0
- package/assets/prompts/typescript-mcp-server-generator.prompt.md +90 -0
- package/assets/prompts/update-avm-modules-in-bicep.prompt.md +60 -0
- package/assets/prompts/update-implementation-plan.prompt.md +157 -0
- package/assets/prompts/update-llms.prompt.md +216 -0
- package/assets/prompts/update-markdown-file-index.prompt.md +76 -0
- package/assets/prompts/update-oo-component-documentation.prompt.md +162 -0
- package/assets/prompts/update-specification.prompt.md +127 -0
- package/assets/prompts/write-coding-standards-from-file.prompt.md +316 -0
- package/bin/cli.js +200 -0
- package/package.json +53 -0
- package/scripts/sync.js +99 -0
- package/verdaccio/config.yaml +202 -0
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 'Generate a complete Model Context Protocol server project in Swift using the official MCP Swift SDK package.'
|
|
3
|
+
mode: agent
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Swift MCP Server Generator
|
|
7
|
+
|
|
8
|
+
Generate a complete, production-ready MCP server in Swift using the official Swift SDK package.
|
|
9
|
+
|
|
10
|
+
## Project Generation
|
|
11
|
+
|
|
12
|
+
When asked to create a Swift MCP server, generate a complete project with this structure:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
my-mcp-server/
|
|
16
|
+
├── Package.swift
|
|
17
|
+
├── Sources/
|
|
18
|
+
│ └── MyMCPServer/
|
|
19
|
+
│ ├── main.swift
|
|
20
|
+
│ ├── Server.swift
|
|
21
|
+
│ ├── Tools/
|
|
22
|
+
│ │ ├── ToolDefinitions.swift
|
|
23
|
+
│ │ └── ToolHandlers.swift
|
|
24
|
+
│ ├── Resources/
|
|
25
|
+
│ │ ├── ResourceDefinitions.swift
|
|
26
|
+
│ │ └── ResourceHandlers.swift
|
|
27
|
+
│ └── Prompts/
|
|
28
|
+
│ ├── PromptDefinitions.swift
|
|
29
|
+
│ └── PromptHandlers.swift
|
|
30
|
+
├── Tests/
|
|
31
|
+
│ └── MyMCPServerTests/
|
|
32
|
+
│ └── ServerTests.swift
|
|
33
|
+
└── README.md
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Package.swift Template
|
|
37
|
+
|
|
38
|
+
```swift
|
|
39
|
+
// swift-tools-version: 6.0
|
|
40
|
+
import PackageDescription
|
|
41
|
+
|
|
42
|
+
let package = Package(
|
|
43
|
+
name: "MyMCPServer",
|
|
44
|
+
platforms: [
|
|
45
|
+
.macOS(.v13),
|
|
46
|
+
.iOS(.v16),
|
|
47
|
+
.watchOS(.v9),
|
|
48
|
+
.tvOS(.v16),
|
|
49
|
+
.visionOS(.v1)
|
|
50
|
+
],
|
|
51
|
+
dependencies: [
|
|
52
|
+
.package(
|
|
53
|
+
url: "https://github.com/modelcontextprotocol/swift-sdk.git",
|
|
54
|
+
from: "0.10.0"
|
|
55
|
+
),
|
|
56
|
+
.package(
|
|
57
|
+
url: "https://github.com/apple/swift-log.git",
|
|
58
|
+
from: "1.5.0"
|
|
59
|
+
),
|
|
60
|
+
.package(
|
|
61
|
+
url: "https://github.com/swift-server/swift-service-lifecycle.git",
|
|
62
|
+
from: "2.0.0"
|
|
63
|
+
)
|
|
64
|
+
],
|
|
65
|
+
targets: [
|
|
66
|
+
.executableTarget(
|
|
67
|
+
name: "MyMCPServer",
|
|
68
|
+
dependencies: [
|
|
69
|
+
.product(name: "MCP", package: "swift-sdk"),
|
|
70
|
+
.product(name: "Logging", package: "swift-log"),
|
|
71
|
+
.product(name: "ServiceLifecycle", package: "swift-service-lifecycle")
|
|
72
|
+
]
|
|
73
|
+
),
|
|
74
|
+
.testTarget(
|
|
75
|
+
name: "MyMCPServerTests",
|
|
76
|
+
dependencies: ["MyMCPServer"]
|
|
77
|
+
)
|
|
78
|
+
]
|
|
79
|
+
)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## main.swift Template
|
|
83
|
+
|
|
84
|
+
```swift
|
|
85
|
+
import MCP
|
|
86
|
+
import Logging
|
|
87
|
+
import ServiceLifecycle
|
|
88
|
+
|
|
89
|
+
struct MCPService: Service {
|
|
90
|
+
let server: Server
|
|
91
|
+
let transport: Transport
|
|
92
|
+
|
|
93
|
+
func run() async throws {
|
|
94
|
+
try await server.start(transport: transport) { clientInfo, capabilities in
|
|
95
|
+
logger.info("Client connected", metadata: [
|
|
96
|
+
"name": .string(clientInfo.name),
|
|
97
|
+
"version": .string(clientInfo.version)
|
|
98
|
+
])
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Keep service running
|
|
102
|
+
try await Task.sleep(for: .days(365 * 100))
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
func shutdown() async throws {
|
|
106
|
+
logger.info("Shutting down MCP server")
|
|
107
|
+
await server.stop()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
var logger = Logger(label: "com.example.mcp-server")
|
|
112
|
+
logger.logLevel = .info
|
|
113
|
+
|
|
114
|
+
do {
|
|
115
|
+
let server = await createServer()
|
|
116
|
+
let transport = StdioTransport(logger: logger)
|
|
117
|
+
let service = MCPService(server: server, transport: transport)
|
|
118
|
+
|
|
119
|
+
let serviceGroup = ServiceGroup(
|
|
120
|
+
services: [service],
|
|
121
|
+
configuration: .init(
|
|
122
|
+
gracefulShutdownSignals: [.sigterm, .sigint]
|
|
123
|
+
),
|
|
124
|
+
logger: logger
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
try await serviceGroup.run()
|
|
128
|
+
} catch {
|
|
129
|
+
logger.error("Fatal error", metadata: ["error": .string("\(error)")])
|
|
130
|
+
throw error
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Server.swift Template
|
|
135
|
+
|
|
136
|
+
```swift
|
|
137
|
+
import MCP
|
|
138
|
+
import Logging
|
|
139
|
+
|
|
140
|
+
func createServer() async -> Server {
|
|
141
|
+
let server = Server(
|
|
142
|
+
name: "MyMCPServer",
|
|
143
|
+
version: "1.0.0",
|
|
144
|
+
capabilities: .init(
|
|
145
|
+
prompts: .init(listChanged: true),
|
|
146
|
+
resources: .init(subscribe: true, listChanged: true),
|
|
147
|
+
tools: .init(listChanged: true)
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
// Register tool handlers
|
|
152
|
+
await registerToolHandlers(server: server)
|
|
153
|
+
|
|
154
|
+
// Register resource handlers
|
|
155
|
+
await registerResourceHandlers(server: server)
|
|
156
|
+
|
|
157
|
+
// Register prompt handlers
|
|
158
|
+
await registerPromptHandlers(server: server)
|
|
159
|
+
|
|
160
|
+
return server
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## ToolDefinitions.swift Template
|
|
165
|
+
|
|
166
|
+
```swift
|
|
167
|
+
import MCP
|
|
168
|
+
|
|
169
|
+
func getToolDefinitions() -> [Tool] {
|
|
170
|
+
[
|
|
171
|
+
Tool(
|
|
172
|
+
name: "greet",
|
|
173
|
+
description: "Generate a greeting message",
|
|
174
|
+
inputSchema: .object([
|
|
175
|
+
"type": .string("object"),
|
|
176
|
+
"properties": .object([
|
|
177
|
+
"name": .object([
|
|
178
|
+
"type": .string("string"),
|
|
179
|
+
"description": .string("Name to greet")
|
|
180
|
+
])
|
|
181
|
+
]),
|
|
182
|
+
"required": .array([.string("name")])
|
|
183
|
+
])
|
|
184
|
+
),
|
|
185
|
+
Tool(
|
|
186
|
+
name: "calculate",
|
|
187
|
+
description: "Perform mathematical calculations",
|
|
188
|
+
inputSchema: .object([
|
|
189
|
+
"type": .string("object"),
|
|
190
|
+
"properties": .object([
|
|
191
|
+
"operation": .object([
|
|
192
|
+
"type": .string("string"),
|
|
193
|
+
"enum": .array([
|
|
194
|
+
.string("add"),
|
|
195
|
+
.string("subtract"),
|
|
196
|
+
.string("multiply"),
|
|
197
|
+
.string("divide")
|
|
198
|
+
]),
|
|
199
|
+
"description": .string("Operation to perform")
|
|
200
|
+
]),
|
|
201
|
+
"a": .object([
|
|
202
|
+
"type": .string("number"),
|
|
203
|
+
"description": .string("First operand")
|
|
204
|
+
]),
|
|
205
|
+
"b": .object([
|
|
206
|
+
"type": .string("number"),
|
|
207
|
+
"description": .string("Second operand")
|
|
208
|
+
])
|
|
209
|
+
]),
|
|
210
|
+
"required": .array([
|
|
211
|
+
.string("operation"),
|
|
212
|
+
.string("a"),
|
|
213
|
+
.string("b")
|
|
214
|
+
])
|
|
215
|
+
])
|
|
216
|
+
)
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## ToolHandlers.swift Template
|
|
222
|
+
|
|
223
|
+
```swift
|
|
224
|
+
import MCP
|
|
225
|
+
import Logging
|
|
226
|
+
|
|
227
|
+
private let logger = Logger(label: "com.example.mcp-server.tools")
|
|
228
|
+
|
|
229
|
+
func registerToolHandlers(server: Server) async {
|
|
230
|
+
await server.withMethodHandler(ListTools.self) { _ in
|
|
231
|
+
logger.debug("Listing available tools")
|
|
232
|
+
return .init(tools: getToolDefinitions())
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
await server.withMethodHandler(CallTool.self) { params in
|
|
236
|
+
logger.info("Tool called", metadata: ["name": .string(params.name)])
|
|
237
|
+
|
|
238
|
+
switch params.name {
|
|
239
|
+
case "greet":
|
|
240
|
+
return handleGreet(params: params)
|
|
241
|
+
|
|
242
|
+
case "calculate":
|
|
243
|
+
return handleCalculate(params: params)
|
|
244
|
+
|
|
245
|
+
default:
|
|
246
|
+
logger.warning("Unknown tool requested", metadata: ["name": .string(params.name)])
|
|
247
|
+
return .init(
|
|
248
|
+
content: [.text("Unknown tool: \(params.name)")],
|
|
249
|
+
isError: true
|
|
250
|
+
)
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private func handleGreet(params: CallTool.Params) -> CallTool.Result {
|
|
256
|
+
guard let name = params.arguments?["name"]?.stringValue else {
|
|
257
|
+
return .init(
|
|
258
|
+
content: [.text("Missing 'name' parameter")],
|
|
259
|
+
isError: true
|
|
260
|
+
)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
let greeting = "Hello, \(name)! Welcome to MCP."
|
|
264
|
+
logger.debug("Generated greeting", metadata: ["name": .string(name)])
|
|
265
|
+
|
|
266
|
+
return .init(
|
|
267
|
+
content: [.text(greeting)],
|
|
268
|
+
isError: false
|
|
269
|
+
)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private func handleCalculate(params: CallTool.Params) -> CallTool.Result {
|
|
273
|
+
guard let operation = params.arguments?["operation"]?.stringValue,
|
|
274
|
+
let a = params.arguments?["a"]?.doubleValue,
|
|
275
|
+
let b = params.arguments?["b"]?.doubleValue else {
|
|
276
|
+
return .init(
|
|
277
|
+
content: [.text("Missing or invalid parameters")],
|
|
278
|
+
isError: true
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
let result: Double
|
|
283
|
+
switch operation {
|
|
284
|
+
case "add":
|
|
285
|
+
result = a + b
|
|
286
|
+
case "subtract":
|
|
287
|
+
result = a - b
|
|
288
|
+
case "multiply":
|
|
289
|
+
result = a * b
|
|
290
|
+
case "divide":
|
|
291
|
+
guard b != 0 else {
|
|
292
|
+
return .init(
|
|
293
|
+
content: [.text("Division by zero")],
|
|
294
|
+
isError: true
|
|
295
|
+
)
|
|
296
|
+
}
|
|
297
|
+
result = a / b
|
|
298
|
+
default:
|
|
299
|
+
return .init(
|
|
300
|
+
content: [.text("Unknown operation: \(operation)")],
|
|
301
|
+
isError: true
|
|
302
|
+
)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
logger.debug("Calculation performed", metadata: [
|
|
306
|
+
"operation": .string(operation),
|
|
307
|
+
"result": .string("\(result)")
|
|
308
|
+
])
|
|
309
|
+
|
|
310
|
+
return .init(
|
|
311
|
+
content: [.text("Result: \(result)")],
|
|
312
|
+
isError: false
|
|
313
|
+
)
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## ResourceDefinitions.swift Template
|
|
318
|
+
|
|
319
|
+
```swift
|
|
320
|
+
import MCP
|
|
321
|
+
|
|
322
|
+
func getResourceDefinitions() -> [Resource] {
|
|
323
|
+
[
|
|
324
|
+
Resource(
|
|
325
|
+
name: "Example Data",
|
|
326
|
+
uri: "resource://data/example",
|
|
327
|
+
description: "Example resource data",
|
|
328
|
+
mimeType: "application/json"
|
|
329
|
+
),
|
|
330
|
+
Resource(
|
|
331
|
+
name: "Configuration",
|
|
332
|
+
uri: "resource://config",
|
|
333
|
+
description: "Server configuration",
|
|
334
|
+
mimeType: "application/json"
|
|
335
|
+
)
|
|
336
|
+
]
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## ResourceHandlers.swift Template
|
|
341
|
+
|
|
342
|
+
```swift
|
|
343
|
+
import MCP
|
|
344
|
+
import Logging
|
|
345
|
+
import Foundation
|
|
346
|
+
|
|
347
|
+
private let logger = Logger(label: "com.example.mcp-server.resources")
|
|
348
|
+
|
|
349
|
+
actor ResourceState {
|
|
350
|
+
private var subscriptions: Set<String> = []
|
|
351
|
+
|
|
352
|
+
func addSubscription(_ uri: String) {
|
|
353
|
+
subscriptions.insert(uri)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
func removeSubscription(_ uri: String) {
|
|
357
|
+
subscriptions.remove(uri)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
func isSubscribed(_ uri: String) -> Bool {
|
|
361
|
+
subscriptions.contains(uri)
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private let state = ResourceState()
|
|
366
|
+
|
|
367
|
+
func registerResourceHandlers(server: Server) async {
|
|
368
|
+
await server.withMethodHandler(ListResources.self) { params in
|
|
369
|
+
logger.debug("Listing available resources")
|
|
370
|
+
return .init(resources: getResourceDefinitions(), nextCursor: nil)
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
await server.withMethodHandler(ReadResource.self) { params in
|
|
374
|
+
logger.info("Reading resource", metadata: ["uri": .string(params.uri)])
|
|
375
|
+
|
|
376
|
+
switch params.uri {
|
|
377
|
+
case "resource://data/example":
|
|
378
|
+
let jsonData = """
|
|
379
|
+
{
|
|
380
|
+
"message": "Example resource data",
|
|
381
|
+
"timestamp": "\(Date())"
|
|
382
|
+
}
|
|
383
|
+
"""
|
|
384
|
+
return .init(contents: [
|
|
385
|
+
.text(jsonData, uri: params.uri, mimeType: "application/json")
|
|
386
|
+
])
|
|
387
|
+
|
|
388
|
+
case "resource://config":
|
|
389
|
+
let config = """
|
|
390
|
+
{
|
|
391
|
+
"serverName": "MyMCPServer",
|
|
392
|
+
"version": "1.0.0"
|
|
393
|
+
}
|
|
394
|
+
"""
|
|
395
|
+
return .init(contents: [
|
|
396
|
+
.text(config, uri: params.uri, mimeType: "application/json")
|
|
397
|
+
])
|
|
398
|
+
|
|
399
|
+
default:
|
|
400
|
+
logger.warning("Unknown resource requested", metadata: ["uri": .string(params.uri)])
|
|
401
|
+
throw MCPError.invalidParams("Unknown resource URI: \(params.uri)")
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
await server.withMethodHandler(ResourceSubscribe.self) { params in
|
|
406
|
+
logger.info("Client subscribed to resource", metadata: ["uri": .string(params.uri)])
|
|
407
|
+
await state.addSubscription(params.uri)
|
|
408
|
+
return .init()
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
await server.withMethodHandler(ResourceUnsubscribe.self) { params in
|
|
412
|
+
logger.info("Client unsubscribed from resource", metadata: ["uri": .string(params.uri)])
|
|
413
|
+
await state.removeSubscription(params.uri)
|
|
414
|
+
return .init()
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## PromptDefinitions.swift Template
|
|
420
|
+
|
|
421
|
+
```swift
|
|
422
|
+
import MCP
|
|
423
|
+
|
|
424
|
+
func getPromptDefinitions() -> [Prompt] {
|
|
425
|
+
[
|
|
426
|
+
Prompt(
|
|
427
|
+
name: "code-review",
|
|
428
|
+
description: "Generate a code review prompt",
|
|
429
|
+
arguments: [
|
|
430
|
+
.init(name: "language", description: "Programming language", required: true),
|
|
431
|
+
.init(name: "focus", description: "Review focus area", required: false)
|
|
432
|
+
]
|
|
433
|
+
)
|
|
434
|
+
]
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## PromptHandlers.swift Template
|
|
439
|
+
|
|
440
|
+
```swift
|
|
441
|
+
import MCP
|
|
442
|
+
import Logging
|
|
443
|
+
|
|
444
|
+
private let logger = Logger(label: "com.example.mcp-server.prompts")
|
|
445
|
+
|
|
446
|
+
func registerPromptHandlers(server: Server) async {
|
|
447
|
+
await server.withMethodHandler(ListPrompts.self) { params in
|
|
448
|
+
logger.debug("Listing available prompts")
|
|
449
|
+
return .init(prompts: getPromptDefinitions(), nextCursor: nil)
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
await server.withMethodHandler(GetPrompt.self) { params in
|
|
453
|
+
logger.info("Getting prompt", metadata: ["name": .string(params.name)])
|
|
454
|
+
|
|
455
|
+
switch params.name {
|
|
456
|
+
case "code-review":
|
|
457
|
+
return handleCodeReviewPrompt(params: params)
|
|
458
|
+
|
|
459
|
+
default:
|
|
460
|
+
logger.warning("Unknown prompt requested", metadata: ["name": .string(params.name)])
|
|
461
|
+
throw MCPError.invalidParams("Unknown prompt: \(params.name)")
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
private func handleCodeReviewPrompt(params: GetPrompt.Params) -> GetPrompt.Result {
|
|
467
|
+
guard let language = params.arguments?["language"]?.stringValue else {
|
|
468
|
+
return .init(
|
|
469
|
+
description: "Missing language parameter",
|
|
470
|
+
messages: []
|
|
471
|
+
)
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
let focus = params.arguments?["focus"]?.stringValue ?? "general quality"
|
|
475
|
+
|
|
476
|
+
let description = "Code review for \(language) with focus on \(focus)"
|
|
477
|
+
let messages: [Prompt.Message] = [
|
|
478
|
+
.user("Please review this \(language) code with focus on \(focus)."),
|
|
479
|
+
.assistant("I'll review the code focusing on \(focus). Please share the code."),
|
|
480
|
+
.user("Here's the code to review: [paste code here]")
|
|
481
|
+
]
|
|
482
|
+
|
|
483
|
+
logger.debug("Generated code review prompt", metadata: [
|
|
484
|
+
"language": .string(language),
|
|
485
|
+
"focus": .string(focus)
|
|
486
|
+
])
|
|
487
|
+
|
|
488
|
+
return .init(description: description, messages: messages)
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## ServerTests.swift Template
|
|
493
|
+
|
|
494
|
+
```swift
|
|
495
|
+
import XCTest
|
|
496
|
+
@testable import MyMCPServer
|
|
497
|
+
|
|
498
|
+
final class ServerTests: XCTestCase {
|
|
499
|
+
func testGreetTool() async throws {
|
|
500
|
+
let params = CallTool.Params(
|
|
501
|
+
name: "greet",
|
|
502
|
+
arguments: ["name": .string("Swift")]
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
let result = handleGreet(params: params)
|
|
506
|
+
|
|
507
|
+
XCTAssertFalse(result.isError ?? true)
|
|
508
|
+
XCTAssertEqual(result.content.count, 1)
|
|
509
|
+
|
|
510
|
+
if case .text(let message) = result.content[0] {
|
|
511
|
+
XCTAssertTrue(message.contains("Swift"))
|
|
512
|
+
} else {
|
|
513
|
+
XCTFail("Expected text content")
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
func testCalculateTool() async throws {
|
|
518
|
+
let params = CallTool.Params(
|
|
519
|
+
name: "calculate",
|
|
520
|
+
arguments: [
|
|
521
|
+
"operation": .string("add"),
|
|
522
|
+
"a": .number(5),
|
|
523
|
+
"b": .number(3)
|
|
524
|
+
]
|
|
525
|
+
)
|
|
526
|
+
|
|
527
|
+
let result = handleCalculate(params: params)
|
|
528
|
+
|
|
529
|
+
XCTAssertFalse(result.isError ?? true)
|
|
530
|
+
XCTAssertEqual(result.content.count, 1)
|
|
531
|
+
|
|
532
|
+
if case .text(let message) = result.content[0] {
|
|
533
|
+
XCTAssertTrue(message.contains("8"))
|
|
534
|
+
} else {
|
|
535
|
+
XCTFail("Expected text content")
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
func testDivideByZero() async throws {
|
|
540
|
+
let params = CallTool.Params(
|
|
541
|
+
name: "calculate",
|
|
542
|
+
arguments: [
|
|
543
|
+
"operation": .string("divide"),
|
|
544
|
+
"a": .number(10),
|
|
545
|
+
"b": .number(0)
|
|
546
|
+
]
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
let result = handleCalculate(params: params)
|
|
550
|
+
|
|
551
|
+
XCTAssertTrue(result.isError ?? false)
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## README.md Template
|
|
557
|
+
|
|
558
|
+
```markdown
|
|
559
|
+
# MyMCPServer
|
|
560
|
+
|
|
561
|
+
A Model Context Protocol server built with Swift.
|
|
562
|
+
|
|
563
|
+
## Features
|
|
564
|
+
|
|
565
|
+
- ✅ Tools: greet, calculate
|
|
566
|
+
- ✅ Resources: example data, configuration
|
|
567
|
+
- ✅ Prompts: code-review
|
|
568
|
+
- ✅ Graceful shutdown with ServiceLifecycle
|
|
569
|
+
- ✅ Structured logging with swift-log
|
|
570
|
+
- ✅ Full test coverage
|
|
571
|
+
|
|
572
|
+
## Requirements
|
|
573
|
+
|
|
574
|
+
- Swift 6.0+
|
|
575
|
+
- macOS 13+, iOS 16+, or Linux
|
|
576
|
+
|
|
577
|
+
## Installation
|
|
578
|
+
|
|
579
|
+
```bash
|
|
580
|
+
swift build -c release
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
## Usage
|
|
584
|
+
|
|
585
|
+
Run the server:
|
|
586
|
+
|
|
587
|
+
```bash
|
|
588
|
+
swift run
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Or with logging:
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
LOG_LEVEL=debug swift run
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
## Testing
|
|
598
|
+
|
|
599
|
+
```bash
|
|
600
|
+
swift test
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
## Development
|
|
604
|
+
|
|
605
|
+
The server uses:
|
|
606
|
+
- [MCP Swift SDK](https://github.com/modelcontextprotocol/swift-sdk) - MCP protocol implementation
|
|
607
|
+
- [swift-log](https://github.com/apple/swift-log) - Structured logging
|
|
608
|
+
- [swift-service-lifecycle](https://github.com/swift-server/swift-service-lifecycle) - Graceful shutdown
|
|
609
|
+
|
|
610
|
+
## Project Structure
|
|
611
|
+
|
|
612
|
+
- `Sources/MyMCPServer/main.swift` - Entry point with ServiceLifecycle
|
|
613
|
+
- `Sources/MyMCPServer/Server.swift` - Server configuration
|
|
614
|
+
- `Sources/MyMCPServer/Tools/` - Tool definitions and handlers
|
|
615
|
+
- `Sources/MyMCPServer/Resources/` - Resource definitions and handlers
|
|
616
|
+
- `Sources/MyMCPServer/Prompts/` - Prompt definitions and handlers
|
|
617
|
+
- `Tests/` - Unit tests
|
|
618
|
+
|
|
619
|
+
## License
|
|
620
|
+
|
|
621
|
+
MIT
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
## Generation Instructions
|
|
625
|
+
|
|
626
|
+
1. **Ask for project name and description**
|
|
627
|
+
2. **Generate all files** with proper naming
|
|
628
|
+
3. **Use actor-based state** for thread safety
|
|
629
|
+
4. **Include comprehensive logging** with swift-log
|
|
630
|
+
5. **Implement graceful shutdown** with ServiceLifecycle
|
|
631
|
+
6. **Add tests** for all handlers
|
|
632
|
+
7. **Use modern Swift concurrency** (async/await)
|
|
633
|
+
8. **Follow Swift naming conventions** (camelCase, PascalCase)
|
|
634
|
+
9. **Include error handling** with proper MCPError usage
|
|
635
|
+
10. **Document public APIs** with doc comments
|
|
636
|
+
|
|
637
|
+
## Build and Run
|
|
638
|
+
|
|
639
|
+
```bash
|
|
640
|
+
# Build
|
|
641
|
+
swift build
|
|
642
|
+
|
|
643
|
+
# Run
|
|
644
|
+
swift run
|
|
645
|
+
|
|
646
|
+
# Test
|
|
647
|
+
swift test
|
|
648
|
+
|
|
649
|
+
# Release build
|
|
650
|
+
swift build -c release
|
|
651
|
+
|
|
652
|
+
# Install
|
|
653
|
+
swift build -c release
|
|
654
|
+
cp .build/release/MyMCPServer /usr/local/bin/
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
## Integration with Claude Desktop
|
|
658
|
+
|
|
659
|
+
Add to `claude_desktop_config.json`:
|
|
660
|
+
|
|
661
|
+
```json
|
|
662
|
+
{
|
|
663
|
+
"mcpServers": {
|
|
664
|
+
"my-mcp-server": {
|
|
665
|
+
"command": "/path/to/MyMCPServer"
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
```
|