Add KanbanGit MCP v0.1 #40

Merged
Twyco merged 4 commits from codex/mcp-v0-1 into main 2026-04-24 13:27:36 +00:00
2 changed files with 12 additions and 1 deletions
Showing only changes of commit c79c7bf22e - Show all commits
+3 -1
View File
@@ -31,7 +31,9 @@ class ListTicketsByStatus extends Tool
'project_id' => ['nullable', 'integer'],
'status_name' => ['nullable', 'string'],
'status_slug' => ['nullable', 'string'],
'ticket_status_id' => ['nullable', 'integer'],
'ticket_status_id' => ['nullable', 'integer', 'required_without_all:status_slug,status_name'],
Outdated
Review

Should fix: this tool schema accepts a call with none of ticket_status_id, status_slug, or status_name, and only fails later inside resolveTicketStatuses(). That makes the MCP contract looser than the real behavior. Please enforce an at least one of rule here (or equivalent explicit validation) so clients get a schema-level/tool-level error instead of discovering it only at runtime.

Should fix: this tool schema accepts a call with none of `ticket_status_id`, `status_slug`, or `status_name`, and only fails later inside `resolveTicketStatuses()`. That makes the MCP contract looser than the real behavior. Please enforce an `at least one of` rule here (or equivalent explicit validation) so clients get a schema-level/tool-level error instead of discovering it only at runtime.
], [
'ticket_status_id.required_without_all' => 'Provide ticket_status_id, status_slug, or status_name.',
]);
$user = $this->kanbanGitMcp->user($request);
+9
View File
1
@@ -319,6 +319,15 @@ class KanbanGitMcpTest extends TestCase
->etc());
}
public function test_list_tickets_by_status_requires_a_status_selector(): void
{
$user = User::factory()->create();
KanbanGitServer::actingAs($user)
->tool(ListTicketsByStatus::class)
->assertHasErrors(['Provide ticket_status_id, status_slug, or status_name.']);
}
public function test_ambiguous_status_name_returns_mcp_error(): void
{
$user = User::factory()->create();