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
feat: gate issue_write and get_issue behind remote_mcp_issue_fields flag
Ports the gating from PR #2553 onto main (the original merge landed on a
stack base that did not make it to main).
Changes:
- pkg/inventory: FeatureFlagDisable becomes []string (any-listed-on → hide).
FeatureFlagEnable stays as a single string. This avoids the AND-of-enable
semantics from the earlier proposal, which encoded dependencies rather
than rollout knobs and had no real call site. Disable-OR is the case
that does need the slice (LegacyIssueWrite below).
- pkg/github/issues.go: split IssueWrite into IssueWrite (flag-enabled,
exposes issue_fields) and LegacyIssueWrite (flag-disabled, omits it).
Both register as 'issue_write'; mutually exclusive flag annotations
pick exactly one at runtime. Refactored into a shared buildIssueWrite
helper instead of duplicating the ~250-line tool definition.
- pkg/github/issues.go: GetIssue field_values enrichment now requires
the flag at runtime. The verbose REST IssueFieldValues is always
cleared from the response.
- Existing single-flag Disable call sites converted to slices.
- New toolsnap variant issue_write_ff_remote_mcp_issue_fields.snap; the
canonical issue_write.snap is owned by LegacyIssueWrite.
- README + flag docs regenerated.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy file name to clipboardExpand all lines: README.md
-1Lines changed: 0 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -855,7 +855,6 @@ The following sets of tools are available:
855
855
-`assignees`: Usernames to assign to this issue (string[], optional)
856
856
-`body`: Issue body content (string, optional)
857
857
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
858
-
-`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)
859
858
-`issue_number`: Issue number to update (number, optional)
860
859
-`labels`: Labels to apply to this issue (string[], optional)
861
860
-`method`: Write operation to perform on a single issue.
-`assignees`: Usernames to assign to this issue (string[], optional)
57
57
-`body`: Issue body content (string, optional)
58
58
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
59
-
-`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)
60
59
-`issue_number`: Issue number to update (number, optional)
61
60
-`labels`: Labels to apply to this issue (string[], optional)
62
61
-`method`: Write operation to perform on a single issue.
-`assignees`: Usernames to assign to this issue (string[], optional)
79
+
-`body`: Issue body content (string, optional)
80
+
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
81
+
-`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)
82
+
-`issue_number`: Issue number to update (number, optional)
83
+
-`labels`: Labels to apply to this issue (string[], optional)
84
+
-`method`: Write operation to perform on a single issue.
85
+
Options are:
86
+
- 'create' - creates a new issue.
87
+
- 'update' - updates an existing issue.
88
+
(string, required)
89
+
-`milestone`: Milestone number (number, optional)
90
+
-`owner`: Repository owner (string, required)
91
+
-`repo`: Repository name (string, required)
92
+
-`state`: New state (string, optional)
93
+
-`state_reason`: Reason for the state change. Ignored unless state is changed. (string, optional)
94
+
-`title`: Issue title (string, optional)
95
+
-`type`: Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter. (string, optional)
Copy file name to clipboardExpand all lines: docs/insiders-features.md
+21-1Lines changed: 21 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -50,7 +50,6 @@ The list below is generated from the Go source. It covers tool **inventory and s
50
50
-`assignees`: Usernames to assign to this issue (string[], optional)
51
51
-`body`: Issue body content (string, optional)
52
52
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
53
-
-`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)
54
53
-`issue_number`: Issue number to update (number, optional)
55
54
-`labels`: Labels to apply to this issue (string[], optional)
56
55
-`method`: Write operation to perform on a single issue.
@@ -68,6 +67,27 @@ The list below is generated from the Go source. It covers tool **inventory and s
68
67
69
68
### `remote_mcp_issue_fields`
70
69
70
+
-**issue_write** - Create or update issue
71
+
-**Required OAuth Scopes**: `repo`
72
+
-`assignees`: Usernames to assign to this issue (string[], optional)
73
+
-`body`: Issue body content (string, optional)
74
+
-`duplicate_of`: Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'. (number, optional)
75
+
-`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)
76
+
-`issue_number`: Issue number to update (number, optional)
77
+
-`labels`: Labels to apply to this issue (string[], optional)
78
+
-`method`: Write operation to perform on a single issue.
79
+
Options are:
80
+
- 'create' - creates a new issue.
81
+
- 'update' - updates an existing issue.
82
+
(string, required)
83
+
-`milestone`: Milestone number (number, optional)
84
+
-`owner`: Repository owner (string, required)
85
+
-`repo`: Repository name (string, required)
86
+
-`state`: New state (string, optional)
87
+
-`state_reason`: Reason for the state change. Ignored unless state is changed. (string, optional)
88
+
-`title`: Issue title (string, optional)
89
+
-`type`: Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter. (string, optional)
Copy file name to clipboardExpand all lines: pkg/github/__toolsnaps__/issue_write.snap
-36Lines changed: 0 additions & 36 deletions
Original file line number
Diff line number
Diff line change
@@ -29,42 +29,6 @@
29
29
"description": "Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'.",
30
30
"type": "number"
31
31
},
32
-
"issue_fields": {
33
-
"description": "Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'.",
34
-
"items": {
35
-
"additionalProperties": false,
36
-
"properties": {
37
-
"delete": {
38
-
"description": "Set to true to clear this field's current value on the issue. Cannot be combined with 'value' or 'field_option_name'.",
39
-
"enum": [
40
-
true
41
-
],
42
-
"type": "boolean"
43
-
},
44
-
"field_name": {
45
-
"description": "Issue field name (case-insensitive). Must match a field returned by list_issue_fields for this repository or its organization.",
46
-
"type": "string"
47
-
},
48
-
"field_option_name": {
49
-
"description": "Option name for single-select fields. Validated against the field's options before the API call. Cannot be combined with 'value' or 'delete'.",
50
-
"type": "string"
51
-
},
52
-
"value": {
53
-
"description": "Value to set. Use for text, number, and date fields (date as YYYY-MM-DD). For single-select fields, prefer 'field_option_name' so the option is validated before the API call. Cannot be combined with 'field_option_name' or 'delete'.",
"description": "Create a new or update an existing issue in a GitHub repository.",
15
+
"inputSchema": {
16
+
"properties": {
17
+
"assignees": {
18
+
"description": "Usernames to assign to this issue",
19
+
"items": {
20
+
"type": "string"
21
+
},
22
+
"type": "array"
23
+
},
24
+
"body": {
25
+
"description": "Issue body content",
26
+
"type": "string"
27
+
},
28
+
"duplicate_of": {
29
+
"description": "Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'.",
30
+
"type": "number"
31
+
},
32
+
"issue_fields": {
33
+
"description": "Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'.",
34
+
"items": {
35
+
"additionalProperties": false,
36
+
"properties": {
37
+
"delete": {
38
+
"description": "Set to true to clear this field's current value on the issue. Cannot be combined with 'value' or 'field_option_name'.",
39
+
"enum": [
40
+
true
41
+
],
42
+
"type": "boolean"
43
+
},
44
+
"field_name": {
45
+
"description": "Issue field name (case-insensitive). Must match a field returned by list_issue_fields for this repository or its organization.",
46
+
"type": "string"
47
+
},
48
+
"field_option_name": {
49
+
"description": "Option name for single-select fields. Validated against the field's options before the API call. Cannot be combined with 'value' or 'delete'.",
50
+
"type": "string"
51
+
},
52
+
"value": {
53
+
"description": "Value to set. Use for text, number, and date fields (date as YYYY-MM-DD). For single-select fields, prefer 'field_option_name' so the option is validated before the API call. Cannot be combined with 'field_option_name' or 'delete'.",
54
+
"type": [
55
+
"string",
56
+
"number",
57
+
"boolean"
58
+
]
59
+
}
60
+
},
61
+
"required": [
62
+
"field_name"
63
+
],
64
+
"type": "object"
65
+
},
66
+
"type": "array"
67
+
},
68
+
"issue_number": {
69
+
"description": "Issue number to update",
70
+
"type": "number"
71
+
},
72
+
"labels": {
73
+
"description": "Labels to apply to this issue",
74
+
"items": {
75
+
"type": "string"
76
+
},
77
+
"type": "array"
78
+
},
79
+
"method": {
80
+
"description": "Write operation to perform on a single issue.\nOptions are:\n- 'create' - creates a new issue.\n- 'update' - updates an existing issue.\n",
81
+
"enum": [
82
+
"create",
83
+
"update"
84
+
],
85
+
"type": "string"
86
+
},
87
+
"milestone": {
88
+
"description": "Milestone number",
89
+
"type": "number"
90
+
},
91
+
"owner": {
92
+
"description": "Repository owner",
93
+
"type": "string"
94
+
},
95
+
"repo": {
96
+
"description": "Repository name",
97
+
"type": "string"
98
+
},
99
+
"state": {
100
+
"description": "New state",
101
+
"enum": [
102
+
"open",
103
+
"closed"
104
+
],
105
+
"type": "string"
106
+
},
107
+
"state_reason": {
108
+
"description": "Reason for the state change. Ignored unless state is changed.",
109
+
"enum": [
110
+
"completed",
111
+
"not_planned",
112
+
"duplicate"
113
+
],
114
+
"type": "string"
115
+
},
116
+
"title": {
117
+
"description": "Issue title",
118
+
"type": "string"
119
+
},
120
+
"type": {
121
+
"description": "Type of this issue. Only use if the repository has issue types configured. Use list_issue_types tool to get valid type values for the organization. If the repository doesn't support issue types, omit this parameter.",
0 commit comments