SKILL.blade.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ---
  2. name: mcp-development
  3. description: "Use this skill for Laravel MCP development only. Trigger when creating or editing MCP tools, resources, prompts, or servers in Laravel projects. Covers: artisan make:mcp-* generators, mcp:inspector, routes/ai.php, Tool/Resource/Prompt classes, schema validation, shouldRegister(), OAuth setup, URI templates, read-only attributes, and MCP debugging. Do not use for non-Laravel MCP projects or generic AI features without MCP."
  4. license: MIT
  5. metadata:
  6. author: laravel
  7. ---
  8. @php
  9. /** @var \Laravel\Boost\Install\GuidelineAssist $assist */
  10. @endphp
  11. # MCP Development
  12. ## Documentation First
  13. **CRITICAL**: Always use `search-docs` BEFORE writing MCP code. The documentation is version-specific, comprehensive, and always up-to-date.
  14. @boostsnippet("Search MCP Documentation", "bash")
  15. # Example searches
  16. search-docs(['mcp tools', 'mcp resources', 'mcp validation'])
  17. @endboostsnippet
  18. ## Quick Reference
  19. ### Artisan Commands
  20. Create MCP Primitives
  21. ```bash
  22. {{ $assist->artisanCommand('make:mcp-tool ToolName') }}
  23. {{ $assist->artisanCommand('make:mcp-resource ResourceName') }}
  24. {{ $assist->artisanCommand('make:mcp-prompt PromptName') }}
  25. {{ $assist->artisanCommand('make:mcp-server ServerName') }}
  26. ```
  27. ### Basic Tool Implementation
  28. @boostsnippet("Tool Example", "php")
  29. use Illuminate\Contracts\JsonSchema\JsonSchema;
  30. use Laravel\Mcp\Request;
  31. use Laravel\Mcp\Response;
  32. use Laravel\Mcp\Server\Tool;
  33. class MyTool extends Tool
  34. {
  35. protected string $description = 'Tool description for LLM';
  36. public function schema(JsonSchema $schema): array
  37. {
  38. return [
  39. 'param' => $schema->string()->required(),
  40. ];
  41. }
  42. public function handle(Request $request): Response
  43. {
  44. return Response::text($request->get('param'));
  45. }
  46. }
  47. @endboostsnippet
  48. ### Basic Resource Implementation
  49. @boostsnippet("Resource Example", "php")
  50. use Laravel\Mcp\Response;
  51. use Laravel\Mcp\Server\Resource;
  52. class MyResource extends Resource
  53. {
  54. protected string $description = 'Resource description';
  55. protected string $uri = 'file://path/to/resource';
  56. protected string $mimeType = 'text/markdown';
  57. public function handle(): Response
  58. {
  59. return Response::text($content);
  60. }
  61. }
  62. @endboostsnippet
  63. ### Response Methods
  64. @boostsnippet("Available Responses", "php")
  65. Response::text('Text content');
  66. Response::error('Error message');
  67. Response::structured(['key' => 'value']);
  68. @endboostsnippet
  69. ## Testing MCP Primitives
  70. Test tools, resources, and prompts directly on their server:
  71. @boostsnippet("Test MCP Primitives", "php")
  72. // Test a tool
  73. $response = MyServer::tool(MyTool::class, ['param' => 'value']);
  74. $response->assertOk()->assertSee('Expected text');
  75. // Test as authenticated user
  76. $response = MyServer::actingAs($user)->tool(MyTool::class, [...]);
  77. // Available assertions
  78. $response->assertOk();
  79. $response->assertSee('text');
  80. $response->assertHasErrors();
  81. $response->assertHasNoErrors();
  82. $response->assertName('tool-name');
  83. $response->assertSentNotification('event/type', ['data' => 'value']);
  84. @endboostsnippet
  85. ### MCP Inspector
  86. Test interactively using the inspector:
  87. <!--Launch MCP Inspector-->
  88. ```bash
  89. {{ $assist->artisanCommand('mcp:inspector mcp/my-server') }} # Web server
  90. {{ $assist->artisanCommand('mcp:inspector my-server') }} # Local server
  91. ```
  92. ## Available Features
  93. The following features exist—**use `search-docs` for implementation details**:
  94. - **Tools**: `schema()`, validation, annotations (`#[IsReadOnly]`, `#[IsDestructive]`, etc.)
  95. - **Resources**: URI templates (`HasUriTemplate`), Dynamic resources
  96. - **Prompts**: Arguments, multi-message responses
  97. - **All primitives**: Dependency injection, `shouldRegister()`, validation
  98. - **Responses**: Text, error, structured, streaming, metadata
  99. - **Server registration**: Web routes, local routes, OAuth
  100. ## Critical Imports
  101. @boostsnippet("Correct Imports", "php")
  102. use Laravel\Mcp\Request; // NOT Laravel\Mcp\Server\Request
  103. use Laravel\Mcp\Response; // NOT Laravel\Mcp\Server\Response
  104. use Laravel\Mcp\Server\Tool;
  105. use Laravel\Mcp\Server\Resource;
  106. use Laravel\Mcp\Server\Prompt;
  107. use Illuminate\Contracts\JsonSchema\JsonSchema;
  108. @endboostsnippet
  109. ## Common Pitfalls
  110. - **Not using `search-docs` before implementation**
  111. - Wrong imports: `Laravel\Mcp\Server\Request` (wrong) vs `Laravel\Mcp\Request` (correct)
  112. - Forgetting `schema()` method for tools with parameters
  113. - Missing required properties: `$description`, `$uri`, `$mimeType`
  114. - Wrong response pattern: `new Response()` instead of `Response::text()`
  115. - Running `mcp:start` command locally (hangs waiting for stdin)