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,809 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 'Best practices for building Model Context Protocol servers in PHP using the official PHP SDK with attribute-based discovery and multiple transport options'
|
|
3
|
+
applyTo: '**/*.php'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PHP MCP Server Development Best Practices
|
|
7
|
+
|
|
8
|
+
This guide provides best practices for building Model Context Protocol (MCP) servers using the official PHP SDK maintained in collaboration with The PHP Foundation.
|
|
9
|
+
|
|
10
|
+
## Installation and Setup
|
|
11
|
+
|
|
12
|
+
### Install via Composer
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
composer require mcp/sdk
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Project Structure
|
|
19
|
+
|
|
20
|
+
Organize your PHP MCP server project:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
my-mcp-server/
|
|
24
|
+
├── composer.json
|
|
25
|
+
├── src/
|
|
26
|
+
│ ├── Tools/
|
|
27
|
+
│ │ ├── Calculator.php
|
|
28
|
+
│ │ └── FileManager.php
|
|
29
|
+
│ ├── Resources/
|
|
30
|
+
│ │ ├── ConfigProvider.php
|
|
31
|
+
│ │ └── DataProvider.php
|
|
32
|
+
│ ├── Prompts/
|
|
33
|
+
│ │ └── PromptGenerator.php
|
|
34
|
+
│ └── Server.php
|
|
35
|
+
├── server.php # Server entry point
|
|
36
|
+
└── tests/
|
|
37
|
+
└── ToolsTest.php
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Composer Configuration
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"name": "your-org/mcp-server",
|
|
45
|
+
"description": "MCP Server for...",
|
|
46
|
+
"type": "project",
|
|
47
|
+
"require": {
|
|
48
|
+
"php": "^8.2",
|
|
49
|
+
"mcp/sdk": "^0.1"
|
|
50
|
+
},
|
|
51
|
+
"require-dev": {
|
|
52
|
+
"phpunit/phpunit": "^10.0"
|
|
53
|
+
},
|
|
54
|
+
"autoload": {
|
|
55
|
+
"psr-4": {
|
|
56
|
+
"App\\": "src/"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Server Implementation
|
|
63
|
+
|
|
64
|
+
### Basic Server with Attribute Discovery
|
|
65
|
+
|
|
66
|
+
Create your server entry point:
|
|
67
|
+
|
|
68
|
+
```php
|
|
69
|
+
#!/usr/bin/env php
|
|
70
|
+
<?php
|
|
71
|
+
|
|
72
|
+
declare(strict_types=1);
|
|
73
|
+
|
|
74
|
+
require_once __DIR__ . '/vendor/autoload.php';
|
|
75
|
+
|
|
76
|
+
use Mcp\Server;
|
|
77
|
+
use Mcp\Server\Transport\StdioTransport;
|
|
78
|
+
|
|
79
|
+
$server = Server::builder()
|
|
80
|
+
->setServerInfo('My MCP Server', '1.0.0')
|
|
81
|
+
->setDiscovery(__DIR__, ['.'])
|
|
82
|
+
->build();
|
|
83
|
+
|
|
84
|
+
$transport = new StdioTransport();
|
|
85
|
+
|
|
86
|
+
$server->run($transport);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Server with Caching
|
|
90
|
+
|
|
91
|
+
Use PSR-16 cache for better performance:
|
|
92
|
+
|
|
93
|
+
```php
|
|
94
|
+
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
|
|
95
|
+
use Symfony\Component\Cache\Psr16Cache;
|
|
96
|
+
|
|
97
|
+
$cache = new Psr16Cache(new FilesystemAdapter('mcp-discovery'));
|
|
98
|
+
|
|
99
|
+
$server = Server::builder()
|
|
100
|
+
->setServerInfo('My MCP Server', '1.0.0')
|
|
101
|
+
->setDiscovery(
|
|
102
|
+
basePath: __DIR__,
|
|
103
|
+
scanDirs: ['.', 'src'],
|
|
104
|
+
excludeDirs: ['vendor', 'tests'],
|
|
105
|
+
cache: $cache
|
|
106
|
+
)
|
|
107
|
+
->build();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Manual Registration
|
|
111
|
+
|
|
112
|
+
Register capabilities programmatically:
|
|
113
|
+
|
|
114
|
+
```php
|
|
115
|
+
use App\Tools\Calculator;
|
|
116
|
+
use App\Resources\Config;
|
|
117
|
+
|
|
118
|
+
$server = Server::builder()
|
|
119
|
+
->setServerInfo('My MCP Server', '1.0.0')
|
|
120
|
+
->addTool([Calculator::class, 'add'], 'add')
|
|
121
|
+
->addTool([Calculator::class, 'multiply'], 'multiply')
|
|
122
|
+
->addResource([Config::class, 'getSettings'], 'config://app/settings')
|
|
123
|
+
->build();
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Tool Development
|
|
127
|
+
|
|
128
|
+
### Simple Tool with Attribute
|
|
129
|
+
|
|
130
|
+
```php
|
|
131
|
+
<?php
|
|
132
|
+
|
|
133
|
+
namespace App\Tools;
|
|
134
|
+
|
|
135
|
+
use Mcp\Capability\Attribute\McpTool;
|
|
136
|
+
|
|
137
|
+
class Calculator
|
|
138
|
+
{
|
|
139
|
+
/**
|
|
140
|
+
* Adds two numbers together.
|
|
141
|
+
*
|
|
142
|
+
* @param int $a The first number
|
|
143
|
+
* @param int $b The second number
|
|
144
|
+
* @return int The sum of the two numbers
|
|
145
|
+
*/
|
|
146
|
+
#[McpTool]
|
|
147
|
+
public function add(int $a, int $b): int
|
|
148
|
+
{
|
|
149
|
+
return $a + $b;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Tool with Custom Name
|
|
155
|
+
|
|
156
|
+
```php
|
|
157
|
+
use Mcp\Capability\Attribute\McpTool;
|
|
158
|
+
|
|
159
|
+
class FileManager
|
|
160
|
+
{
|
|
161
|
+
/**
|
|
162
|
+
* Reads file content from the filesystem.
|
|
163
|
+
*/
|
|
164
|
+
#[McpTool(name: 'read_file')]
|
|
165
|
+
public function readFileContent(string $path): string
|
|
166
|
+
{
|
|
167
|
+
if (!file_exists($path)) {
|
|
168
|
+
throw new \InvalidArgumentException("File not found: {$path}");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return file_get_contents($path);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Tool with Validation and Schema
|
|
177
|
+
|
|
178
|
+
```php
|
|
179
|
+
use Mcp\Capability\Attribute\{McpTool, Schema};
|
|
180
|
+
|
|
181
|
+
class UserManager
|
|
182
|
+
{
|
|
183
|
+
#[McpTool(name: 'create_user')]
|
|
184
|
+
public function createUser(
|
|
185
|
+
#[Schema(format: 'email')]
|
|
186
|
+
string $email,
|
|
187
|
+
|
|
188
|
+
#[Schema(minimum: 18, maximum: 120)]
|
|
189
|
+
int $age,
|
|
190
|
+
|
|
191
|
+
#[Schema(
|
|
192
|
+
pattern: '^[A-Z][a-z]+$',
|
|
193
|
+
description: 'Capitalized first name'
|
|
194
|
+
)]
|
|
195
|
+
string $firstName
|
|
196
|
+
): array
|
|
197
|
+
{
|
|
198
|
+
return [
|
|
199
|
+
'id' => uniqid(),
|
|
200
|
+
'email' => $email,
|
|
201
|
+
'age' => $age,
|
|
202
|
+
'firstName' => $firstName
|
|
203
|
+
];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Tool with Complex Return Types
|
|
209
|
+
|
|
210
|
+
```php
|
|
211
|
+
use Mcp\Schema\Content\{TextContent, ImageContent};
|
|
212
|
+
|
|
213
|
+
class ReportGenerator
|
|
214
|
+
{
|
|
215
|
+
#[McpTool]
|
|
216
|
+
public function generateReport(string $type): array
|
|
217
|
+
{
|
|
218
|
+
return [
|
|
219
|
+
new TextContent('Report generated:'),
|
|
220
|
+
TextContent::code($this->generateCode($type), 'php'),
|
|
221
|
+
new TextContent('Summary: All checks passed.')
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
#[McpTool]
|
|
226
|
+
public function getChart(string $chartType): ImageContent
|
|
227
|
+
{
|
|
228
|
+
$imageData = $this->generateChartImage($chartType);
|
|
229
|
+
|
|
230
|
+
return new ImageContent(
|
|
231
|
+
data: base64_encode($imageData),
|
|
232
|
+
mimeType: 'image/png'
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Tool with Match Expression
|
|
239
|
+
|
|
240
|
+
```php
|
|
241
|
+
#[McpTool(name: 'calculate')]
|
|
242
|
+
public function performCalculation(float $a, float $b, string $operation): float
|
|
243
|
+
{
|
|
244
|
+
return match($operation) {
|
|
245
|
+
'add' => $a + $b,
|
|
246
|
+
'subtract' => $a - $b,
|
|
247
|
+
'multiply' => $a * $b,
|
|
248
|
+
'divide' => $b != 0 ? $a / $b :
|
|
249
|
+
throw new \InvalidArgumentException('Division by zero'),
|
|
250
|
+
default => throw new \InvalidArgumentException('Invalid operation')
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Resource Implementation
|
|
256
|
+
|
|
257
|
+
### Static Resource
|
|
258
|
+
|
|
259
|
+
```php
|
|
260
|
+
<?php
|
|
261
|
+
|
|
262
|
+
namespace App\Resources;
|
|
263
|
+
|
|
264
|
+
use Mcp\Capability\Attribute\McpResource;
|
|
265
|
+
|
|
266
|
+
class ConfigProvider
|
|
267
|
+
{
|
|
268
|
+
/**
|
|
269
|
+
* Provides the current application configuration.
|
|
270
|
+
*/
|
|
271
|
+
#[McpResource(
|
|
272
|
+
uri: 'config://app/settings',
|
|
273
|
+
name: 'app_settings',
|
|
274
|
+
mimeType: 'application/json'
|
|
275
|
+
)]
|
|
276
|
+
public function getSettings(): array
|
|
277
|
+
{
|
|
278
|
+
return [
|
|
279
|
+
'version' => '1.0.0',
|
|
280
|
+
'debug' => false,
|
|
281
|
+
'features' => ['auth', 'logging']
|
|
282
|
+
];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Resource Template with Variables
|
|
288
|
+
|
|
289
|
+
```php
|
|
290
|
+
use Mcp\Capability\Attribute\McpResourceTemplate;
|
|
291
|
+
|
|
292
|
+
class UserProvider
|
|
293
|
+
{
|
|
294
|
+
/**
|
|
295
|
+
* Retrieves user profile information by ID and section.
|
|
296
|
+
*/
|
|
297
|
+
#[McpResourceTemplate(
|
|
298
|
+
uriTemplate: 'user://{userId}/profile/{section}',
|
|
299
|
+
name: 'user_profile',
|
|
300
|
+
description: 'User profile data by section',
|
|
301
|
+
mimeType: 'application/json'
|
|
302
|
+
)]
|
|
303
|
+
public function getUserProfile(string $userId, string $section): array
|
|
304
|
+
{
|
|
305
|
+
// Variable order must match URI template order
|
|
306
|
+
return $this->users[$userId][$section] ??
|
|
307
|
+
throw new \InvalidArgumentException("Profile section not found");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Resource with File Content
|
|
313
|
+
|
|
314
|
+
```php
|
|
315
|
+
use Mcp\Schema\Content\{TextResourceContents, BlobResourceContents};
|
|
316
|
+
|
|
317
|
+
class FileProvider
|
|
318
|
+
{
|
|
319
|
+
#[McpResource(uri: 'file://readme.txt', mimeType: 'text/plain')]
|
|
320
|
+
public function getReadme(): TextResourceContents
|
|
321
|
+
{
|
|
322
|
+
return new TextResourceContents(
|
|
323
|
+
uri: 'file://readme.txt',
|
|
324
|
+
mimeType: 'text/plain',
|
|
325
|
+
text: file_get_contents(__DIR__ . '/README.txt')
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
#[McpResource(uri: 'file://image.png', mimeType: 'image/png')]
|
|
330
|
+
public function getImage(): BlobResourceContents
|
|
331
|
+
{
|
|
332
|
+
$imageData = file_get_contents(__DIR__ . '/image.png');
|
|
333
|
+
|
|
334
|
+
return new BlobResourceContents(
|
|
335
|
+
uri: 'file://image.png',
|
|
336
|
+
mimeType: 'image/png',
|
|
337
|
+
blob: base64_encode($imageData)
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Prompt Implementation
|
|
344
|
+
|
|
345
|
+
### Basic Prompt
|
|
346
|
+
|
|
347
|
+
```php
|
|
348
|
+
<?php
|
|
349
|
+
|
|
350
|
+
namespace App\Prompts;
|
|
351
|
+
|
|
352
|
+
use Mcp\Capability\Attribute\McpPrompt;
|
|
353
|
+
|
|
354
|
+
class PromptGenerator
|
|
355
|
+
{
|
|
356
|
+
/**
|
|
357
|
+
* Generates a code review request prompt.
|
|
358
|
+
*/
|
|
359
|
+
#[McpPrompt(name: 'code_review')]
|
|
360
|
+
public function reviewCode(string $language, string $code, string $focus = 'general'): array
|
|
361
|
+
{
|
|
362
|
+
return [
|
|
363
|
+
['role' => 'assistant', 'content' => 'You are an expert code reviewer.'],
|
|
364
|
+
['role' => 'user', 'content' => "Review this {$language} code focusing on {$focus}:\n\n```{$language}\n{$code}\n```"]
|
|
365
|
+
];
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Prompt with Mixed Content
|
|
371
|
+
|
|
372
|
+
```php
|
|
373
|
+
use Mcp\Schema\Content\{TextContent, ImageContent};
|
|
374
|
+
use Mcp\Schema\PromptMessage;
|
|
375
|
+
use Mcp\Schema\Enum\Role;
|
|
376
|
+
|
|
377
|
+
#[McpPrompt]
|
|
378
|
+
public function analyzeImage(string $imageUrl, string $question): array
|
|
379
|
+
{
|
|
380
|
+
$imageData = file_get_contents($imageUrl);
|
|
381
|
+
|
|
382
|
+
return [
|
|
383
|
+
new PromptMessage(Role::Assistant, [
|
|
384
|
+
new TextContent('You are an image analysis expert.')
|
|
385
|
+
]),
|
|
386
|
+
new PromptMessage(Role::User, [
|
|
387
|
+
new TextContent($question),
|
|
388
|
+
new ImageContent(
|
|
389
|
+
data: base64_encode($imageData),
|
|
390
|
+
mimeType: 'image/jpeg'
|
|
391
|
+
)
|
|
392
|
+
])
|
|
393
|
+
];
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## Completion Providers
|
|
398
|
+
|
|
399
|
+
### Value List Completion
|
|
400
|
+
|
|
401
|
+
```php
|
|
402
|
+
use Mcp\Capability\Attribute\{McpPrompt, CompletionProvider};
|
|
403
|
+
|
|
404
|
+
#[McpPrompt]
|
|
405
|
+
public function generateContent(
|
|
406
|
+
#[CompletionProvider(values: ['blog', 'article', 'tutorial', 'guide'])]
|
|
407
|
+
string $contentType,
|
|
408
|
+
|
|
409
|
+
#[CompletionProvider(values: ['beginner', 'intermediate', 'advanced'])]
|
|
410
|
+
string $difficulty
|
|
411
|
+
): array
|
|
412
|
+
{
|
|
413
|
+
return [
|
|
414
|
+
['role' => 'user', 'content' => "Create a {$difficulty} level {$contentType}"]
|
|
415
|
+
];
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Enum Completion
|
|
420
|
+
|
|
421
|
+
```php
|
|
422
|
+
enum Priority: string
|
|
423
|
+
{
|
|
424
|
+
case LOW = 'low';
|
|
425
|
+
case MEDIUM = 'medium';
|
|
426
|
+
case HIGH = 'high';
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
enum Status
|
|
430
|
+
{
|
|
431
|
+
case DRAFT;
|
|
432
|
+
case PUBLISHED;
|
|
433
|
+
case ARCHIVED;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
#[McpResourceTemplate(uriTemplate: 'tasks/{taskId}')]
|
|
437
|
+
public function getTask(
|
|
438
|
+
string $taskId,
|
|
439
|
+
|
|
440
|
+
#[CompletionProvider(enum: Priority::class)]
|
|
441
|
+
string $priority,
|
|
442
|
+
|
|
443
|
+
#[CompletionProvider(enum: Status::class)]
|
|
444
|
+
string $status
|
|
445
|
+
): array
|
|
446
|
+
{
|
|
447
|
+
return $this->tasks[$taskId] ?? [];
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Custom Completion Provider
|
|
452
|
+
|
|
453
|
+
```php
|
|
454
|
+
use Mcp\Capability\Prompt\Completion\ProviderInterface;
|
|
455
|
+
|
|
456
|
+
class UserIdCompletionProvider implements ProviderInterface
|
|
457
|
+
{
|
|
458
|
+
public function __construct(
|
|
459
|
+
private DatabaseService $db
|
|
460
|
+
) {}
|
|
461
|
+
|
|
462
|
+
public function getCompletions(string $currentValue): array
|
|
463
|
+
{
|
|
464
|
+
return $this->db->searchUserIds($currentValue);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
#[McpResourceTemplate(uriTemplate: 'user://{userId}/profile')]
|
|
469
|
+
public function getUserProfile(
|
|
470
|
+
#[CompletionProvider(provider: UserIdCompletionProvider::class)]
|
|
471
|
+
string $userId
|
|
472
|
+
): array
|
|
473
|
+
{
|
|
474
|
+
return $this->users[$userId] ??
|
|
475
|
+
throw new \InvalidArgumentException('User not found');
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## Transport Options
|
|
480
|
+
|
|
481
|
+
### Stdio Transport
|
|
482
|
+
|
|
483
|
+
For command-line integration (default):
|
|
484
|
+
|
|
485
|
+
```php
|
|
486
|
+
use Mcp\Server\Transport\StdioTransport;
|
|
487
|
+
|
|
488
|
+
$transport = new StdioTransport();
|
|
489
|
+
$server->run($transport);
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### HTTP Transport
|
|
493
|
+
|
|
494
|
+
For web-based integration:
|
|
495
|
+
|
|
496
|
+
```php
|
|
497
|
+
use Mcp\Server\Transport\StreamableHttpTransport;
|
|
498
|
+
use Nyholm\Psr7\Factory\Psr17Factory;
|
|
499
|
+
|
|
500
|
+
$psr17Factory = new Psr17Factory();
|
|
501
|
+
|
|
502
|
+
$request = $psr17Factory->createServerRequestFromGlobals();
|
|
503
|
+
|
|
504
|
+
$transport = new StreamableHttpTransport(
|
|
505
|
+
$request,
|
|
506
|
+
$psr17Factory, // Response factory
|
|
507
|
+
$psr17Factory // Stream factory
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
$response = $server->run($transport);
|
|
511
|
+
|
|
512
|
+
// Send response in your web framework
|
|
513
|
+
foreach ($response->getHeaders() as $name => $values) {
|
|
514
|
+
foreach ($values as $value) {
|
|
515
|
+
header("$name: $value", false);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
http_response_code($response->getStatusCode());
|
|
520
|
+
echo $response->getBody();
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
## Session Management
|
|
524
|
+
|
|
525
|
+
### In-Memory Sessions (Default)
|
|
526
|
+
|
|
527
|
+
```php
|
|
528
|
+
$server = Server::builder()
|
|
529
|
+
->setServerInfo('My Server', '1.0.0')
|
|
530
|
+
->setSession(ttl: 7200) // 2 hours
|
|
531
|
+
->build();
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### File-Based Sessions
|
|
535
|
+
|
|
536
|
+
```php
|
|
537
|
+
use Mcp\Server\Session\FileSessionStore;
|
|
538
|
+
|
|
539
|
+
$server = Server::builder()
|
|
540
|
+
->setServerInfo('My Server', '1.0.0')
|
|
541
|
+
->setSession(new FileSessionStore(__DIR__ . '/sessions'))
|
|
542
|
+
->build();
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Custom Session Store
|
|
546
|
+
|
|
547
|
+
```php
|
|
548
|
+
use Mcp\Server\Session\InMemorySessionStore;
|
|
549
|
+
|
|
550
|
+
$server = Server::builder()
|
|
551
|
+
->setServerInfo('My Server', '1.0.0')
|
|
552
|
+
->setSession(new InMemorySessionStore(3600))
|
|
553
|
+
->build();
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Error Handling
|
|
557
|
+
|
|
558
|
+
### Exception Handling in Tools
|
|
559
|
+
|
|
560
|
+
```php
|
|
561
|
+
#[McpTool]
|
|
562
|
+
public function divideNumbers(float $a, float $b): float
|
|
563
|
+
{
|
|
564
|
+
if ($b === 0.0) {
|
|
565
|
+
throw new \InvalidArgumentException('Division by zero is not allowed');
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
return $a / $b;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
#[McpTool]
|
|
572
|
+
public function processFile(string $filename): string
|
|
573
|
+
{
|
|
574
|
+
if (!file_exists($filename)) {
|
|
575
|
+
throw new \InvalidArgumentException("File not found: {$filename}");
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (!is_readable($filename)) {
|
|
579
|
+
throw new \RuntimeException("File not readable: {$filename}");
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
return file_get_contents($filename);
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
### Custom Error Responses
|
|
587
|
+
|
|
588
|
+
The SDK automatically converts exceptions into JSON-RPC error responses that MCP clients understand.
|
|
589
|
+
|
|
590
|
+
## Testing
|
|
591
|
+
|
|
592
|
+
### PHPUnit Tests for Tools
|
|
593
|
+
|
|
594
|
+
```php
|
|
595
|
+
<?php
|
|
596
|
+
|
|
597
|
+
namespace Tests;
|
|
598
|
+
|
|
599
|
+
use PHPUnit\Framework\TestCase;
|
|
600
|
+
use App\Tools\Calculator;
|
|
601
|
+
|
|
602
|
+
class CalculatorTest extends TestCase
|
|
603
|
+
{
|
|
604
|
+
private Calculator $calculator;
|
|
605
|
+
|
|
606
|
+
protected function setUp(): void
|
|
607
|
+
{
|
|
608
|
+
$this->calculator = new Calculator();
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
public function testAdd(): void
|
|
612
|
+
{
|
|
613
|
+
$result = $this->calculator->add(5, 3);
|
|
614
|
+
$this->assertSame(8, $result);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
public function testDivideByZero(): void
|
|
618
|
+
{
|
|
619
|
+
$this->expectException(\InvalidArgumentException::class);
|
|
620
|
+
$this->expectExceptionMessage('Division by zero');
|
|
621
|
+
|
|
622
|
+
$this->calculator->divide(10, 0);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### Testing Server Discovery
|
|
628
|
+
|
|
629
|
+
```php
|
|
630
|
+
public function testServerDiscoversTools(): void
|
|
631
|
+
{
|
|
632
|
+
$server = Server::builder()
|
|
633
|
+
->setServerInfo('Test Server', '1.0.0')
|
|
634
|
+
->setDiscovery(__DIR__ . '/../src', ['.'])
|
|
635
|
+
->build();
|
|
636
|
+
|
|
637
|
+
$capabilities = $server->getCapabilities();
|
|
638
|
+
|
|
639
|
+
$this->assertArrayHasKey('tools', $capabilities);
|
|
640
|
+
$this->assertNotEmpty($capabilities['tools']);
|
|
641
|
+
}
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
## Performance Best Practices
|
|
645
|
+
|
|
646
|
+
### Use Discovery Caching
|
|
647
|
+
|
|
648
|
+
Always use caching in production:
|
|
649
|
+
|
|
650
|
+
```php
|
|
651
|
+
use Symfony\Component\Cache\Adapter\RedisAdapter;
|
|
652
|
+
use Symfony\Component\Cache\Psr16Cache;
|
|
653
|
+
|
|
654
|
+
$redis = new \Redis();
|
|
655
|
+
$redis->connect('127.0.0.1', 6379);
|
|
656
|
+
|
|
657
|
+
$cache = new Psr16Cache(new RedisAdapter($redis));
|
|
658
|
+
|
|
659
|
+
$server = Server::builder()
|
|
660
|
+
->setServerInfo('My Server', '1.0.0')
|
|
661
|
+
->setDiscovery(
|
|
662
|
+
basePath: __DIR__,
|
|
663
|
+
scanDirs: ['src'],
|
|
664
|
+
excludeDirs: ['vendor', 'tests', 'var'],
|
|
665
|
+
cache: $cache
|
|
666
|
+
)
|
|
667
|
+
->build();
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
### Optimize Scan Directories
|
|
671
|
+
|
|
672
|
+
Only scan necessary directories:
|
|
673
|
+
|
|
674
|
+
```php
|
|
675
|
+
$server = Server::builder()
|
|
676
|
+
->setDiscovery(
|
|
677
|
+
basePath: __DIR__,
|
|
678
|
+
scanDirs: ['src/Tools', 'src/Resources'], // Specific dirs
|
|
679
|
+
excludeDirs: ['vendor', 'tests', 'var', 'cache']
|
|
680
|
+
)
|
|
681
|
+
->build();
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
### Use OPcache
|
|
685
|
+
|
|
686
|
+
Enable OPcache in production for better PHP performance:
|
|
687
|
+
|
|
688
|
+
```ini
|
|
689
|
+
; php.ini
|
|
690
|
+
opcache.enable=1
|
|
691
|
+
opcache.memory_consumption=256
|
|
692
|
+
opcache.interned_strings_buffer=16
|
|
693
|
+
opcache.max_accelerated_files=10000
|
|
694
|
+
opcache.validate_timestamps=0
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
## Framework Integration
|
|
698
|
+
|
|
699
|
+
### Laravel Integration
|
|
700
|
+
|
|
701
|
+
```php
|
|
702
|
+
// app/Console/Commands/McpServer.php
|
|
703
|
+
namespace App\Console\Commands;
|
|
704
|
+
|
|
705
|
+
use Illuminate\Console\Command;
|
|
706
|
+
use Mcp\Server;
|
|
707
|
+
use Mcp\Server\Transport\StdioTransport;
|
|
708
|
+
|
|
709
|
+
class McpServer extends Command
|
|
710
|
+
{
|
|
711
|
+
protected $signature = 'mcp:serve';
|
|
712
|
+
protected $description = 'Start MCP server';
|
|
713
|
+
|
|
714
|
+
public function handle()
|
|
715
|
+
{
|
|
716
|
+
$server = Server::builder()
|
|
717
|
+
->setServerInfo('Laravel MCP Server', '1.0.0')
|
|
718
|
+
->setDiscovery(app_path(), ['Tools', 'Resources'])
|
|
719
|
+
->build();
|
|
720
|
+
|
|
721
|
+
$transport = new StdioTransport();
|
|
722
|
+
$server->run($transport);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
### Symfony Integration
|
|
728
|
+
|
|
729
|
+
```php
|
|
730
|
+
// Use symfony/mcp-bundle for native integration
|
|
731
|
+
composer require symfony/mcp-bundle
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
## Deployment
|
|
735
|
+
|
|
736
|
+
### Docker Deployment
|
|
737
|
+
|
|
738
|
+
```dockerfile
|
|
739
|
+
FROM php:8.2-cli
|
|
740
|
+
|
|
741
|
+
# Install extensions
|
|
742
|
+
RUN docker-php-ext-install pdo pdo_mysql
|
|
743
|
+
|
|
744
|
+
# Install Composer
|
|
745
|
+
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
|
746
|
+
|
|
747
|
+
# Set working directory
|
|
748
|
+
WORKDIR /app
|
|
749
|
+
|
|
750
|
+
# Copy application
|
|
751
|
+
COPY . /app
|
|
752
|
+
|
|
753
|
+
# Install dependencies
|
|
754
|
+
RUN composer install --no-dev --optimize-autoloader
|
|
755
|
+
|
|
756
|
+
# Make server executable
|
|
757
|
+
RUN chmod +x /app/server.php
|
|
758
|
+
|
|
759
|
+
CMD ["php", "/app/server.php"]
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
### Systemd Service
|
|
763
|
+
|
|
764
|
+
```ini
|
|
765
|
+
[Unit]
|
|
766
|
+
Description=MCP PHP Server
|
|
767
|
+
After=network.target
|
|
768
|
+
|
|
769
|
+
[Service]
|
|
770
|
+
Type=simple
|
|
771
|
+
User=www-data
|
|
772
|
+
WorkingDirectory=/var/www/mcp-server
|
|
773
|
+
ExecStart=/usr/bin/php /var/www/mcp-server/server.php
|
|
774
|
+
Restart=always
|
|
775
|
+
|
|
776
|
+
[Install]
|
|
777
|
+
WantedBy=multi-user.target
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
## Configuration for MCP Clients
|
|
781
|
+
|
|
782
|
+
### Claude Desktop Configuration
|
|
783
|
+
|
|
784
|
+
```json
|
|
785
|
+
{
|
|
786
|
+
"mcpServers": {
|
|
787
|
+
"php-server": {
|
|
788
|
+
"command": "php",
|
|
789
|
+
"args": ["/absolute/path/to/server.php"]
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
### MCP Inspector Testing
|
|
796
|
+
|
|
797
|
+
```bash
|
|
798
|
+
npx @modelcontextprotocol/inspector php /path/to/server.php
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
## Additional Resources
|
|
802
|
+
|
|
803
|
+
- [Official PHP SDK Repository](https://github.com/modelcontextprotocol/php-sdk)
|
|
804
|
+
- [MCP Elements Documentation](https://github.com/modelcontextprotocol/php-sdk/blob/main/docs/mcp-elements.md)
|
|
805
|
+
- [Server Builder Documentation](https://github.com/modelcontextprotocol/php-sdk/blob/main/docs/server-builder.md)
|
|
806
|
+
- [Transport Documentation](https://github.com/modelcontextprotocol/php-sdk/blob/main/docs/transports.md)
|
|
807
|
+
- [Examples](https://github.com/modelcontextprotocol/php-sdk/blob/main/docs/examples.md)
|
|
808
|
+
- [MCP Specification](https://spec.modelcontextprotocol.io/)
|
|
809
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/)
|