From 385849db9262b4deb5c1e23fe29510f548593275 Mon Sep 17 00:00:00 2001 From: Srikanth Patchava Date: Sun, 19 Jul 2026 21:07:19 -0700 Subject: [PATCH] fix: list supported methods in "unknown method" errors The consolidated method-dispatch tools returned a bare "unknown method: " without listing valid methods, unlike labels.go which already says "Supported methods are: ...". Make the error messages consistent across all method-dispatch tools by appending the list of supported methods: - issue_read, sub-issue write (issues.go) - sub-issue read/write (issue_dependencies.go) - ui_get (ui_tools.go) - pull_request_read, pull_request_review_write (pullrequests.go) - projects list/get/write (projects.go) - actions list/get/run (actions.go) Additionally, pull_request_review_write decoded arguments with mapstructure.WeakDecode and did not validate that method was provided, so an omitted method produced a confusing "unknown method: " (empty value). Add an explicit check that reports "missing required parameter: method" with the supported methods. Fixes #2712 Signed-off-by: Srikanth Patchava --- pkg/github/actions.go | 6 +++--- pkg/github/issue_dependencies.go | 6 +++--- pkg/github/issues.go | 4 ++-- pkg/github/projects.go | 8 ++++---- pkg/github/pullrequests.go | 8 ++++++-- pkg/github/ui_tools.go | 2 +- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/pkg/github/actions.go b/pkg/github/actions.go index c16efa0f18..af78e52af4 100644 --- a/pkg/github/actions.go +++ b/pkg/github/actions.go @@ -397,7 +397,7 @@ Use this tool to list workflows in a repository, or list workflow runs, jobs, an result, payload, err := listWorkflowArtifacts(ctx, client, owner, repo, resourceIDInt, pagination) return attachIFC(result), payload, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: list_workflows, list_workflow_runs, list_workflow_jobs, list_workflow_run_artifacts", method)), nil, nil } }, ) @@ -519,7 +519,7 @@ Use this tool to get details about individual workflows, workflow runs, jobs, an result, payload, err := getWorkflowRunLogsURL(ctx, client, owner, repo, resourceIDInt) return attachIFC(result), payload, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: get_workflow, get_workflow_run, get_workflow_job, download_workflow_run_artifact, get_workflow_run_usage, get_workflow_run_logs_url", method)), nil, nil } }, ) @@ -636,7 +636,7 @@ func ActionsRunTrigger(t translations.TranslationHelperFunc) inventory.ServerToo case actionsMethodDeleteWorkflowRunLogs: return deleteWorkflowRunLogs(ctx, client, owner, repo, int64(runID)) default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: run_workflow, rerun_workflow_run, rerun_failed_jobs, cancel_workflow_run, delete_workflow_run_logs", method)), nil, nil } }, ) diff --git a/pkg/github/issue_dependencies.go b/pkg/github/issue_dependencies.go index 49533232d5..1017b6bb10 100644 --- a/pkg/github/issue_dependencies.go +++ b/pkg/github/issue_dependencies.go @@ -100,7 +100,7 @@ Options are: result, err := GetIssueBlocking(ctx, client, owner, repo, issueNumber, opts) return result, nil, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: get_blocked_by, get_blocking", method)), nil, nil } }) st.FeatureFlagEnable = FeatureFlagIssueDependencies @@ -292,7 +292,7 @@ Options are: method = strings.ToLower(method) relationshipType = strings.ToLower(relationshipType) if method != "add" && method != "remove" { - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: add, remove", method)), nil, nil } if relationshipType != "blocked_by" && relationshipType != "blocking" { return utils.NewToolResultError(fmt.Sprintf("unknown type: %s", relationshipType)), nil, nil @@ -373,7 +373,7 @@ func writeIssueDependency(ctx context.Context, client *github.Client, method str } return dependencyWriteResult("dependency removed", blockedIssue, blockingIssue, blocked, blocking), nil default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: add, remove", method)), nil } } diff --git a/pkg/github/issues.go b/pkg/github/issues.go index bbccdc35d8..05cdd0828d 100644 --- a/pkg/github/issues.go +++ b/pkg/github/issues.go @@ -707,7 +707,7 @@ func IssueRead(t translations.TranslationHelperFunc) inventory.ServerTool { result, err := GetIssueLabels(ctx, gqlClient, owner, repo, issueNumber) return attachIFC(result), nil, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: get, get_comments, get_sub_issues, get_parent, get_labels", method)), nil, nil } }) } @@ -1485,7 +1485,7 @@ func SubIssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool { result, err := ReprioritizeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, afterID, beforeID) return result, nil, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: add, remove, reprioritize", method)), nil, nil } }) st.FeatureFlagDisable = []string{FeatureFlagIssuesGranular} diff --git a/pkg/github/projects.go b/pkg/github/projects.go index 308c2b87e8..5cad833d89 100644 --- a/pkg/github/projects.go +++ b/pkg/github/projects.go @@ -296,10 +296,10 @@ Use this tool to list projects for a user or organization, or list project field result = attachStaticIFCLabel(ctx, deps, result, ifc.LabelProjectContent(isPrivate)) return result, payload, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: list_project_fields, list_project_items, list_project_status_updates", method)), nil, nil } default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: list_projects, list_project_fields, list_project_items, list_project_status_updates", method)), nil, nil } }, ) @@ -483,7 +483,7 @@ Use this tool to get details about individual projects, project fields, and proj } return result, payload, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: get_project, get_project_field, get_project_item, get_project_status_update", method)), nil, nil } }, ) @@ -749,7 +749,7 @@ func ProjectsWrite(t translations.TranslationHelperFunc) inventory.ServerTool { case projectsMethodCreateIterationField: return createIterationField(ctx, gqlClient, owner, ownerType, projectNumber, args) default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: add_project_item, update_project_item, delete_project_item, create_project_status_update, create_iteration_field, create_project", method)), nil, nil } }, ) diff --git a/pkg/github/pullrequests.go b/pkg/github/pullrequests.go index 942cfd3a91..7d3b612927 100644 --- a/pkg/github/pullrequests.go +++ b/pkg/github/pullrequests.go @@ -155,7 +155,7 @@ Possible options: result, err := GetPullRequestCheckRuns(ctx, client, owner, repo, pullNumber, pagination) return attachIFC(result), nil, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: get, get_diff, get_status, get_files, get_commits, get_review_comments, get_reviews, get_comments, get_check_runs", method)), nil, nil } }) } @@ -1892,6 +1892,10 @@ Available methods: return utils.NewToolResultError(err.Error()), nil, nil } + if params.Method == "" { + return utils.NewToolResultError("missing required parameter: method. Supported methods are: create, submit_pending, delete_pending, resolve_thread, unresolve_thread"), nil, nil + } + // Given our owner, repo and PR number, lookup the GQL ID of the PR. client, err := deps.GetGQLClient(ctx) if err != nil { @@ -1915,7 +1919,7 @@ Available methods: result, err := ResolveReviewThread(ctx, client, params.ThreadID, false) return result, nil, err default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", params.Method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: create, submit_pending, delete_pending, resolve_thread, unresolve_thread", params.Method)), nil, nil } }) st.FeatureFlagDisable = []string{FeatureFlagPullRequestsGranular} diff --git a/pkg/github/ui_tools.go b/pkg/github/ui_tools.go index 3fa4afcb15..d5220ff810 100644 --- a/pkg/github/ui_tools.go +++ b/pkg/github/ui_tools.go @@ -96,7 +96,7 @@ func UIGet(t translations.TranslationHelperFunc) inventory.ServerTool { case "reviewers": return uiGetReviewers(ctx, deps, args, owner) default: - return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil + return utils.NewToolResultError(fmt.Sprintf("unknown method: %s. Supported methods are: labels, assignees, milestones, issue_types, branches, issue_fields, reviewers", method)), nil, nil } }) st.FeatureFlagEnable = MCPAppsFeatureFlag