Skip to content

Commit f929c58

Browse files
RossTarrantCopilotSamMorrowDrums
authored
feat: Add CSV output format for default list tools under insiders mode (#2450)
* Add CSV output for list tools under insiders mode * fix: resolve rebase feature flag conflicts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Simplify feature-flag handling: collapse CSV dual-variant + skip filtering when no checker (#2516) * refactor: generic toolset+name sort, clarify feature flag intent Address review feedback on #2450: - Collapse the three near-identical sort helpers in pkg/inventory/filters.go into a generic sortByToolsetThenName so adding new inventory item types doesn't require copying the comparator. - Expand the doc comments on the three *WithoutFeatureFiltering helpers to spell out why they exist: HTTP mode builds a static (process-wide) inventory as an upper bound, but per-request feature flags from headers (X-MCP-Features, X-MCP-Insiders) are evaluated later, so feature-flagged variants must be preserved here. - Strengthen the doc comment on ResolveFeatureFlags to make the contract explicit: user-supplied flags are validated against AllowedFeatureFlags, but insiders expansion deliberately is not — InsidersFeatureFlags may include server-controlled flags that are not user-toggleable. CORS comments are intentionally left for the PR author. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(feature-flags): clarify allowed and insiders sets are independent Also add tests covering: - a user-toggleable flag (FeatureFlagIssuesGranular) that insiders does not turn on automatically - insiders mode not turning on user-only allowed flags Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor(inventory): collapse three *WithoutFeatureFiltering helpers into StaticUpperBound The three parallel methods (AvailableToolsWithoutFeatureFiltering, AvailableResourceTemplatesWithoutFeatureFiltering, AvailablePromptsWithoutFeatureFiltering) were always called as a triple in exactly two places: HTTP buildStaticInventory and its test mirror. They exist because the dual-variant pattern (sibling tools with mirrored FeatureFlagEnable / FeatureFlagDisable on the same name, e.g. CSV output) makes feature filtering at static-build time impossible — both variants must be kept and resolved per-request. Replace the three with one method, Inventory.StaticUpperBound(ctx), that returns (tools, resources, prompts) and carries the rationale in its doc comment. Reduces API surface, eliminates the triplication, and makes the single "skip feature filtering" concept obvious to readers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: simplify feature-flag handling Two related simplifications, both about treating insiders as a meta flag that expands once at startup and then stops mattering: - Collapse CSV's dual-variant pattern into a single tool whose handler performs a runtime feature-flag check via deps.IsFeatureEnabled. CSV is a pure response-format toggle, not a schema change, so it does not need the dual-name pattern that genuine schema variants (granular issues/PRs) still use. - When no feature checker is installed, skip feature-flag filtering and return the full upper bound. The static HTTP inventory now uses plain AvailableTools/Resources/Prompts; the per-request inventory always installs a checker, so MCP registration (which serves a tool name once) always sees a deduplicated set. The bespoke StaticUpperBound helper and the isToolEnabledWithFeatureFlags split go away. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * ci(mcp-diff): add insiders + per-feature configs The mcp-diff matrix now includes: - --insiders (and --insiders --read-only) - one config per github.AllowedFeatureFlags entry, generated by script/print-mcp-diff-configs so new user-controllable flags get diffed automatically without editing the workflow Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(insiders): explain feature-flag resolution for contributors Adds a 'How feature flags are resolved' section covering: - Insiders is a meta flag, like 'all'/'default' for toolsets - User input -> allowlist filter -> insiders expansion -> server-side fallback (remote only) - AllowedFeatureFlags vs InsidersFeatureFlags are independent - How to add a new feature flag, including the TestGitHubPackageDoesNotReadInsidersMode guard Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor(inventory): make feature-flag gating a regular ToolFilter Move tool feature-flag evaluation out of isToolEnabled and into a ToolFilter installed at the head of the pipeline by Build() when WithFeatureChecker received a non-nil checker. The 'no checker = no filtering' contract is now expressed structurally (the filter isn't installed) instead of by a runtime nil check inside the helper. Resources and prompts have no filter pipeline, so they call the now-pure featureFlagAllowed helper behind an explicit r.featureChecker != nil guard at the iteration site. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * perf(inventory): cache extracted toolset IDs in sort comparator Avoid evaluating the extractor closures up to three times per comparison. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: correct MCP features header in cors * docs: regenerate README for CSV output toolset Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: remove duplicate MCPFeaturesHeader from CORS headers * ci(mcp-diff): add streamable-http job with header-based configs Adds a sibling mcp-diff-http job that exercises the streamable-http transport against a shared HTTP server, with per-config settings supplied via X-MCP-* request headers — mirroring how the remote server is invoked in production (server-side defaults + per-user header overrides). The config generator gains a -transport flag: - stdio (default, unchanged behaviour) - http-headers (emits headers-only configs targeting a shared server) Two new combined entries layer multiple headers together as a smoke test for header-merging regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: regenerate after merging main Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Sam Morrow <info@sam-morrow.com> Co-authored-by: sammorrowdrums <sammorrowdrums@github.com>
1 parent f39f758 commit f929c58

33 files changed

Lines changed: 1738 additions & 279 deletions

.github/workflows/mcp-diff.yml

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,35 @@ jobs:
1919
with:
2020
fetch-depth: 0
2121

22+
- name: Set up Go
23+
uses: actions/setup-go@v5
24+
with:
25+
go-version-file: go.mod
26+
2227
- name: Build UI
2328
uses: ./.github/actions/build-ui
2429

30+
- name: Generate diff configurations
31+
id: configs
32+
# The generator imports pkg/github so any new entry in
33+
# AllowedFeatureFlags is automatically diffed without touching this
34+
# workflow. See script/print-mcp-diff-configs/main.go.
35+
run: |
36+
{
37+
echo 'configurations<<MCP_DIFF_EOF'
38+
go run ./script/print-mcp-diff-configs
39+
echo 'MCP_DIFF_EOF'
40+
} >> "$GITHUB_OUTPUT"
41+
2542
- name: Run MCP Server Diff
2643
uses: SamMorrowDrums/mcp-server-diff@v2.3.5
2744
with:
28-
setup_go: "true"
45+
setup_go: "false"
2946
install_command: go mod download
3047
start_command: go run ./cmd/github-mcp-server stdio
3148
env_vars: |
3249
GITHUB_PERSONAL_ACCESS_TOKEN=test-token
33-
configurations: |
34-
[
35-
{"name": "default", "args": ""},
36-
{"name": "read-only", "args": "--read-only"},
37-
{"name": "toolsets-repos", "args": "--toolsets=repos"},
38-
{"name": "toolsets-issues", "args": "--toolsets=issues"},
39-
{"name": "toolsets-context", "args": "--toolsets=context"},
40-
{"name": "toolsets-pull_requests", "args": "--toolsets=pull_requests"},
41-
{"name": "toolsets-repos,issues", "args": "--toolsets=repos,issues"},
42-
{"name": "toolsets-issues,context", "args": "--toolsets=issues,context"},
43-
{"name": "toolsets-all", "args": "--toolsets=all"},
44-
{"name": "tools-get_me", "args": "--tools=get_me"},
45-
{"name": "tools-get_me,list_issues", "args": "--tools=get_me,list_issues"},
46-
{"name": "toolsets-repos+read-only", "args": "--toolsets=repos --read-only"}
47-
]
50+
configurations: ${{ steps.configs.outputs.configurations }}
4851

4952
- name: Add interpretation note
5053
if: always()
@@ -58,3 +61,51 @@ jobs:
5861
echo "- New tools/toolsets added" >> $GITHUB_STEP_SUMMARY
5962
echo "- Tool descriptions updated" >> $GITHUB_STEP_SUMMARY
6063
echo "- Capability changes (intentional improvements)" >> $GITHUB_STEP_SUMMARY
64+
65+
mcp-diff-http:
66+
runs-on: ubuntu-latest
67+
68+
steps:
69+
- name: Check out code
70+
uses: actions/checkout@v6
71+
with:
72+
fetch-depth: 0
73+
74+
- name: Set up Go
75+
uses: actions/setup-go@v5
76+
with:
77+
go-version-file: go.mod
78+
79+
- name: Build UI
80+
uses: ./.github/actions/build-ui
81+
82+
- name: Generate diff configurations
83+
id: configs
84+
# See script/print-mcp-diff-configs/main.go. The http-headers variant
85+
# points every config at a shared HTTP server started by the action
86+
# and carries per-config settings via X-MCP-* headers, mirroring how
87+
# the remote server is invoked in production (server-side defaults +
88+
# per-user header overrides).
89+
run: |
90+
{
91+
echo 'configurations<<MCP_DIFF_EOF'
92+
go run ./script/print-mcp-diff-configs -transport http-headers
93+
echo 'MCP_DIFF_EOF'
94+
} >> "$GITHUB_OUTPUT"
95+
96+
- name: Run MCP Server Diff (streamable-http)
97+
uses: SamMorrowDrums/mcp-server-diff@v2.3.5
98+
with:
99+
setup_go: "false"
100+
install_command: go mod download
101+
http_start_command: go run ./cmd/github-mcp-server http --port 8082
102+
http_startup_wait_ms: "5000"
103+
configurations: ${{ steps.configs.outputs.configurations }}
104+
105+
- name: Add interpretation note
106+
if: always()
107+
run: |
108+
echo "" >> $GITHUB_STEP_SUMMARY
109+
echo "---" >> $GITHUB_STEP_SUMMARY
110+
echo "" >> $GITHUB_STEP_SUMMARY
111+
echo "ℹ️ **Note:** This job exercises the streamable-http transport against a shared server, with per-config settings supplied via X-MCP-* request headers." >> $GITHUB_STEP_SUMMARY

README.md

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,21 @@ The following sets of tools are available:
829829
- `owner`: Repository owner (string, required)
830830
- `repo`: Repository name (string, required)
831831

832+
- **add_sub_issue** - Add Sub-Issue
833+
- **Required OAuth Scopes**: `repo`
834+
- `issue_number`: The parent issue number (number, required)
835+
- `owner`: Repository owner (username or organization) (string, required)
836+
- `replace_parent`: If true, reparent the sub-issue if it already has a parent (boolean, optional)
837+
- `repo`: Repository name (string, required)
838+
- `sub_issue_id`: The ID of the sub-issue to add. ID is not the same as issue number (number, required)
839+
840+
- **create_issue** - Create Issue
841+
- **Required OAuth Scopes**: `repo`
842+
- `body`: Issue body content (optional) (string, optional)
843+
- `owner`: Repository owner (username or organization) (string, required)
844+
- `repo`: Repository name (string, required)
845+
- `title`: Issue title (string, required)
846+
832847
- **get_label** - Get a specific label from a repository
833848
- **Required OAuth Scopes**: `repo`
834849
- `name`: Label name. (string, required)
@@ -894,6 +909,22 @@ The following sets of tools are available:
894909
- `since`: Filter by date (ISO 8601 timestamp) (string, optional)
895910
- `state`: Filter by state, by default both open and closed issues are returned when not provided (string, optional)
896911

912+
- **remove_sub_issue** - Remove Sub-Issue
913+
- **Required OAuth Scopes**: `repo`
914+
- `issue_number`: The parent issue number (number, required)
915+
- `owner`: Repository owner (username or organization) (string, required)
916+
- `repo`: Repository name (string, required)
917+
- `sub_issue_id`: The ID of the sub-issue to remove. ID is not the same as issue number (number, required)
918+
919+
- **reprioritize_sub_issue** - Reprioritize Sub-Issue
920+
- **Required OAuth Scopes**: `repo`
921+
- `after_id`: The ID of the sub-issue to place this after (either after_id OR before_id should be specified) (number, optional)
922+
- `before_id`: The ID of the sub-issue to place this before (either after_id OR before_id should be specified) (number, optional)
923+
- `issue_number`: The parent issue number (number, required)
924+
- `owner`: Repository owner (username or organization) (string, required)
925+
- `repo`: Repository name (string, required)
926+
- `sub_issue_id`: The ID of the sub-issue to reorder. ID is not the same as issue number (number, required)
927+
897928
- **search_issues** - Search issues
898929
- **Required OAuth Scopes**: `repo`
899930
- `order`: Sort order (string, optional)
@@ -904,6 +935,13 @@ The following sets of tools are available:
904935
- `repo`: Optional repository name. If provided with owner, only issues for this repository are listed. (string, optional)
905936
- `sort`: Sort field by number of matches of categories, defaults to best match (string, optional)
906937

938+
- **set_issue_fields** - Set Issue Fields
939+
- **Required OAuth Scopes**: `repo`
940+
- `fields`: Array of issue field values to set. Each element must have a 'field_id' (string, the GraphQL node ID of the field) and exactly one value field: 'text_value' for text fields, 'number_value' for number fields, 'date_value' (ISO 8601 date string) for date fields, or 'single_select_option_id' (the GraphQL node ID of the option) for single select fields. Set 'delete' to true to remove a field value. (object[], required)
941+
- `issue_number`: The issue number to update (number, required)
942+
- `owner`: Repository owner (username or organization) (string, required)
943+
- `repo`: Repository name (string, required)
944+
907945
- **sub_issue_write** - Change sub-issue
908946
- **Required OAuth Scopes**: `repo`
909947
- `after_id`: The ID of the sub-issue to be prioritized after (either after_id OR before_id should be specified) (number, optional)
@@ -920,6 +958,57 @@ The following sets of tools are available:
920958
- `repo`: Repository name (string, required)
921959
- `sub_issue_id`: The ID of the sub-issue to add. ID is not the same as issue number (number, required)
922960

961+
- **update_issue_assignees** - Update Issue Assignees
962+
- **Required OAuth Scopes**: `repo`
963+
- `assignees`: GitHub usernames to assign to this issue (string[], required)
964+
- `issue_number`: The issue number to update (number, required)
965+
- `owner`: Repository owner (username or organization) (string, required)
966+
- `repo`: Repository name (string, required)
967+
968+
- **update_issue_body** - Update Issue Body
969+
- **Required OAuth Scopes**: `repo`
970+
- `body`: The new body content for the issue (string, required)
971+
- `issue_number`: The issue number to update (number, required)
972+
- `owner`: Repository owner (username or organization) (string, required)
973+
- `repo`: Repository name (string, required)
974+
975+
- **update_issue_labels** - Update Issue Labels
976+
- **Required OAuth Scopes**: `repo`
977+
- `issue_number`: The issue number to update (number, required)
978+
- `labels`: Labels to apply to this issue. ([], required)
979+
- `owner`: Repository owner (username or organization) (string, required)
980+
- `repo`: Repository name (string, required)
981+
982+
- **update_issue_milestone** - Update Issue Milestone
983+
- **Required OAuth Scopes**: `repo`
984+
- `issue_number`: The issue number to update (number, required)
985+
- `milestone`: The milestone number to set on the issue (integer, required)
986+
- `owner`: Repository owner (username or organization) (string, required)
987+
- `repo`: Repository name (string, required)
988+
989+
- **update_issue_state** - Update Issue State
990+
- **Required OAuth Scopes**: `repo`
991+
- `issue_number`: The issue number to update (number, required)
992+
- `owner`: Repository owner (username or organization) (string, required)
993+
- `repo`: Repository name (string, required)
994+
- `state`: The new state for the issue (string, required)
995+
- `state_reason`: The reason for the state change (only for closed state) (string, optional)
996+
997+
- **update_issue_title** - Update Issue Title
998+
- **Required OAuth Scopes**: `repo`
999+
- `issue_number`: The issue number to update (number, required)
1000+
- `owner`: Repository owner (username or organization) (string, required)
1001+
- `repo`: Repository name (string, required)
1002+
- `title`: The new title for the issue (string, required)
1003+
1004+
- **update_issue_type** - Update Issue Type
1005+
- **Required OAuth Scopes**: `repo`
1006+
- `issue_number`: The issue number to update (number, required)
1007+
- `issue_type`: The issue type to set (string, required)
1008+
- `owner`: Repository owner (username or organization) (string, required)
1009+
- `rationale`: One concise sentence explaining what specifically about the issue led you to choose this type. State the concrete signal (e.g. 'Reports a crash when saving' → bug, 'Asks for dark mode support' → feature). (string, optional)
1010+
- `repo`: Repository name (string, required)
1011+
9231012
</details>
9241013

9251014
<details>
@@ -1072,6 +1161,19 @@ The following sets of tools are available:
10721161
- `startSide`: For multi-line comments, the starting side of the diff that the comment applies to. LEFT indicates the previous state, RIGHT indicates the new state (string, optional)
10731162
- `subjectType`: The level at which the comment is targeted (string, required)
10741163

1164+
- **add_pull_request_review_comment** - Add Pull Request Review Comment
1165+
- **Required OAuth Scopes**: `repo`
1166+
- `body`: The comment body (string, required)
1167+
- `line`: The line number in the diff to comment on (optional) (number, optional)
1168+
- `owner`: Repository owner (username or organization) (string, required)
1169+
- `path`: The relative path of the file to comment on (string, required)
1170+
- `pullNumber`: The pull request number (number, required)
1171+
- `repo`: Repository name (string, required)
1172+
- `side`: The side of the diff to comment on (optional) (string, optional)
1173+
- `startLine`: The start line of a multi-line comment (optional) (number, optional)
1174+
- `startSide`: The start side of a multi-line comment (optional) (string, optional)
1175+
- `subjectType`: The subject type of the comment (string, required)
1176+
10751177
- **add_reply_to_pull_request_comment** - Add reply to pull request comment
10761178
- **Required OAuth Scopes**: `repo`
10771179
- `body`: The text of the reply (string, required)
@@ -1091,6 +1193,21 @@ The following sets of tools are available:
10911193
- `repo`: Repository name (string, required)
10921194
- `title`: PR title (string, required)
10931195

1196+
- **create_pull_request_review** - Create Pull Request Review
1197+
- **Required OAuth Scopes**: `repo`
1198+
- `body`: The review body text (optional) (string, optional)
1199+
- `commitID`: The SHA of the commit to review (optional, defaults to latest) (string, optional)
1200+
- `event`: The review action to perform. If omitted, creates a pending review. (string, optional)
1201+
- `owner`: Repository owner (username or organization) (string, required)
1202+
- `pullNumber`: The pull request number (number, required)
1203+
- `repo`: Repository name (string, required)
1204+
1205+
- **delete_pending_pull_request_review** - Delete Pending Pull Request Review
1206+
- **Required OAuth Scopes**: `repo`
1207+
- `owner`: Repository owner (username or organization) (string, required)
1208+
- `pullNumber`: The pull request number (number, required)
1209+
- `repo`: Repository name (string, required)
1210+
10941211
- **list_pull_requests** - List pull requests
10951212
- **Required OAuth Scopes**: `repo`
10961213
- `base`: Filter by base branch (string, optional)
@@ -1143,6 +1260,17 @@ The following sets of tools are available:
11431260
- `repo`: Repository name (string, required)
11441261
- `threadId`: The node ID of the review thread (e.g., PRRT_kwDOxxx). Required for resolve_thread and unresolve_thread methods. Get thread IDs from pull_request_read with method get_review_comments. (string, optional)
11451262

1263+
- **request_pull_request_reviewers** - Request Pull Request Reviewers
1264+
- **Required OAuth Scopes**: `repo`
1265+
- `owner`: Repository owner (username or organization) (string, required)
1266+
- `pullNumber`: The pull request number (number, required)
1267+
- `repo`: Repository name (string, required)
1268+
- `reviewers`: GitHub usernames to request reviews from (string[], required)
1269+
1270+
- **resolve_review_thread** - Resolve Review Thread
1271+
- **Required OAuth Scopes**: `repo`
1272+
- `threadID`: The node ID of the review thread to resolve (e.g., PRRT_kwDOxxx) (string, required)
1273+
11461274
- **search_pull_requests** - Search pull requests
11471275
- **Required OAuth Scopes**: `repo`
11481276
- `order`: Sort order (string, optional)
@@ -1153,6 +1281,18 @@ The following sets of tools are available:
11531281
- `repo`: Optional repository name. If provided with owner, only pull requests for this repository are listed. (string, optional)
11541282
- `sort`: Sort field by number of matches of categories, defaults to best match (string, optional)
11551283

1284+
- **submit_pending_pull_request_review** - Submit Pending Pull Request Review
1285+
- **Required OAuth Scopes**: `repo`
1286+
- `body`: The review body text (optional) (string, optional)
1287+
- `event`: The review action to perform (string, required)
1288+
- `owner`: Repository owner (username or organization) (string, required)
1289+
- `pullNumber`: The pull request number (number, required)
1290+
- `repo`: Repository name (string, required)
1291+
1292+
- **unresolve_review_thread** - Unresolve Review Thread
1293+
- **Required OAuth Scopes**: `repo`
1294+
- `threadID`: The node ID of the review thread to unresolve (e.g., PRRT_kwDOxxx) (string, required)
1295+
11561296
- **update_pull_request** - Edit pull request
11571297
- **Required OAuth Scopes**: `repo`
11581298
- `base`: New base branch name (string, optional)
@@ -1166,13 +1306,41 @@ The following sets of tools are available:
11661306
- `state`: New state (string, optional)
11671307
- `title`: New title (string, optional)
11681308

1309+
- **update_pull_request_body** - Update Pull Request Body
1310+
- **Required OAuth Scopes**: `repo`
1311+
- `body`: The new body content for the pull request (string, required)
1312+
- `owner`: Repository owner (username or organization) (string, required)
1313+
- `pullNumber`: The pull request number (number, required)
1314+
- `repo`: Repository name (string, required)
1315+
11691316
- **update_pull_request_branch** - Update pull request branch
11701317
- **Required OAuth Scopes**: `repo`
11711318
- `expectedHeadSha`: The expected SHA of the pull request's HEAD ref (string, optional)
11721319
- `owner`: Repository owner (string, required)
11731320
- `pullNumber`: Pull request number (number, required)
11741321
- `repo`: Repository name (string, required)
11751322

1323+
- **update_pull_request_draft_state** - Update Pull Request Draft State
1324+
- **Required OAuth Scopes**: `repo`
1325+
- `draft`: Set to true to convert to draft, false to mark as ready for review (boolean, required)
1326+
- `owner`: Repository owner (username or organization) (string, required)
1327+
- `pullNumber`: The pull request number (number, required)
1328+
- `repo`: Repository name (string, required)
1329+
1330+
- **update_pull_request_state** - Update Pull Request State
1331+
- **Required OAuth Scopes**: `repo`
1332+
- `owner`: Repository owner (username or organization) (string, required)
1333+
- `pullNumber`: The pull request number (number, required)
1334+
- `repo`: Repository name (string, required)
1335+
- `state`: The new state for the pull request (string, required)
1336+
1337+
- **update_pull_request_title** - Update Pull Request Title
1338+
- **Required OAuth Scopes**: `repo`
1339+
- `owner`: Repository owner (username or organization) (string, required)
1340+
- `pullNumber`: The pull request number (number, required)
1341+
- `repo`: Repository name (string, required)
1342+
- `title`: The new title for the pull request (string, required)
1343+
11761344
</details>
11771345

11781346
<details>

cmd/github-mcp-server/main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ var (
126126
}
127127
}
128128

129+
var enabledFeatures []string
130+
if viper.IsSet("features") {
131+
if err := viper.UnmarshalKey("features", &enabledFeatures); err != nil {
132+
return fmt.Errorf("failed to unmarshal features: %w", err)
133+
}
134+
}
135+
129136
ttl := viper.GetDuration("repo-access-cache-ttl")
130137
httpConfig := ghhttp.ServerConfig{
131138
Version: version,
@@ -144,6 +151,7 @@ var (
144151
EnabledToolsets: enabledToolsets,
145152
EnabledTools: enabledTools,
146153
ExcludeTools: excludeTools,
154+
EnabledFeatures: enabledFeatures,
147155
InsidersMode: viper.GetBool("insiders"),
148156
}
149157

0 commit comments

Comments
 (0)