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
23 commits
Select commit Hold shift + click to select a range
9a7d7f3
feat: revoke MCP server OAuth grants at the provider on disconnect
ibetitsmike Jul 16, 2026
c9e1074
fix(coderd): prefer request-supplied revocation URL over discovered v…
ibetitsmike Jul 16, 2026
280c235
fix(coderd): return a generic MCP revocation error to callers
ibetitsmike Jul 16, 2026
85b1df8
fix(coderd): harden MCP revocation error handling
ibetitsmike Jul 16, 2026
f2436e3
fix(coderd): address MCP revocation review feedback
ibetitsmike Jul 16, 2026
ae08bfa
feat(site): add revocation URL to the MCP server OAuth form
ibetitsmike Jul 16, 2026
275c726
fix(site): allow clearing the MCP revocation URL on update
ibetitsmike Jul 16, 2026
d87bcba
fix(coderd): avoid revealing hidden MCP config IDs on oauth2 disconnect
ibetitsmike Jul 17, 2026
c834312
docs: document MCP oauth2 token revocation on disconnect
ibetitsmike Jul 17, 2026
f76f2ad
fix(coderd/x/chatd/mcpclient): fall back to access token when refresh…
ibetitsmike Jul 17, 2026
d584c33
fix(site): surface MCP token revocation failures in the disconnect toast
ibetitsmike Jul 17, 2026
4bccffd
fix(coderd/x/chatd/mcpclient): limit access-token fallback to unsuppo…
ibetitsmike Jul 17, 2026
4d22411
fix: allow clearing the MCP revocation URL and keep the SDK disconnec…
ibetitsmike Jul 17, 2026
618a144
fix(coderd/x/chatd/mcpclient): require https revocation endpoints and…
ibetitsmike Jul 17, 2026
54c72d5
fix(coderd/x/chatd/mcpclient): refuse plaintext redirects during toke…
ibetitsmike Jul 17, 2026
7d5cb47
fix(coderd): enforce the https revocation URL policy on config save
ibetitsmike Jul 17, 2026
ff1d618
fix(coderd/x/chatd/mcpclient): limit the loopback revocation exemptio…
ibetitsmike Jul 17, 2026
df040aa
fix(coderd/x/chatd/mcpclient): reject revocation redirects that drop …
ibetitsmike Jul 17, 2026
2162149
fix(coderd/x/chatd/mcpclient): restrict revocation redirects to the c…
ibetitsmike Jul 17, 2026
615f5eb
fix(coderd/x/chatd/mcpclient): compare full origin in revocation redi…
ibetitsmike Jul 17, 2026
d224379
fix(coderd/x/chatd/mcpclient): reject hostless revocation endpoints
ibetitsmike Jul 17, 2026
3a891cd
fix: prevent MCP token refresh after disconnect
ibetitsmike Jul 18, 2026
d6ebd6b
chore: trim code comments in MCP OAuth2 revocation change
ibetitsmike Jul 18, 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
7 changes: 7 additions & 0 deletions coderd/database/dbauthz/dbauthz.go
Original file line number Diff line number Diff line change
Expand Up @@ -7599,6 +7599,13 @@ func (q *querier) UpdateMCPServerConfig(ctx context.Context, arg database.Update
return q.db.UpdateMCPServerConfig(ctx, arg)
}

func (q *querier) UpdateMCPServerUserTokenFromRefresh(ctx context.Context, arg database.UpdateMCPServerUserTokenFromRefreshParams) (database.MCPServerUserToken, error) {
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceDeploymentConfig); err != nil {
return database.MCPServerUserToken{}, err
}
return q.db.UpdateMCPServerUserTokenFromRefresh(ctx, arg)
}

func (q *querier) UpdateMemberRoles(ctx context.Context, arg database.UpdateMemberRolesParams) (database.OrganizationMember, error) {
// Authorized fetch will check that the actor has read access to the org member since the org member is returned.
member, err := database.ExpectOne(q.OrganizationMembers(ctx, database.OrganizationMembersParams{
Expand Down
11 changes: 11 additions & 0 deletions coderd/database/dbauthz/dbauthz_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1937,6 +1937,17 @@ func (s *MethodTestSuite) TestChats() {
dbm.EXPECT().UpdateMCPServerConfig(gomock.Any(), arg).Return(config, nil).AnyTimes()
check.Args(arg).Asserts(rbac.ResourceDeploymentConfig, policy.ActionUpdate).Returns(config)
}))
s.Run("UpdateMCPServerUserTokenFromRefresh", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
token := testutil.Fake(s.T(), faker, database.MCPServerUserToken{})
arg := database.UpdateMCPServerUserTokenFromRefreshParams{
ID: token.ID,
UpdatedAt: token.UpdatedAt,
AccessToken: "refreshed-access-token",
TokenType: "bearer",
}
dbm.EXPECT().UpdateMCPServerUserTokenFromRefresh(gomock.Any(), arg).Return(token, nil).AnyTimes()
check.Args(arg).Asserts(rbac.ResourceDeploymentConfig, policy.ActionUpdate).Returns(token)
}))
s.Run("UpsertMCPServerUserToken", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
arg := database.UpsertMCPServerUserTokenParams{
MCPServerConfigID: uuid.New(),
Expand Down
1 change: 1 addition & 0 deletions coderd/database/dbgen/dbgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,7 @@ func MCPServerConfig(t testing.TB, db database.Store, seed database.MCPServerCon
OAuth2ClientSecretKeyID: seed.OAuth2ClientSecretKeyID,
OAuth2AuthURL: seed.OAuth2AuthURL,
OAuth2TokenURL: seed.OAuth2TokenURL,
OAuth2RevocationURL: seed.OAuth2RevocationURL,
OAuth2Scopes: seed.OAuth2Scopes,
APIKeyHeader: seed.APIKeyHeader,
APIKeyValue: seed.APIKeyValue,
Expand Down
8 changes: 8 additions & 0 deletions coderd/database/dbmetrics/querymetrics.go

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

15 changes: 15 additions & 0 deletions coderd/database/dbmock/dbmock.go

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

1 change: 1 addition & 0 deletions coderd/database/dump.sql

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE mcp_server_configs
DROP COLUMN oauth2_revocation_url;
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE mcp_server_configs
ADD COLUMN oauth2_revocation_url text NOT NULL DEFAULT '';
1 change: 1 addition & 0 deletions coderd/database/models.go

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

3 changes: 3 additions & 0 deletions coderd/database/querier.go

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

Loading
Loading