Skip to content

Commit cd628ee

Browse files
Merge branch 'main' into rosstarrant/reduce-project-item-output
2 parents 2e2d0db + 51a7383 commit cd628ee

23 files changed

Lines changed: 843 additions & 180 deletions

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,6 @@ The following sets of tools are available:
855855
- `assignees`: Usernames to assign to this issue (string[], optional)
856856
- `body`: Issue body content (string, optional)
857857
- `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)
859858
- `issue_number`: Issue number to update (number, optional)
860859
- `labels`: Labels to apply to this issue (string[], optional)
861860
- `method`: Write operation to perform on a single issue.

docs/feature-flags.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ runtime behavior (such as output formatting) won't appear here.
5656
- `assignees`: Usernames to assign to this issue (string[], optional)
5757
- `body`: Issue body content (string, optional)
5858
- `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)
6059
- `issue_number`: Issue number to update (number, optional)
6160
- `labels`: Labels to apply to this issue (string[], optional)
6261
- `method`: Write operation to perform on a single issue.
@@ -74,6 +73,27 @@ runtime behavior (such as output formatting) won't appear here.
7473

7574
### `remote_mcp_issue_fields`
7675

76+
- **issue_write** - Create or update issue
77+
- **Required OAuth Scopes**: `repo`
78+
- `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)
96+
7797
- **list_issue_fields** - List issue fields
7898
- **Required OAuth Scopes**: `repo`, `read:org`
7999
- **Accepted OAuth Scopes**: `admin:org`, `read:org`, `repo`, `write:org`
@@ -178,7 +198,7 @@ runtime behavior (such as output formatting) won't appear here.
178198

179199
- **update_issue_type** - Update Issue Type
180200
- **Required OAuth Scopes**: `repo`
181-
- `is_suggestion`: If true, propose the issue type change instead of applying it. Defaults to false, which applies the change to the issue. (boolean, optional)
201+
- `is_suggestion`: If true, this issue type change is sent to the API as a suggestion (suggest:true) rather than an applied value. Whether the type is applied or recorded as a proposal is determined by the API. (boolean, optional)
182202
- `issue_number`: The issue number to update (number, required)
183203
- `issue_type`: The issue type to set (string, required)
184204
- `owner`: Repository owner (username or organization) (string, required)

docs/insiders-features.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ The list below is generated from the Go source. It covers tool **inventory and s
5050
- `assignees`: Usernames to assign to this issue (string[], optional)
5151
- `body`: Issue body content (string, optional)
5252
- `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)
5453
- `issue_number`: Issue number to update (number, optional)
5554
- `labels`: Labels to apply to this issue (string[], optional)
5655
- `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
6867

6968
### `remote_mcp_issue_fields`
7069

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)
90+
7191
- **list_issue_fields** - List issue fields
7292
- **Required OAuth Scopes**: `repo`, `read:org`
7393
- **Accepted OAuth Scopes**: `admin:org`, `read:org`, `repo`, `write:org`

docs/installation-guides/install-codex.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ bearer_token_env_var = "GITHUB_PAT_TOKEN"
2020

2121
You can also add it via the Codex CLI:
2222

23-
```cli
24-
codex mcp add github --url https://api.githubcopilot.com/mcp/
23+
```bash
24+
codex mcp add github --url https://api.githubcopilot.com/mcp/ --bearer-token-env-var GITHUB_PAT_TOKEN
2525
```
2626

27+
The `--bearer-token-env-var` option is required for PAT-authenticated access to the hosted GitHub MCP server.
28+
2729
<details>
2830
<summary><b>Storing Your PAT Securely</b></summary>
2931
<br>

pkg/github/__toolsnaps__/issue_write.snap

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,42 +29,6 @@
2929
"description": "Issue number that this issue is a duplicate of. Only used when state_reason is 'duplicate'.",
3030
"type": "number"
3131
},
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-
},
6832
"issue_number": {
6933
"description": "Issue number to update",
7034
"type": "number"
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
{
2+
"_meta": {
3+
"ui": {
4+
"resourceUri": "ui://github-mcp-server/issue-write",
5+
"visibility": [
6+
"model",
7+
"app"
8+
]
9+
}
10+
},
11+
"annotations": {
12+
"title": "Create or update issue"
13+
},
14+
"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.",
122+
"type": "string"
123+
}
124+
},
125+
"required": [
126+
"method",
127+
"owner",
128+
"repo"
129+
],
130+
"type": "object"
131+
},
132+
"name": "issue_write"
133+
}

pkg/github/__toolsnaps__/set_issue_fields.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
"description": "The GraphQL node ID of the issue field",
2424
"type": "string"
2525
},
26+
"is_suggestion": {
27+
"description": "If true, this field value is sent to the API as a suggestion (suggest:true) rather than an applied value. Whether the value is applied or recorded as a proposal is determined by the API.",
28+
"type": "boolean"
29+
},
2630
"number_value": {
2731
"description": "The value to set for a number field",
2832
"type": "number"

pkg/github/__toolsnaps__/update_issue_labels.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
},
2323
{
2424
"properties": {
25+
"is_suggestion": {
26+
"description": "If true, this label is sent to the API as a suggestion (suggest:true) rather than an applied label. Whether the label is applied or recorded as a proposal is determined by the API.",
27+
"type": "boolean"
28+
},
2529
"name": {
2630
"description": "Label name",
2731
"type": "string"

pkg/github/__toolsnaps__/update_issue_type.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"inputSchema": {
99
"properties": {
1010
"is_suggestion": {
11-
"description": "If true, propose the issue type change instead of applying it. Defaults to false, which applies the change to the issue.",
11+
"description": "If true, this issue type change is sent to the API as a suggestion (suggest:true) rather than an applied value. Whether the type is applied or recorded as a proposal is determined by the API.",
1212
"type": "boolean"
1313
},
1414
"issue_number": {

pkg/github/csv_output_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TestCSVOutputAppliesToFlagGatedListTools(t *testing.T) {
4242
enabledOnly := testCSVOutputTool("list_things", `[{"number":1}]`)
4343
enabledOnly.FeatureFlagEnable = FeatureFlagIssueFields
4444
disabledOnly := testCSVOutputTool("list_legacy_things", `[{"number":2}]`)
45-
disabledOnly.FeatureFlagDisable = FeatureFlagIssueFields
45+
disabledOnly.FeatureFlagDisable = []string{FeatureFlagIssueFields}
4646

4747
tools := withCSVOutput([]inventory.ServerTool{enabledOnly, disabledOnly})
4848
require.Len(t, tools, 2)

0 commit comments

Comments
 (0)