Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
329ca37
feat: audit MCP server config changes
ibetitsmike Aug 7, 2026
f7d4945
chore: polish CODAGT-717 comments per cleanup gate
ibetitsmike Aug 7, 2026
9682815
test(coderd): audit denied MCP server config deletions
ibetitsmike Aug 8, 2026
a72d5cf
fix(enterprise/audit): redact MCP server endpoint URLs in audit diffs
ibetitsmike Aug 8, 2026
0a32b24
fix(coderd): mark deleted MCP server configs in audit logs
ibetitsmike Aug 8, 2026
08a7219
fix(coderd): make MCP config audit records match persisted rows
ibetitsmike Aug 8, 2026
09fb6fb
fix(coderd): audit MCP config deletions against the locked row
ibetitsmike Aug 10, 2026
86d42a7
chore(coderd/database/migrations): renumber migration 000566 to 000569
ibetitsmike Aug 11, 2026
197a759
chore(coderd/database/migrations): renumber migration 000569 to 000570
ibetitsmike Aug 11, 2026
a04fd6f
fix(coderd): address MCP audit review feedback
ibetitsmike Aug 11, 2026
6316be4
fix(enterprise/audit): track MCP server endpoint URLs in audit diffs
ibetitsmike Aug 13, 2026
a848d84
fix(coderd/database): renumber MCP audit migration to 000571
ibetitsmike Aug 13, 2026
db41667
chore: shorten the audit layer reread comment per cleanup gate
ibetitsmike Aug 13, 2026
a0a84be
fix(coderd): drop whitespace-only MCP display name rejection
ibetitsmike Aug 17, 2026
7dfb53e
test(coderd): pass the organization to MCP config SDK calls
ibetitsmike Aug 17, 2026
9eed1a3
fix(coderd/database): renumber MCP audit migration to 000572
ibetitsmike Aug 17, 2026
a3af59d
fix(coderd/audit): fall back to the slug for empty MCP display names
ibetitsmike Aug 17, 2026
bb776b8
test(coderd): audit MCP config creation only when a row persists
ibetitsmike Aug 17, 2026
e39972f
fix(coderd/audit): retain identifiable MCP audit targets
ibetitsmike Aug 18, 2026
d3d9854
fix(enterprise/audit): canonicalize empty MCP fields
ibetitsmike Aug 18, 2026
f48ed8f
test(enterprise/audit): cover MCP header transitions
ibetitsmike Aug 18, 2026
146d8c8
fix(coderd): gate MCP audit links on management access
ibetitsmike Aug 18, 2026
a03f5ff
fix(coderd): match MCP audit links to settings page access
ibetitsmike Aug 18, 2026
b0ffee0
fix(coderd/database): renumber MCP audit migration to 000575
ibetitsmike Aug 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
Prev Previous commit
Next Next commit
test(coderd): audit MCP config creation only when a row persists
  • Loading branch information
ibetitsmike committed Aug 19, 2026
commit bb776b82d27c9468ddacc5b8248c9c7303b59d4f
24 changes: 9 additions & 15 deletions coderd/mcp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,14 +419,14 @@ func TestMCPServerConfigsAudit(t *testing.T) {
require.Empty(t, mAudit.AuditLogs())
})

t.Run("CreateAuditedWhenDiscoveryUpdateFails", func(t *testing.T) {
t.Run("CreateNotAuditedWhenInsertFails", func(t *testing.T) {
t.Parallel()

ctx := testutil.Context(t, testutil.WaitLong)
mAudit := audit.NewMock()
providerKeys := coderdtest.FakeOpenAICompatProviderAPIKeys(t)
db, ps := dbtestutil.NewDB(t)
store := &failingMCPServerConfigUpdateStore{Store: db}
store := &failingMCPServerConfigInsertStore{Store: db}
client := coderdtest.New(t, &coderdtest.Options{
DeploymentValues: mcpDeploymentValues(t),
ChatProviderAPIKeys: &providerKeys,
Expand Down Expand Up @@ -474,7 +474,6 @@ func TestMCPServerConfigsAudit(t *testing.T) {
}))
t.Cleanup(mcpServer.Close)

// The inserted row must still be audited when the post-discovery update fails.
store.fail.Store(true)
mAudit.ResetLogs()
_, err := client.CreateMCPServerConfig(ctx, firstUser.OrganizationID, codersdk.CreateMCPServerConfigRequest{
Expand All @@ -492,12 +491,8 @@ func TestMCPServerConfigsAudit(t *testing.T) {

configs, err := client.MCPServerConfigs(ctx, firstUser.OrganizationID)
require.NoError(t, err)
require.Len(t, configs, 1)

logs := mAudit.AuditLogs()
require.Len(t, logs, 1)
require.Equal(t, database.AuditActionCreate, logs[0].Action)
require.Equal(t, configs[0].ID, logs[0].ResourceID)
require.Empty(t, configs)
require.Empty(t, mAudit.AuditLogs())
})

t.Run("DeletedResourceMarked", func(t *testing.T) {
Expand Down Expand Up @@ -592,19 +587,18 @@ func TestMCPServerConfigsAudit(t *testing.T) {
})
}

// failingMCPServerConfigUpdateStore fails config updates once armed,
// outdating the discovery flow's post-insert credential update.
type failingMCPServerConfigUpdateStore struct {
// failingMCPServerConfigInsertStore fails config inserts once armed.
type failingMCPServerConfigInsertStore struct {
database.Store

fail atomic.Bool
}

func (s *failingMCPServerConfigUpdateStore) UpdateMCPServerConfig(ctx context.Context, arg database.UpdateMCPServerConfigParams) (database.MCPServerConfig, error) {
func (s *failingMCPServerConfigInsertStore) InsertMCPServerConfig(ctx context.Context, arg database.InsertMCPServerConfigParams) (database.MCPServerConfig, error) {
if s.fail.Load() {
return database.MCPServerConfig{}, xerrors.New("injected update failure")
return database.MCPServerConfig{}, xerrors.New("injected insert failure")
}
return s.Store.UpdateMCPServerConfig(ctx, arg)
return s.Store.InsertMCPServerConfig(ctx, arg)
}

// staleMCPServerConfigReadStore corrupts plain config reads once armed,
Expand Down