Skip to content

Commit 732e220

Browse files
committed
feat: improve static analysis
1 parent 223c565 commit 732e220

File tree

6 files changed

+35
-39
lines changed

6 files changed

+35
-39
lines changed

src/Console/Commands/InspectorCommand.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public function handle(Registrar $registrar): int
3636
$route = $registrar->getWebServer($handle);
3737

3838
$servers = $registrar->servers();
39-
if (empty($servers)) {
39+
if ($servers === []) {
4040
$this->components->error('No MCP servers found. Please run `php artisan make:mcp-server [name]`');
4141

4242
return static::FAILURE;
@@ -47,7 +47,7 @@ public function handle(Registrar $registrar): int
4747
$server = array_shift($servers);
4848
[$localServer, $route] = match (true) {
4949
is_callable($server) => [$server, null],
50-
get_class($server) === Route::class => [null, $server],
50+
$server::class === Route::class => [null, $server],
5151
default => [null, null],
5252
};
5353
}

src/Server/Middleware/ReorderJsonAccept.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function handle(Request $request, Closure $next): Response
2626
return $next($request);
2727
}
2828

29-
usort($accept, fn ($a, $b) => str_contains($b, 'application/json') <=> str_contains($a, 'application/json'));
29+
usort($accept, fn ($a, $b): int => str_contains((string) $b, 'application/json') <=> str_contains((string) $a, 'application/json'));
3030
$request->headers->set('Accept', implode(', ', $accept));
3131

3232
return $next($request);

src/Server/Registrar.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Registrar
3030
public function web(string $route, string $serverClass): Route
3131
{
3232
// https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#listening-for-messages-from-the-server
33-
Router::get($route, fn () => response(status: 405));
33+
Router::get($route, fn (): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response(status: 405));
3434

3535
$route = Router::post($route, fn (): mixed => $this->startServer(
3636
$serverClass,

src/Server/Transport/HttpTransport.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function run(): Response|StreamedResponse
5252
}
5353

5454
// Must be 202 - https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#sending-messages-to-the-server
55-
$statusCode = empty($this->reply) ? 202 : 200;
55+
$statusCode = $this->reply === null || $this->reply === '' || $this->reply === '0' ? 202 : 200;
5656
$response = response($this->reply, $statusCode, $this->getHeaders());
5757

5858
assert($response instanceof Response);

tests/Feature/Console/StartCommandTest.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -169,21 +169,19 @@
169169
expect($response->json())->toEqual(expectedListToolsResponse());
170170
});
171171

172-
it('returns 405 for GET requests to MCP web routes', function () {
172+
it('returns 405 for GET requests to MCP web routes', function (): void {
173173
$response = $this->get('test-mcp');
174174

175175
$response->assertStatus(405);
176176
$response->assertSee('');
177177
});
178178

179-
it('returns OAuth WWW-Authenticate header when OAuth routes are enabled and response is 401', function () {
179+
it('returns OAuth WWW-Authenticate header when OAuth routes are enabled and response is 401', function (): void {
180180
// Enable OAuth routes which registers the 'mcp.oauth.protected-resource' route
181-
app('Laravel\Mcp\Server\Registrar')->oauthRoutes();
181+
app(\Laravel\Mcp\Server\Registrar::class)->oauthRoutes();
182182

183183
// Create a test route that returns 401 to trigger the middleware
184-
Route::post('test-oauth-401', function () {
185-
return response()->json(['error' => 'unauthorized'], 401);
186-
})->middleware(['Laravel\Mcp\Server\Middleware\AddWwwAuthenticateHeader']);
184+
Route::post('test-oauth-401', fn() => response()->json(['error' => 'unauthorized'], 401))->middleware([\Laravel\Mcp\Server\Middleware\AddWwwAuthenticateHeader::class]);
187185

188186
$response = $this->postJson('test-oauth-401', []);
189187

@@ -195,11 +193,9 @@
195193
expect($wwwAuth)->toContain('resource_metadata="'.url('/.well-known/oauth-protected-resource').'"');
196194
});
197195

198-
it('returns Sanctum WWW-Authenticate header when OAuth routes are not enabled and response is 401', function () {
196+
it('returns Sanctum WWW-Authenticate header when OAuth routes are not enabled and response is 401', function (): void {
199197
// Create a test route that returns 401 to trigger the middleware
200-
Route::post('test-sanctum-401', function () {
201-
return response()->json(['error' => 'unauthorized'], 401);
202-
})->middleware(['Laravel\Mcp\Server\Middleware\AddWwwAuthenticateHeader']);
198+
Route::post('test-sanctum-401', fn() => response()->json(['error' => 'unauthorized'], 401))->middleware([\Laravel\Mcp\Server\Middleware\AddWwwAuthenticateHeader::class]);
203199

204200
$response = $this->postJson('test-sanctum-401', []);
205201

@@ -210,8 +206,8 @@
210206
expect($wwwAuth)->toBe('Bearer realm="mcp", error="invalid_token"');
211207
});
212208

213-
it('does not add WWW-Authenticate header when response is not 401', function () {
214-
app('Laravel\Mcp\Server\Registrar')->oauthRoutes();
209+
it('does not add WWW-Authenticate header when response is not 401', function (): void {
210+
app(\Laravel\Mcp\Server\Registrar::class)->oauthRoutes();
215211

216212
$response = $this->postJson('test-mcp', initializeMessage());
217213

tests/Unit/Server/Middleware/ReorderJsonAcceptTest.php

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,57 @@
33
use Illuminate\Http\Request;
44
use Laravel\Mcp\Server\Middleware\ReorderJsonAccept;
55

6-
it('leaves single accept header unchanged', function () {
6+
it('leaves single accept header unchanged', function (): void {
77
$request = new Request;
88
$request->headers->set('Accept', 'application/json');
99

1010
$middleware = new ReorderJsonAccept;
1111

12-
$middleware->handle($request, fn ($req) => response('test'));
12+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
1313

1414
expect($request->header('Accept'))->toBe('application/json');
1515
});
1616

17-
it('leaves non-comma separated accept header unchanged', function () {
17+
it('leaves non-comma separated accept header unchanged', function (): void {
1818
$request = new Request;
1919
$request->headers->set('Accept', 'text/html');
2020

2121
$middleware = new ReorderJsonAccept;
2222

23-
$middleware->handle($request, fn ($req) => response('test'));
23+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
2424

2525
expect($request->header('Accept'))->toBe('text/html');
2626
});
2727

28-
it('reorders multiple accept headers to prioritize json', function () {
28+
it('reorders multiple accept headers to prioritize json', function (): void {
2929
$request = new Request;
3030
$request->headers->set('Accept', 'text/html, application/json, text/plain');
3131

3232
$middleware = new ReorderJsonAccept;
3333

34-
$middleware->handle($request, fn ($req) => response('test'));
34+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
3535

3636
expect($request->header('Accept'))->toBe('application/json, text/html, text/plain');
3737
});
3838

39-
it('handles json already first in list', function () {
39+
it('handles json already first in list', function (): void {
4040
$request = new Request;
4141
$request->headers->set('Accept', 'application/json, text/html, text/plain');
4242

4343
$middleware = new ReorderJsonAccept;
4444

45-
$middleware->handle($request, fn ($req) => response('test'));
45+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
4646

4747
expect($request->header('Accept'))->toBe('application/json, text/html, text/plain');
4848
});
4949

50-
it('handles multiple json types correctly', function () {
50+
it('handles multiple json types correctly', function (): void {
5151
$request = new Request;
5252
$request->headers->set('Accept', 'text/html, application/json, application/vnd.api+json, text/plain');
5353

5454
$middleware = new ReorderJsonAccept;
5555

56-
$middleware->handle($request, fn ($req) => response('test'));
56+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
5757

5858
$accept = $request->header('Accept');
5959
$parts = array_map('trim', explode(',', $accept));
@@ -62,70 +62,70 @@
6262
->and(count($parts))->toBe(4);
6363
});
6464

65-
it('handles accept header with quality values', function () {
65+
it('handles accept header with quality values', function (): void {
6666
$request = new Request;
6767
$request->headers->set('Accept', 'text/html;q=0.9, application/json;q=0.8, text/plain;q=0.7');
6868

6969
$middleware = new ReorderJsonAccept;
7070

71-
$middleware->handle($request, fn ($req) => response('test'));
71+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
7272

7373
$accept = $request->header('Accept');
7474
$parts = array_map('trim', explode(',', $accept));
7575

7676
expect($parts[0])->toBe('application/json;q=0.8');
7777
});
7878

79-
it('handles whitespace in accept header', function () {
79+
it('handles whitespace in accept header', function (): void {
8080
$request = new Request;
8181
$request->headers->set('Accept', ' text/html , application/json , text/plain ');
8282

8383
$middleware = new ReorderJsonAccept;
8484

85-
$middleware->handle($request, fn ($req) => response('test'));
85+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
8686

8787
expect($request->header('Accept'))->toBe('application/json, text/html, text/plain');
8888
});
8989

90-
it('handles no json in accept header', function () {
90+
it('handles no json in accept header', function (): void {
9191
$request = new Request;
9292
$request->headers->set('Accept', 'text/html, text/plain, image/png');
9393

9494
$middleware = new ReorderJsonAccept;
9595

96-
$middleware->handle($request, fn ($req) => response('test'));
96+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
9797

9898
expect($request->header('Accept'))->toBe('text/html, text/plain, image/png');
9999
});
100100

101-
it('handles empty accept header', function () {
101+
it('handles empty accept header', function (): void {
102102
$request = new Request;
103103
$request->headers->set('Accept', '');
104104

105105
$middleware = new ReorderJsonAccept;
106106

107-
$middleware->handle($request, fn ($req) => response('test'));
107+
$middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
108108

109109
expect($request->header('Accept'))->toBe('');
110110
});
111111

112-
it('handles missing accept header', function () {
112+
it('handles missing accept header', function (): void {
113113
$request = new Request;
114114

115115
$middleware = new ReorderJsonAccept;
116116

117-
$response = $middleware->handle($request, fn ($req) => response('test'));
117+
$response = $middleware->handle($request, fn ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response => response('test'));
118118

119119
expect($response->getContent())->toBe('test');
120120
});
121121

122-
it('passes request through middleware correctly', function () {
122+
it('passes request through middleware correctly', function (): void {
123123
$request = new Request;
124124
$request->headers->set('Accept', 'text/html, application/json');
125125

126126
$middleware = new ReorderJsonAccept;
127127

128-
$response = $middleware->handle($request, function ($req) {
128+
$response = $middleware->handle($request, function ($req): \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response {
129129
expect($req->header('Accept'))->toBe('application/json, text/html');
130130

131131
return response('middleware worked');

0 commit comments

Comments
 (0)