Refactor DefaultToolsetGroup to use the new ToolsetRegistry pattern:
- Add NewDefaultToolsetRegistry() that creates a registry with all tools
- Tools are now self-describing (toolset + read/write from metadata)
- No more manual AddReadTools/AddWriteTools categorization
- DefaultToolsetGroup uses the registry with ToolsetGroupConfig
- Resource templates and prompts handled separately (not tools)
This enables scope-aware tool filtering when creating ToolsetGroups.
Add ToolsetRegistry struct that holds toolset definitions and tools,
with a NewToolsetGroup method that accepts ToolsetGroupConfig:
- ReadOnly: restricts to read-only tools
- ActiveToolsets: which toolsets to enable
- AvailableScopes: filter tools by OAuth scope requirements
- nil: no scope checking (all tools available)
- []: empty means no scopes (only tools with no requirements)
- [...]: tools must have required scopes in the list
This enables dynamic tool filtering based on the user's actual
OAuth token scopes, ensuring only authorized tools are exposed.
- Move ToolsetMetadata type to toolsets package with alias in github package
- Update NewToolMeta to accept ToolsetMetadata instead of string
- Update NewToolsetGroupFromTools to accept []ToolsetMetadata slice
- Remove need for .ID when calling NewToolMeta (e.g., NewToolMeta(ToolsetMetadataRepos) instead of NewToolMeta(ToolsetMetadataRepos.ID))
Add a new constructor that creates a ToolsetGroup from a list of ServerTools.
Tools are automatically categorized as read or write based on their
ReadOnlyHint annotation, and grouped into toolsets based on the 'toolset'
field in their Meta.
This enables tools to be fully self-describing - registration can now
derive toolset membership and read/write classification directly from
the tool definition.
- Check now regenerates using ./script/licenses and compares
- Add GOROOT/PATH setup in CI to fix go-licenses module info errors
- Check both license files AND third-party directory for changes
- See: https://github.com/google/go-licenses/issues/244
Address review feedback:
- Remove bash 4.0+ associative array requirement for macOS compatibility
- Add cross-platform hash function (md5sum on Linux, md5 on macOS)
- Ensure deterministic iteration order using sorted groups file
- Add better error handling for failed go-licenses commands
- Fix grammar: 'architecture(s)' -> 'architectures'
- Add documentation for third-party/ being a union of all architectures
- Use file-based state instead of associative arrays for portability
The licenses script now:
- Generates separate license reports per GOOS/GOARCH combination
- Groups identical reports together (comma-separated arch names)
- Adds a Table of Contents at the top of each platform file
- Handles cases where different architectures have different dependencies
(e.g., x/sys/unix vs x/sys/windows, mousetrap on Windows only)
This addresses the issue discovered in cli/cli where some deps changed
which changed the mod graph for different GOARCH and affected the
exported licenses because go-licenses tries to find common ancestors.
The go-SDK migration changed MCP protocol handling to require proper
initialization before tool calls. This updates the script to:
- Add initialize request with protocol version and client info
- Add notifications/initialized notification
- Add arguments field to tools/call params
- Keep stdin open with sleep for response
- Gracefully handle missing jq dependency
When tool parameter descriptions span multiple lines, the continuation
lines now receive proper indentation to maintain markdown list formatting.
This fixes the rendering issue where multi-line descriptions would break
out of the parameter list structure.
Fixes#1494
Build and Test Go Project / build (ubuntu-latest) (push) Has been cancelled
Build and Test Go Project / build (windows-latest) (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Docker / build (push) Has been cancelled
Build and Test Go Project / build (macos-latest) (push) Has been cancelled
GoReleaser Release / release (push) Has been cancelled
License Check / license-check (push) Has been cancelled
Publish to MCP Registry / publish (push) Has been cancelled
OpenAI strict mode requires the `properties` field to be present in
object schemas, even when empty. The jsonschema library uses omitempty
which causes empty maps to be omitted during JSON serialization.
This change uses json.RawMessage to bypass the library's serialization
and explicitly include `"properties": {}` in the output.
Fixes#1548
GoReleaser Release / release (push) Has been cancelled
License Check / license-check (push) Has been cancelled
Publish to MCP Registry / publish (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Docker / build (push) Has been cancelled
Build and Test Go Project / build (macos-latest) (push) Has been cancelled
Build and Test Go Project / build (ubuntu-latest) (push) Has been cancelled
Build and Test Go Project / build (windows-latest) (push) Has been cancelled
* add enabledTools to StdioServerConfig
* add EnabledTools to MCPServerConfig, and logic to bypass toolset config if present
* add logic to register specific tools
* update readme
* Update to be consistent with: https://docs.google.com/document/d/1tOOBJ4y9xY61QVrO18ymuVt4SO9nV-z2B4ckaL2f9IU/edit?tab=t.0#heading=h.ffto4e5dwzlf
specifically
- allow for --tools and dynamic toolset mode together
- allow for --tools and --toolsets together
* go mod tidy
* update
* clean up comment
* fix
* fix
* updte
* update
* clean up
Build and Test Go Project / build (ubuntu-latest) (push) Has been cancelled
Build and Test Go Project / build (windows-latest) (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Docker / build (push) Has been cancelled
Build and Test Go Project / build (macos-latest) (push) Has been cancelled
GoReleaser Release / release (push) Has been cancelled
License Check / license-check (push) Has been cancelled
Publish to MCP Registry / publish (push) Has been cancelled
Temporarily removing package configuration for the GitHub MCP server because certain hosts incorrectly generate docker arguments based on it which results in a broken server configuration when installed via registry.
Will bring it back when the issue is resolved by MCP host.
Build and Test Go Project / build (macos-latest) (push) Has been cancelled
Build and Test Go Project / build (ubuntu-latest) (push) Has been cancelled
Build and Test Go Project / build (windows-latest) (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
Docker / build (push) Has been cancelled
GoReleaser Release / release (push) Has been cancelled
License Check / license-check (push) Has been cancelled
Publish to MCP Registry / publish (push) Has been cancelled
* Add state metadata fields to get_discussion tool
Fixes#1303
The get_discussion tool was missing important state metadata that's
already available in get_issue. Added four fields to provide complete
discussion status information:
- state: Current discussion state (OPEN/CLOSED)
- isAnswered: Whether the discussion has an accepted answer
- answeredAt: Timestamp when answer was provided
- answerChosenAt: Timestamp when answer was selected
Changed GetDiscussion to return a map instead of github.Discussion
struct since the go-github library doesn't include all these fields
in its type definition. This approach is consistent with other
functions in this codebase (ListDiscussions, GetDiscussionComments).
All tests pass and linter checks pass.
* Fix Discussion field mappings based on GitHub GraphQL API
Changes:
- Replace 'State' (doesn't exist) with 'Closed' (Boolean)
- Remove 'AnsweredAt' (doesn't exist)
- Keep 'IsAnswered' (verified to exist in GitHub GraphQL API)
- Use 'AnswerChosenAt' for answer timestamp
Updated both implementation and tests to match actual GitHub GraphQL schema.
All tests passing.
---------
Co-authored-by: tommaso-moro <tommaso-moro@github.com>