You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add rationale and is_suggestion support to assignees in issue_write
Update the issue_write MCP tool (IssueWrite, the FeatureFlagIssueFields-enabled
variant) to accept assignees in polymorphic form: either plain strings (backward-
compatible) or objects with login, rationale, confidence, and is_suggestion fields.
When object-form assignees are provided, the handler:
1. Skips assignees in the standard UpdateIssue call
2. Makes a follow-up PATCH with the assignees in object form including intent
metadata (rationale, confidence, suggest)
This mirrors the pattern used for labels in GranularUpdateIssueLabels and type in
GranularUpdateIssueType, gated behind FeatureFlagIssueFields.
The REST API already supports: { "assignees": [{ "login": "octocat",
"rationale": "...", "suggest": true }] }
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
-`type`: Type of this issue. Only use if issue types are enabled for this repository. Use list_issue_types tool to get valid type values for this repository or its owner organization. If the repository doesn't support issue types, omit this parameter. (string, optional)
-**issue_write** - Create or update issue/pull request
101
101
-**Required OAuth Scopes**: `repo`
102
-
-`assignees`: Usernames to assign to this issue (string[], optional)
102
+
-`assignees`: Usernames to assign to this issue. ([], optional)
103
103
-`body`: Issue body content (string, optional)
104
104
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
105
105
-`issue_fields`: Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'. (object[], optional)
Copy file name to clipboardExpand all lines: docs/insiders-features.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -69,7 +69,7 @@ The list below is generated from the Go source. It covers tool **inventory and s
69
69
-`type`: Type of this issue. Only use if issue types are enabled for this repository. Use list_issue_types tool to get valid type values for this repository or its owner organization. If the repository doesn't support issue types, omit this parameter. (string, optional)
-`method`: The type of data to fetch (string, required)
75
75
-`owner`: Repository owner (required for all methods) (string, required)
@@ -93,7 +93,7 @@ The list below is generated from the Go source. It covers tool **inventory and s
93
93
94
94
-**issue_write** - Create or update issue/pull request
95
95
-**Required OAuth Scopes**: `repo`
96
-
-`assignees`: Usernames to assign to this issue (string[], optional)
96
+
-`assignees`: Usernames to assign to this issue. ([], optional)
97
97
-`body`: Issue body content (string, optional)
98
98
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
99
99
-`issue_fields`: Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'. (object[], optional)
Copy file name to clipboardExpand all lines: pkg/github/__toolsnaps__/issue_write_ff_remote_mcp_issue_fields.snap
+37-2Lines changed: 37 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -15,9 +15,44 @@
15
15
"inputSchema": {
16
16
"properties": {
17
17
"assignees": {
18
-
"description": "Usernames to assign to this issue",
18
+
"description": "Usernames to assign to this issue.",
19
19
"items": {
20
-
"type": "string"
20
+
"oneOf": [
21
+
{
22
+
"description": "GitHub username",
23
+
"type": "string"
24
+
},
25
+
{
26
+
"properties": {
27
+
"confidence": {
28
+
"description": "How confident you are in this choice. Use 'HIGH' for clear signal or explicit user request, 'MEDIUM' for reasonable inference with some ambiguity, 'LOW' for best guess with limited signal.",
29
+
"enum": [
30
+
"LOW",
31
+
"MEDIUM",
32
+
"HIGH"
33
+
],
34
+
"type": "string"
35
+
},
36
+
"is_suggestion": {
37
+
"description": "If true, this assignee is sent to the API as a suggestion (suggest:true) rather than a direct assignment. Whether the assignee is applied or recorded as a proposal is determined by the API.",
38
+
"type": "boolean"
39
+
},
40
+
"login": {
41
+
"description": "GitHub username",
42
+
"type": "string"
43
+
},
44
+
"rationale": {
45
+
"description": "One concise sentence explaining why this person is the right assignee. State the concrete signal (e.g. 'Owns the auth module where the bug was reported').",
Copy file name to clipboardExpand all lines: pkg/github/issues.go
+182-6Lines changed: 182 additions & 6 deletions
Original file line number
Diff line number
Diff line change
@@ -1913,9 +1913,37 @@ Options are:
1913
1913
},
1914
1914
"assignees": {
1915
1915
Type: "array",
1916
-
Description: "Usernames to assign to this issue",
1916
+
Description: "Usernames to assign to this issue.",
1917
1917
Items: &jsonschema.Schema{
1918
-
Type: "string",
1918
+
OneOf: []*jsonschema.Schema{
1919
+
{Type: "string", Description: "GitHub username"},
1920
+
{
1921
+
Type: "object",
1922
+
Properties: map[string]*jsonschema.Schema{
1923
+
"login": {
1924
+
Type: "string",
1925
+
Description: "GitHub username",
1926
+
},
1927
+
"rationale": {
1928
+
Type: "string",
1929
+
Description: "One concise sentence explaining why this person is the right assignee. "+
1930
+
"State the concrete signal (e.g. 'Owns the auth module where the bug was reported').",
1931
+
MaxLength: jsonschema.Ptr(280),
1932
+
},
1933
+
"confidence": {
1934
+
Type: "string",
1935
+
Description: "How confident you are in this choice. Use 'HIGH' for clear signal or explicit user request, 'MEDIUM' for reasonable inference with some ambiguity, 'LOW' for best guess with limited signal.",
1936
+
Enum: []any{"LOW", "MEDIUM", "HIGH"},
1937
+
},
1938
+
"is_suggestion": {
1939
+
Type: "boolean",
1940
+
Description: "If true, this assignee is sent to the API as a suggestion (suggest:true) rather than a direct assignment. "+
1941
+
"Whether the assignee is applied or recorded as a proposal is determined by the API.",
returnnil, nil, false, fmt.Errorf("each assignee must be a string or an object with 'login' and optional 'rationale', 'confidence', and/or 'is_suggestion'")
2590
+
}
2591
+
}
2592
+
returnlogins, payload, useObjectForm, nil
2593
+
}
2594
+
2595
+
// patchAssigneesWithIntent sends a PATCH request with object-form assignees
2596
+
// that include rationale, confidence, and/or suggest metadata.
0 commit comments