Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0c3b11a
feat(coderd): add MCP ACL candidates endpoint
ibetitsmike Aug 25, 2026
fc5da1a
feat(site): add MCP server ACL sharing plumbing
ibetitsmike Aug 25, 2026
661b361
feat(site): add MCP server sharing dialog
ibetitsmike Aug 25, 2026
ab5d87e
feat(site): wire MCP server sharing controls
ibetitsmike Aug 25, 2026
8233626
test(site): stabilize MCP share access story
ibetitsmike Aug 25, 2026
52a7ecb
refactor(site): narrow MCP permission query keys
ibetitsmike Aug 25, 2026
5f4a1ed
refactor(site): reuse typed query keys in MCP ACL queries
ibetitsmike Aug 25, 2026
82b68dc
fix(site): surface AI settings navigation for MCP share-only users
ibetitsmike Aug 25, 2026
115f978
test(site): cover share-only MCP navigation with interaction stories
ibetitsmike Aug 25, 2026
ff0a96b
fix(coderd): keep share-only MCP detail route contract
ibetitsmike Aug 25, 2026
220826f
fix(site): surface MCP permission lookup failure in AI settings redirect
ibetitsmike Aug 25, 2026
15e5b07
refactor(site): share ACL dialog implementation
ibetitsmike Aug 25, 2026
395e0ab
Merge remote-tracking branch 'origin/main' into mike/acl-sharing-a8yw
ibetitsmike Aug 26, 2026
3a04800
chore: tighten ACL sharing comments
ibetitsmike Aug 26, 2026
33c6eab
fix: align MCP sharing permissions
ibetitsmike Aug 26, 2026
ac1ba20
chore: merge main into MCP ACL sharing
ibetitsmike Aug 26, 2026
5795281
Merge remote-tracking branch 'origin/main' into mike/acl-sharing-a8yw
ibetitsmike Aug 26, 2026
58855aa
fix(coderd): limit ACL candidates route to v2
ibetitsmike Aug 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions coderd/apidoc/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 66 additions & 0 deletions coderd/apidoc/swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion coderd/chat_routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ func (api *API) registerUserAIProviderKeyRoutes(r chi.Router) {
// registerOrganizationChatRoutes mounts the organization-scoped chat and
// MCP server configuration routes; r must already extract the
// organization parameter.
func (api *API) registerOrganizationChatRoutes(r chi.Router) {
func (api *API) registerOrganizationChatRoutes(r chi.Router, prefix chatAPIPrefix) {
r.Route("/mcp-servers", func(r chi.Router) {
r.Get("/", api.listMCPServerConfigs)
r.Post("/", api.createMCPServerConfig)
Expand All @@ -242,6 +242,10 @@ func (api *API) registerOrganizationChatRoutes(r chi.Router) {
policy.ActionShare)).Get("/acl", api.mcpServerConfigACL)
r.With(httpmw.ExtractMCPServerConfigParam(api.Database, api.HTTPAuth.Authorize,
policy.ActionShare)).Patch("/acl", api.patchMCPServerConfigACL)
if prefix == chatAPIPrefixV2 {
r.With(httpmw.ExtractMCPServerConfigParam(api.Database, api.HTTPAuth.Authorize,
policy.ActionShare)).Get("/acl/available", api.mcpServerConfigACLAvailable)
}
r.With(httpmw.ExtractMCPServerConfigParam(api.Database, api.HTTPAuth.Authorize,
policy.ActionRead)).Get("/oauth2/connect", api.mcpServerOAuth2Connect)
})
Expand Down
1 change: 1 addition & 0 deletions coderd/chat_routes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ func TestChatRoutesCompatibility(t *testing.T) {
{http.MethodGet, "/api/v2/chats/config/advisor"},
{http.MethodGet, fmt.Sprintf("/api/v2/chats/%s/debug/runs", chat.ID)},
{http.MethodGet, fmt.Sprintf("/api/v2/chats/%s/stream/desktop", chat.ID)},
{http.MethodGet, fmt.Sprintf("/api/experimental/organizations/%s/mcp-servers/not-a-uuid/acl/available", firstUser.OrganizationID)},
{http.MethodGet, "/api/v2/mcp/servers/not-a-uuid/oauth2/callback"},
{http.MethodPost, "/api/v2/mcp/http/server"},
} {
Expand Down
4 changes: 2 additions & 2 deletions coderd/coderd.go
Original file line number Diff line number Diff line change
Expand Up @@ -1383,7 +1383,7 @@ func New(options *Options) *API {
r.Use(apiKeyMiddleware)
r.Route("/{organization}", func(r chi.Router) {
r.Use(httpmw.ExtractOrganizationParam(options.Database))
api.registerOrganizationChatRoutes(r)
api.registerOrganizationChatRoutes(r, chatAPIPrefixExperimental)
r.Route("/members/{user}", func(r chi.Router) {
r.Use(httpmw.ExtractOrganizationMemberParam(options.Database))
api.registerOrganizationMemberChatRoutes(r)
Expand Down Expand Up @@ -1514,7 +1514,7 @@ func New(options *Options) *API {
r.Use(
httpmw.ExtractOrganizationParam(options.Database),
)
api.registerOrganizationChatRoutes(r)
api.registerOrganizationChatRoutes(r, chatAPIPrefixV2)
r.Get("/", api.organization)
r.Post("/templateversions", api.postTemplateVersionsByOrganization)
r.Route("/templates", func(r chi.Router) {
Expand Down
3 changes: 2 additions & 1 deletion coderd/mcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,8 @@ func (api *API) getMCPServerConfig(rw http.ResponseWriter, r *http.Request) {
hasFullView := api.Authorize(r, policy.ActionUpdate, config) ||
api.Authorize(r, policy.ActionRead, rbac.ResourceAuditLog.InOrg(config.OrganizationID))
if !hasFullView && !config.Enabled &&
!api.Authorize(r, policy.ActionDelete, config) {
!api.Authorize(r, policy.ActionDelete, config) &&
!api.Authorize(r, policy.ActionShare, config) {
Comment thread
ibetitsmike marked this conversation as resolved.
httpapi.ResourceNotFound(rw)
return
}
Expand Down
Loading
Loading