test(mcp): 13 PM tool tests + fix jsonschema tags

Add tools_pm_test.go with 13 integration tests covering all 16 PM
tools via SDK in-memory transport with fake services.

Fix jsonschema tags in tools_pm.go and tools_chat.go — SDK's tag
parser rejects "required,min=1" and "required,description=X" syntax;
use plain description text instead (non-pointer fields are auto-required).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-08 11:52:24 +08:00
parent 7d9164d478
commit 62d9a91ca5
3 changed files with 604 additions and 27 deletions
+24 -24
View File
@@ -76,7 +76,7 @@ func registerListProjects(srv *mcpsdk.Server, deps ServerDeps) {
// ===== list_workspaces =====
type listWorkspacesIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required,project slug"`
ProjectSlug string `json:"project_slug" jsonschema:"project slug"`
}
type workspaceSummary struct {
ID string `json:"id"`
@@ -126,7 +126,7 @@ func registerListWorkspaces(srv *mcpsdk.Server, deps ServerDeps) {
// ===== list_requirements =====
type listRequirementsIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Phase string `json:"phase,omitempty"`
Status string `json:"status,omitempty"`
}
@@ -178,7 +178,7 @@ func registerListRequirements(srv *mcpsdk.Server, deps ServerDeps) {
// ===== list_issues =====
type listIssuesIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
RequirementNumber any `json:"requirement_number,omitempty"`
Status string `json:"status,omitempty"`
AssigneeID string `json:"assignee_id,omitempty"`
@@ -246,8 +246,8 @@ func registerListIssues(srv *mcpsdk.Server, deps ServerDeps) {
// ===== get_issue =====
type getIssueIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
}
type issueDetail struct {
Number int `json:"number"`
@@ -289,8 +289,8 @@ func registerGetIssue(srv *mcpsdk.Server, deps ServerDeps) {
// ===== get_requirement =====
type getRequirementIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
}
type requirementDetail struct {
Number int `json:"number"`
@@ -334,8 +334,8 @@ func registerGetRequirement(srv *mcpsdk.Server, deps ServerDeps) {
// ===== create_issue =====
type createIssueIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Title string `json:"title" jsonschema:"required,minLength=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Title string `json:"title" jsonschema:"title (non-empty)"`
Description string `json:"description,omitempty"`
}
type issueCreateOut struct {
@@ -377,8 +377,8 @@ func registerCreateIssue(srv *mcpsdk.Server, deps ServerDeps) {
// ===== update_issue =====
type updateIssueIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
}
@@ -426,8 +426,8 @@ func registerUpdateIssue(srv *mcpsdk.Server, deps ServerDeps) {
// ===== close/reopen_issue =====
type closeIssueIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
}
type okOut struct {
OK bool `json:"ok"`
@@ -486,8 +486,8 @@ func registerReopenIssue(srv *mcpsdk.Server, deps ServerDeps) {
// ===== assign_issue =====
type assignIssueIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
AssigneeID *string `json:"assignee_id,omitempty"`
}
@@ -527,8 +527,8 @@ func registerAssignIssue(srv *mcpsdk.Server, deps ServerDeps) {
// ===== create_requirement =====
type createRequirementIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Title string `json:"title" jsonschema:"required,minLength=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Title string `json:"title" jsonschema:"title (non-empty)"`
Description string `json:"description,omitempty"`
}
type requirementCreateOut struct {
@@ -571,8 +571,8 @@ func registerCreateRequirement(srv *mcpsdk.Server, deps ServerDeps) {
// ===== update_requirement =====
type updateRequirementIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
}
@@ -617,8 +617,8 @@ func registerUpdateRequirement(srv *mcpsdk.Server, deps ServerDeps) {
// ===== close/reopen_requirement =====
type closeRequirementIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
}
func registerCloseRequirement(srv *mcpsdk.Server, deps ServerDeps) {
@@ -674,9 +674,9 @@ func registerReopenRequirement(srv *mcpsdk.Server, deps ServerDeps) {
// ===== set_requirement_phase =====
type setRequirementPhaseIn struct {
ProjectSlug string `json:"project_slug" jsonschema:"required"`
Number int `json:"number" jsonschema:"required,min=1"`
Phase string `json:"phase" jsonschema:"required"`
ProjectSlug string `json:"project_slug" jsonschema:"required field"`
Number int `json:"number" jsonschema:"issue number (>=1)"`
Phase string `json:"phase" jsonschema:"required field"`
}
func registerSetRequirementPhase(srv *mcpsdk.Server, deps ServerDeps) {