Skip to content

Add Discord role sync with role-centric architecture#22

Merged
dsp-ant merged 8 commits into
mainfrom
discord-role-sync
Jan 13, 2026
Merged

Add Discord role sync with role-centric architecture#22
dsp-ant merged 8 commits into
mainfrom
discord-role-sync

Conversation

@dsp-ant

@dsp-ant dsp-ant commented Jan 13, 2026

Copy link
Copy Markdown
Member

Summary

This refactors the access management to use a role-centric model where each role explicitly defines which platforms it exists on (GitHub, Discord, Google).

Key Changes

Architecture

  • Replace groups.ts with roleIds.ts + roles.ts for type-safe role definitions
  • Use ROLE_IDS constants to prevent typos in memberOf references
  • Each role has platform-specific config via github/discord/google keys
  • Discord-only roles (e.g., administrators) and GitHub-only roles (e.g., typescript-sdk-auth) are now explicitly modeled

Discord Integration

  • Add Discord role sync via Pulumi Dynamic Provider
  • Uses Discord REST API v10
  • Creates roles and assigns memberships based on role definitions

CI/CD

  • Add PR preview workflow to show Pulumi changes before merge
  • Add test-config.ts for config structure validation
  • New npm run check command runs validation + tests

Bug Fixes

  • Fix typo: docs-maintanersdocs-maintainers

Example Role Definition

{
  id: ROLE_IDS.CORE_MAINTAINERS,
  description: 'Core maintainers',
  github: { team: 'core-maintainers', parent: ROLE_IDS.STEERING_COMMITTEE },
  discord: { role: 'core maintainers' },
  // No google key - not a Google group
}

Required Secrets

Add these to GitHub repository secrets:

  • DISCORD_BOT_TOKEN - Bot token with Manage Roles permission
  • DISCORD_GUILD_ID - Discord server ID

Testing

  • npm run validate passes
  • npm run test passes (18 assertions)
  • Pulumi preview (will run in CI)

@github-actions

github-actions Bot commented Jan 13, 2026

Copy link
Copy Markdown

Pulumi Preview

Click to expand preview output
Previewing update (prod):
  pulumi:pulumi:Stack: (same)
    [urn=urn:pulumi:prod::mcp-access::pulumi:pulumi:Stack::mcp-access-prod]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-moderators]
        guildId   : "1358869848138059966"
        roleName  : "community moderators"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-reference-servers-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "reference servers maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-registry-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "registry maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-core-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "core maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-inspector-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "inspector maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-administrators]
        guildId   : "1358869848138059966"
        roleName  : "administrators"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-sdk-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-use-mcp-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "use-mcp maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-lead-maintainers]
        guildId   : "1358869848138059966"
        roleName  : "lead maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-csharp-sdk]
        guildId   : "1358869848138059966"
        roleName  : "c# sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-typescript-sdk]
        guildId   : "1358869848138059966"
        roleName  : "typescript sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-php-sdk]
        guildId   : "1358869848138059966"
        roleName  : "php sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-java-sdk]
        guildId   : "1358869848138059966"
        roleName  : "java sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-rust-sdk]
        guildId   : "1358869848138059966"
        roleName  : "rust sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-ruby-sdk]
        guildId   : "1358869848138059966"
        roleName  : "ruby sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-server-identity-wg]
        guildId   : "1358869848138059966"
        roleName  : "server identity working group"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-swift-sdk]
        guildId   : "1358869848138059966"
        roleName  : "swift sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-transport-wg]
        guildId   : "1358869848138059966"
        roleName  : "transports working group"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-kotlin-sdk]
        guildId   : "1358869848138059966"
        roleName  : "kotlin sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-agents-ig]
        guildId   : "1358869848138059966"
        roleName  : "agents interest group"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-go-sdk]
        guildId   : "1358869848138059966"
        roleName  : "go sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-python-sdk]
        guildId   : "1358869848138059966"
        roleName  : "python sdk maintainers"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-client-implementor-ig]
        guildId   : "1358869848138059966"
        roleName  : "client implementor interest group"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-financial-services-ig]
        guildId   : "1358869848138059966"
        roleName  : "financial services interest group"
        token     : [secret]
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-auth-ig]
        guildId   : "1358869848138059966"
        roleName  : "auth interest group"
        token     : [secret]
    + github:index/team:Team: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/team:Team::docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        createDefaultMaintainer: false
        description            : "MCP docs maintainers \n(Managed by github.com/modelcontextprotocol/access)"
        name                   : "docs-maintainers"
        parentTeamId           : "14435861"
        privacy                : "closed"
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-member-sync-1425586366288494722]
        expectedRoleIds: [
            [0]: [unknown]
        ]
        guildId        : "1358869848138059966"
        managedRoleIds : [
            [0]: [unknown]
            [1]: [unknown]
            [2]: [unknown]
            [3]: [unknown]
            [4]: [unknown]
            [5]: [unknown]
            [6]: [unknown]
            [7]: [unknown]
            [8]: [unknown]
            [9]: [unknown]
            [10]: [unknown]
            [11]: [unknown]
            [12]: [unknown]
            [13]: [unknown]
            [14]: [unknown]
            [15]: [unknown]
            [16]: [unknown]
            [17]: [unknown]
            [18]: [unknown]
            [19]: [unknown]
            [20]: [unknown]
            [21]: [unknown]
            [22]: [unknown]
            [23]: [unknown]
            [24]: [unknown]
            [25]: [unknown]
        ]
        token          : [secret]
        userId         : "1425586366288494722"
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-member-sync-1272295077074567242]
        expectedRoleIds: [
            [0]: [unknown]
            [1]: [unknown]
            [2]: [unknown]
            [3]: [unknown]
        ]
        guildId        : "1358869848138059966"
        managedRoleIds : [
            [0]: [unknown]
            [1]: [unknown]
            [2]: [unknown]
            [3]: [unknown]
            [4]: [unknown]
            [5]: [unknown]
            [6]: [unknown]
            [7]: [unknown]
            [8]: [unknown]
            [9]: [unknown]
            [10]: [unknown]
            [11]: [unknown]
            [12]: [unknown]
            [13]: [unknown]
            [14]: [unknown]
            [15]: [unknown]
            [16]: [unknown]
            [17]: [unknown]
            [18]: [unknown]
            [19]: [unknown]
            [20]: [unknown]
            [21]: [unknown]
            [22]: [unknown]
            [23]: [unknown]
            [24]: [unknown]
            [25]: [unknown]
        ]
        token          : [secret]
        userId         : "1272295077074567242"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=catch-all@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::catch-all]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_7_0::31d1ad9d-5bcc-47a0-be6c-95fa9e8ef14a]
        email                : "catch-all@modelcontextprotocol.io"
        whoCanContactOwner   : "ALL_OWNERS_CAN_CONTACT"
        whoCanJoin           : "INVITED_CAN_JOIN"
        whoCanLeaveGroup     : "NONE_CAN_LEAVE"
        whoCanModerateMembers: "NONE"
        whoCanPostMessage    : "ANYONE_CAN_POST"
        whoCanViewGroup      : "ALL_MEMBERS_CAN_VIEW"
        whoCanViewMembership : "ALL_IN_DOMAIN_CAN_VIEW"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=registry-wg@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::registry-wg]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_7_0::31d1ad9d-5bcc-47a0-be6c-95fa9e8ef14a]
        email                : "registry-wg@modelcontextprotocol.io"
        whoCanContactOwner   : "ALL_OWNERS_CAN_CONTACT"
        whoCanJoin           : "INVITED_CAN_JOIN"
        whoCanLeaveGroup     : "NONE_CAN_LEAVE"
        whoCanModerateMembers: "NONE"
        whoCanPostMessage    : "ALL_OWNERS_CAN_POST"
        whoCanViewGroup      : "ALL_OWNERS_CAN_VIEW"
        whoCanViewMembership : "ALL_IN_DOMAIN_CAN_VIEW"
    + pulumi-nodejs:dynamic:Resource: (create)
        [urn=urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-member-sync-166107790262272000]
        expectedRoleIds: [
            [0]: [unknown]
            [1]: [unknown]
            [2]: [unknown]
            [3]: [unknown]
            [4]: [unknown]
            [5]: [unknown]
            [6]: [unknown]
            [7]: [unknown]
        ]
        guildId        : "1358869848138059966"
        managedRoleIds : [
            [0]: [unknown]
            [1]: [unknown]
            [2]: [unknown]
            [3]: [unknown]
            [4]: [unknown]
            [5]: [unknown]
            [6]: [unknown]
            [7]: [unknown]
            [8]: [unknown]
            [9]: [unknown]
            [10]: [unknown]
            [11]: [unknown]
            [12]: [unknown]
            [13]: [unknown]
            [14]: [unknown]
            [15]: [unknown]
            [16]: [unknown]
            [17]: [unknown]
            [18]: [unknown]
            [19]: [unknown]
            [20]: [unknown]
            [21]: [unknown]
            [22]: [unknown]
            [23]: [unknown]
            [24]: [unknown]
            [25]: [unknown]
        ]
        token          : [secret]
        userId         : "166107790262272000"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::bhosmer-ant-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "bhosmer-ant"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::cliffhall-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "cliffhall"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::evalstate-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "evalstate"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::dsp-ant-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "dsp-ant"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::ihrpr-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "ihrpr"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::tzolov-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "tzolov"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::jonathanhefner-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "jonathanhefner"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::olaservo-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "olaservo"
    + github:index/teamMembership:TeamMembership: (create)
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::a-akimov-docs-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : [unknown]
        username  : "a-akimov"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=antitrust@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::antitrust]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_7_0::31d1ad9d-5bcc-47a0-be6c-95fa9e8ef14a]
        email                : "antitrust@modelcontextprotocol.io"
        whoCanContactOwner   : "ALL_OWNERS_CAN_CONTACT"
        whoCanJoin           : "INVITED_CAN_JOIN"
        whoCanLeaveGroup     : "NONE_CAN_LEAVE"
        whoCanModerateMembers: "NONE"
        whoCanPostMessage    : "ANYONE_CAN_POST"
        whoCanViewGroup      : "ALL_MEMBERS_CAN_VIEW"
        whoCanViewMembership : "ALL_IN_DOMAIN_CAN_VIEW"
    ~ github:index/team:Team: (update)
        [id=14435945]
        [urn=urn:pulumi:prod::mcp-access::github:index/team:Team::python-sdk-auth]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ description: 
          - Auth related owners 
          + Python SDK auth code owners 
            (Managed by github.com/modelcontextprotocol/access)
    ~ github:index/repositoryCollaborators:RepositoryCollaborators: (update)
        [id=servers]
        [urn=urn:pulumi:prod::mcp-access::github:index/repositoryCollaborators:RepositoryCollaborators::repo-servers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ teams: [
          + [3]: {
                  + permission: "push"
                  + teamId    : [unknown]
                }
          - [4]: {
                  - permission: "push"
                  - teamId    : "14435867"
                }
        ]
    ~ github:index/repositoryCollaborators:RepositoryCollaborators: (update)
        [id=modelcontextprotocol]
        [urn=urn:pulumi:prod::mcp-access::github:index/repositoryCollaborators:RepositoryCollaborators::repo-modelcontextprotocol]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ teams: [
          - [2]: {
                  - permission: "push"
                  - teamId    : "14435867"
                }
          + [3]: {
                  + permission: "push"
                  + teamId    : [unknown]
                }
        ]
    ~ github:index/repositoryCollaborators:RepositoryCollaborators: (update)
        [id=docs]
        [urn=urn:pulumi:prod::mcp-access::github:index/repositoryCollaborators:RepositoryCollaborators::repo-docs]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ teams: [
          + [3]: {
                  + permission: "push"
                  + teamId    : [unknown]
                }
          - [4]: {
                  - permission: "push"
                  - teamId    : "14435867"
                }
        ]
    ~ github:index/repositoryCollaborators:RepositoryCollaborators: (update)
        [id=.github]
        [urn=urn:pulumi:prod::mcp-access::github:index/repositoryCollaborators:RepositoryCollaborators::repo-.github]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ teams: [
          + [3]: {
                  + permission: "triage"
                  + teamId    : [unknown]
                }
          - [4]: {
                  - permission: "triage"
                  - teamId    : "14435867"
                }
        ]
    ~ github:index/repositoryCollaborators:RepositoryCollaborators: (update)
        [id=quickstart-resources]
        [urn=urn:pulumi:prod::mcp-access::github:index/repositoryCollaborators:RepositoryCollaborators::repo-quickstart-resources]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
      ~ teams: [
          + [3]: {
                  + permission: "push"
                  + teamId    : [unknown]
                }
          - [4]: {
                  - permission: "push"
                  - teamId    : "14435867"
                }
        ]
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:jonathanhefner]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::jonathanhefner-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "jonathanhefner"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:evalstate]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::evalstate-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "evalstate"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:dsp-ant]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::dsp-ant-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "dsp-ant"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:cliffhall]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::cliffhall-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "cliffhall"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:tzolov]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::tzolov-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "tzolov"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:bhosmer-ant]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::bhosmer-ant-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "bhosmer-ant"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:ihrpr]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::ihrpr-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "ihrpr"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:olaservo]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::olaservo-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "olaservo"
    - github:index/teamMembership:TeamMembership: (delete)
        [id=14435867:a-akimov]
        [urn=urn:pulumi:prod::mcp-access::github:index/teamMembership:TeamMembership::a-akimov-docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        role      : "member"
        teamId    : "14435867"
        username  : "a-akimov"
    - github:index/team:Team: (delete)
        [id=14435867]
        [urn=urn:pulumi:prod::mcp-access::github:index/team:Team::docs-maintaners]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:github::default_6_9_1::88a9fc3b-1b26-4b1f-bb35-4563ac494cce]
        createDefaultMaintainer: false
        description            : "MCP docs maintainers \n(Managed by github.com/modelcontextprotocol/access)"
        name                   : "docs-maintaners"
        parentTeamId           : "14435861"
        privacy                : "closed"
    --outputs:--
  + discordRoles: {
      + administrators                   : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "administrators"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-administrators"
        }
      + agents interest group            : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "agents interest group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-agents-ig"
        }
      + auth interest group              : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "auth interest group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-auth-ig"
        }
      + c# sdk maintainers               : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "c# sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-csharp-sdk"
        }
      + client implementor interest group: {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "client implementor interest group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-client-implementor-ig"
        }
      + community moderators             : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "community moderators"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-moderators"
        }
      + core maintainers                 : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "core maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-core-maintainers"
        }
      + financial services interest group: {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "financial services interest group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-financial-services-ig"
        }
      + go sdk maintainers               : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "go sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-go-sdk"
        }
      + inspector maintainers            : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "inspector maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-inspector-maintainers"
        }
      + java sdk maintainers             : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "java sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-java-sdk"
        }
      + kotlin sdk maintainers           : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "kotlin sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-kotlin-sdk"
        }
      + lead maintainers                 : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "lead maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-lead-maintainers"
        }
      + maintainers                      : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-maintainers"
        }
      + php sdk maintainers              : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "php sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-php-sdk"
        }
      + python sdk maintainers           : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "python sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-python-sdk"
        }
      + reference servers maintainers    : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "reference servers maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-reference-servers-maintainers"
        }
      + registry maintainers             : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "registry maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-registry-maintainers"
        }
      + ruby sdk maintainers             : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "ruby sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-ruby-sdk"
        }
      + rust sdk maintainers             : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "rust sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-rust-sdk"
        }
      + sdk maintainers                  : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-sdk-maintainers"
        }
      + server identity working group    : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "server identity working group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-server-identity-wg"
        }
      + swift sdk maintainers            : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "swift sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-swift-sdk"
        }
      + transports working group         : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "transports working group"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-transport-wg"
        }
      + typescript sdk maintainers       : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "typescript sdk maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-typescript-sdk"
        }
      + use-mcp maintainers              : {
          + guildId : "1358869848138059966"
          + id      : [unknown]
          + roleId  : [unknown]
          + roleName: "use-mcp maintainers"
          + token   : [secret]
          + urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-use-mcp-maintainers"
        }
    }
  + githubTeams : {
      + auth-wg              : {
          + createDefaultMaintainer: false
          + description            : "Authentication Working Group \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"2438d9e017ee41e1d1aeb4d71f2ee1059c8a315ee03b2fd5f920bf0d6308f5ac\""
          + id                     : "14435880"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "auth-wg"
          + nodeId                 : "T_kwDOCt2Azc4A3EYo"
          + parentTeamId           : "14435868"
          + parentTeamReadId       : "14435868"
          + parentTeamReadSlug     : "working-groups"
          + privacy                : "closed"
          + slug                   : "auth-wg"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::auth-wg"
        }
      + core-maintainers     : {
          + createDefaultMaintainer: false
          + description            : "Core maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"58d1eee0b372c583416fb7ed85ac17f05aa00167527ff8e0123dabf557ffdd23\""
          + id                     : "14435865"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "core-maintainers"
          + nodeId                 : "T_kwDOCt2Azc4A3EYZ"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "core-maintainers"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::core-maintainers"
        }
      + csharp-sdk           : {
          + createDefaultMaintainer: false
          + description            : "Official C# SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"78aef7ae9914a44a6b18fa3694bbdbbf50e3831a06efeefa97bd28481ca7a93a\""
          + id                     : "14435898"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "csharp-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY6"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "csharp-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::csharp-sdk"
        }
      + docs-maintainers     : {
          + createDefaultMaintainer: false
          + description            : "MCP docs maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : [unknown]
          + id                     : [unknown]
          + ldapDn                 : <null>
          + membersCount           : [unknown]
          + name                   : "docs-maintainers"
          + nodeId                 : [unknown]
          + parentTeamId           : "14435861"
          + parentTeamReadId       : [unknown]
          + parentTeamReadSlug     : [unknown]
          + privacy                : "closed"
          + slug                   : [unknown]
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::docs-maintainers"
        }
      + go-sdk               : {
          + createDefaultMaintainer: false
          + description            : "The Go SDK Team \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"6937fd87e32dda0eeaef704d781e4100a270ec8293e8941c824427d12d2db71e\""
          + id                     : "14435896"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "go-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY4"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "go-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::go-sdk"
        }
      + ig-financial-services: {
          + createDefaultMaintainer: false
          + description            : "Financial Services Interest Group \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"7a5c44b77b28274b2715c8c4910a3ad36ce008f920a3497af6f6ae99bfaf1da4\""
          + id                     : "14435884"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "ig-financial-services"
          + nodeId                 : "T_kwDOCt2Azc4A3EYs"
          + parentTeamId           : "14435869"
          + parentTeamReadId       : "14435869"
          + parentTeamReadSlug     : "interest-groups"
          + privacy                : "closed"
          + slug                   : "ig-financial-services"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::ig-financial-services"
        }
      + inspector-maintainers: {
          + createDefaultMaintainer: false
          + description            : "MCP Inspector maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"05d082e65fa68d4b815fa29a7f99682e9085bd318692cdc842affeb183f935de\""
          + id                     : "14642559"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "inspector-maintainers"
          + nodeId                 : "T_kwDOCt2Azc4A321_"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "inspector-maintainers"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::inspector-maintainers"
        }
      + interest-groups      : {
          + createDefaultMaintainer: false
          + description            : "Interest Groups \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"abee72e8d38126d47e1913b1b820ead5a10ba7b931718639d87dd7e025c60243\""
          + id                     : "14435869"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "interest-groups"
          + nodeId                 : "T_kwDOCt2Azc4A3EYd"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "interest-groups"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::interest-groups"
        }
      + java-sdk             : {
          + createDefaultMaintainer: false
          + description            : "Official Java SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"a0c9fd1400d372e329c746751d6d7c9fa1cdf8b27904d9383d85e4c320e0662b\""
          + id                     : "14435899"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "java-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY7"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "java-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::java-sdk"
        }
      + kotlin-sdk           : {
          + createDefaultMaintainer: false
          + description            : "Official Kotlin SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"aee128d9a07187b2c934b72c8fa7e0a51f693a3f64987a3040381868bd379125\""
          + id                     : "14435895"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "kotlin-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY3"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "kotlin-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::kotlin-sdk"
        }
      + mcpb-maintainers     : {
          + createDefaultMaintainer: false
          + description            : "MCPB (Model Context Protocol Bundle) maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"f6be1c8c3f10a8ce54d2520c59a5f57b83567ee582b9b23b7de23ecf6d020ee5\""
          + id                     : "14899069"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "mcpb-maintainers"
          + nodeId                 : "T_kwDOCt2Azc4A41d9"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "mcpb-maintainers"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::mcpb-maintainers"
        }
      + moderators           : {
          + createDefaultMaintainer: false
          + description            : "Community moderators \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"7057f3b170f48ec8680289950045f493eefbfdbe965e1a640a5f1950da7aed18\""
          + id                     : "14435866"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "moderators"
          + nodeId                 : "T_kwDOCt2Azc4A3EYa"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "moderators"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::moderators"
        }
      + php-sdk              : {
          + createDefaultMaintainer: false
          + description            : "Official PHP SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"4d73e2c92d8c500cf172ddcc4deba9f6f18d1408b8d9e61727ebe9fcef467456\""
          + id                     : "14435889"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "php-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EYx"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "php-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::php-sdk"
        }
      + python-sdk           : {
          + createDefaultMaintainer: false
          + description            : "Official Python SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"b07a6f3f43409460e60c5ad4dcda7a709e964a39bb6af5f6d4ace34e1851d1eb\""
          + id                     : "14435893"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "python-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY1"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "python-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::python-sdk"
        }
      + python-sdk-auth      : {
          + createDefaultMaintainer: false
          + description            : "Python SDK auth code owners \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"1321cb31c23bf955df572b61ceedddd5a15e696fe1b0d776439f44948d530f43\""
          + id                     : "14435945"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "python-sdk-auth"
          + nodeId                 : "T_kwDOCt2Azc4A3EZp"
          + parentTeamId           : "14435893"
          + parentTeamReadId       : "14435893"
          + parentTeamReadSlug     : "python-sdk"
          + privacy                : "closed"
          + slug                   : "python-sdk-auth"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::python-sdk-auth"
        }
      + registry-wg          : {
          + createDefaultMaintainer: false
          + description            : "Official registry builders and maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"ddbf779806c31bfe7b8a2857fc61eb394bb41a0f199744df658702d3e6281efe\""
          + id                     : "14435879"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "registry-wg"
          + nodeId                 : "T_kwDOCt2Azc4A3EYn"
          + parentTeamId           : "14435868"
          + parentTeamReadId       : "14435868"
          + parentTeamReadSlug     : "working-groups"
          + privacy                : "closed"
          + slug                   : "registry-wg"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::registry-wg"
        }
      + ruby-sdk             : {
          + createDefaultMaintainer: false
          + description            : "Official Ruby SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"fa26be5844a4890589def804cd7b109c43f81d76061a835beea349e56c348f5d\""
          + id                     : "14435891"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "ruby-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EYz"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "ruby-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::ruby-sdk"
        }
      + rust-sdk             : {
          + createDefaultMaintainer: false
          + description            : "Official Rust SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"52865ad11cb52459a6771a2e8e49b264e8e78273caa2695516946ff1d9b102f4\""
          + id                     : "14435894"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "rust-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EY2"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "rust-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::rust-sdk"
        }
      + sdk-maintainers      : {
          + createDefaultMaintainer: false
          + description            : "Authors and maintainers of official MCP SDKs \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"52f08eb70a0c9151a0310c23a6acc93cd2d0177e1d1e92962773159094fbcb03\""
          + id                     : "14435871"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "sdk-maintainers"
          + nodeId                 : "T_kwDOCt2Azc4A3EYf"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "sdk-maintainers"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::sdk-maintainers"
        }
      + security-wg          : {
          + createDefaultMaintainer: false
          + description            : "Security Working Group \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"207f5d803658f54893cfdae88f8c24d0d0310bf0caf0ec9f60eb67b0e2acb431\""
          + id                     : "14435877"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "security-wg"
          + nodeId                 : "T_kwDOCt2Azc4A3EYl"
          + parentTeamId           : "14435868"
          + parentTeamReadId       : "14435868"
          + parentTeamReadSlug     : "working-groups"
          + privacy                : "closed"
          + slug                   : "security-wg"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::security-wg"
        }
      + steering-committee   : {
          + createDefaultMaintainer: false
          + description            : "MCP Steering Committee \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"9b2019359aa41e83dada7619c054d773a6fc8b3f41c8f154fd182ac84d02c4b8\""
          + id                     : "14435861"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "steering-committee"
          + nodeId                 : "T_kwDOCt2Azc4A3EYV"
          + parentTeamId           : ""
          + parentTeamReadId       : ""
          + parentTeamReadSlug     : ""
          + privacy                : "closed"
          + slug                   : "steering-committee"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::steering-committee"
        }
      + swift-sdk            : {
          + createDefaultMaintainer: false
          + description            : "Official Swift SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"f9c3d2ef40ceb85d60d385bc3314003c3f9402b4f92bb26289f044de097a7d65\""
          + id                     : "14435887"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "swift-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EYv"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "swift-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::swift-sdk"
        }
      + transport-wg         : {
          + createDefaultMaintainer: false
          + description            : "Transport Working Group \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"be33ba364fb9af12e2e7123c1f5d15cbc71f06d703925c570cf25b46a06e9f6d\""
          + id                     : "14435882"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "transport-wg"
          + nodeId                 : "T_kwDOCt2Azc4A3EYq"
          + parentTeamId           : "14435868"
          + parentTeamReadId       : "14435868"
          + parentTeamReadSlug     : "working-groups"
          + privacy                : "closed"
          + slug                   : "transport-wg"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::transport-wg"
        }
      + typescript-sdk       : {
          + createDefaultMaintainer: false
          + description            : "Official TypeScript SDK \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"2d853d242fa47eb7ec1ad2bcb41659b5b6d6ea11cf541e0263754c950250ba0d\""
          + id                     : "14435886"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "typescript-sdk"
          + nodeId                 : "T_kwDOCt2Azc4A3EYu"
          + parentTeamId           : "14435871"
          + parentTeamReadId       : "14435871"
          + parentTeamReadSlug     : "sdk-maintainers"
          + privacy                : "closed"
          + slug                   : "typescript-sdk"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::typescript-sdk"
        }
      + typescript-sdk-auth  : {
          + createDefaultMaintainer: false
          + description            : "Code owners for auth in Typescript SDK \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"7c2291f25e4dc82fe2547a2dc37ce98b5460aff108a425b4b650cdcab8fe5ce1\""
          + id                     : "14435946"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "typescript-sdk-auth"
          + nodeId                 : "T_kwDOCt2Azc4A3EZq"
          + parentTeamId           : "14435886"
          + parentTeamReadId       : "14435886"
          + parentTeamReadSlug     : "typescript-sdk"
          + privacy                : "closed"
          + slug                   : "typescript-sdk-auth"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::typescript-sdk-auth"
        }
      + working-groups       : {
          + createDefaultMaintainer: false
          + description            : "MCP Working Groups \n(Managed by github.com/modelcontextprotocol/access)"
          + etag                   : "W/\"d6062a6f6c393bd57b5b887df2b8661cf0773575fbc025616fc2f853b535c8ba\""
          + id                     : "14435868"
          + ldapDn                 : ""
          + membersCount           : 0
          + name                   : "working-groups"
          + nodeId                 : "T_kwDOCt2Azc4A3EYc"
          + parentTeamId           : "14435861"
          + parentTeamReadId       : "14435861"
          + parentTeamReadSlug     : "steering-committee"
          + privacy                : "closed"
          + slug                   : "working-groups"
          + urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::working-groups"
        }
    }
  + googleGroups: {
      + antitrust  : {
          + adminCreated      : true
          + aliases           : [unknown]
          + description       : "Antitrust compliance contacts \n(Managed by github.com/modelcontextprotocol/access)"
          + directMembersCount: 0
          + email             : "antitrust@modelcontextprotocol.io"
          + etag              : "\"FQEYJqXpeOV6_3YH8wsi-hSMuqN7BUDbJo9YY4QJAu4/mwmLMmjinq73f8DJyUqEtLgFuiE\""
          + id                : "03jtnz0s4hi6gld"
          + name              : "antitrust"
          + nonEditableAliases: [
          +     [0]: "antitrust@modelcontextprotocol.io.test-google-a.com"
            ]
          + timeouts          : [unknown]
          + urn               : "urn:pulumi:prod::mcp-access::googleworkspace:index/group:Group::antitrust"
        }
      + catch-all  : {
          + adminCreated      : true
          + aliases           : [unknown]
          + description       : "Catch-all email group \n(Managed by github.com/modelcontextprotocol/access)"
          + directMembersCount: 0
          + email             : "catch-all@modelcontextprotocol.io"
          + etag              : "\"FQEYJqXpeOV6_3YH8wsi-hSMuqN7BUDbJo9YY4QJAu4/cADRItJ3D1c0IKFDgyoiyNQ3mEs\""
          + id                : "00upglbi31qapnv"
          + name              : "catch-all"
          + nonEditableAliases: [
          +     [0]: "catch-all@modelcontextprotocol.io.test-google-a.com"
            ]
          + timeouts          : [unknown]
          + urn               : "urn:pulumi:prod::mcp-access::googleworkspace:index/group:Group::catch-all"
        }
      + registry-wg: {
          + adminCreated      : true
          + aliases           : [unknown]
          + description       : "Official registry builders and maintainers \n(Managed by github.com/modelcontextprotocol/access)"
          + directMembersCount: 0
          + email             : "registry-wg@modelcontextprotocol.io"
          + etag              : "\"TaxZR2neNIDcsypwUwnkPPkYx7K3_xI58argBEhQ8zk/nuCWnt3MUN-P_zzJ7MZtQBJvx5o\""
          + id                : "040ew0vw3g472qb"
          + name              : "registry-wg"
          + nonEditableAliases: [
          +     [0]: "registry-wg@modelcontextprotocol.io.test-google-a.com"
            ]
          + timeouts          : [unknown]
          + urn               : "urn:pulumi:prod::mcp-access::googleworkspace:index

... (truncated)

This refactors the access management to use a role-centric model where
each role explicitly defines which platforms it exists on (GitHub,
Discord, Google).

Key changes:
- Add Discord role sync via Pulumi Dynamic Provider
- Replace groups.ts with roleIds.ts + roles.ts for type-safe role definitions
- Use ROLE_IDS constants to prevent typos in memberOf references
- Each role has platform-specific config (github/discord/google keys)
- Discord-only roles (e.g., administrators) and GitHub-only roles
  (e.g., typescript-sdk-auth) are now explicitly modeled
- Add PR preview workflow to show Pulumi changes before merge
- Add test-config.ts for config structure validation
- Fix typo: docs-maintaners -> docs-maintainers

Discord roles will match existing server roles:
- administrators, lead maintainers, core maintainers
- sdk maintainers, working groups, interest groups
- etc.

Requires new GitHub secrets:
- DISCORD_BOT_TOKEN
- DISCORD_GUILD_ID
- Add topological sort for GitHub teams to ensure parent teams are
  created before child teams, fixing the registry-wg parentTeamId issue
- Make Discord integration optional by using config.get() instead of
  config.require(), allowing CI preview to succeed without Discord secrets
- Add sortRolesByGitHubDependency() utility function in config/utils.ts

Claude-Generated-By: Claude Code (cli/claude-opus-4-5=20%)
Claude-Steers: 2
Claude-Permission-Prompts: 1
Claude-Escapes: 0
Replace per-role-membership approach with per-user role sync that:
- Adds missing roles users should have
- Removes managed roles users shouldn't have
- Only touches roles defined in config (won't affect admin roles, etc.)

Users not in config remain untouched.

Claude-Generated-By: Claude Code (cli/claude-opus-4-5=100%)
Claude-Steers: 4
Claude-Permission-Prompts: 1
Claude-Escapes: 0
@dsp-ant
dsp-ant merged commit 6440269 into main Jan 13, 2026
5 checks passed
@dsp-ant
dsp-ant deleted the discord-role-sync branch January 13, 2026 22:04
dsp-ant added a commit that referenced this pull request Jan 13, 2026
* Add Discord role sync with role-centric architecture

This refactors the access management to use a role-centric model where
each role explicitly defines which platforms it exists on (GitHub,
Discord, Google).

Key changes:
- Add Discord role sync via Pulumi Dynamic Provider
- Replace groups.ts with roleIds.ts + roles.ts for type-safe role definitions
- Use ROLE_IDS constants to prevent typos in memberOf references
- Each role has platform-specific config (github/discord/google keys)
- Discord-only roles (e.g., administrators) and GitHub-only roles
  (e.g., typescript-sdk-auth) are now explicitly modeled
- Add PR preview workflow to show Pulumi changes before merge
- Add test-config.ts for config structure validation
- Fix typo: docs-maintaners -> docs-maintainers

Discord roles will match existing server roles:
- administrators, lead maintainers, core maintainers
- sdk maintainers, working groups, interest groups
- etc.

Requires new GitHub secrets:
- DISCORD_BOT_TOKEN
- DISCORD_GUILD_ID

* Fix GitHub team ordering and make Discord integration optional

- Add topological sort for GitHub teams to ensure parent teams are
  created before child teams, fixing the registry-wg parentTeamId issue
- Make Discord integration optional by using config.get() instead of
  config.require(), allowing CI preview to succeed without Discord secrets
- Add sortRolesByGitHubDependency() utility function in config/utils.ts

Claude-Generated-By: Claude Code (cli/claude-opus-4-5=20%)
Claude-Steers: 2
Claude-Permission-Prompts: 1
Claude-Escapes: 0

* Reconcile Discord roles for listed users

Replace per-role-membership approach with per-user role sync that:
- Adds missing roles users should have
- Removes managed roles users shouldn't have
- Only touches roles defined in config (won't affect admin roles, etc.)

Users not in config remain untouched.

Claude-Generated-By: Claude Code (cli/claude-opus-4-5=100%)
Claude-Steers: 4
Claude-Permission-Prompts: 1
Claude-Escapes: 0

* Fix descriptions to match existing resources

* Cache Pulumi plugins and fix GITHUB_TOKEN for pulumi install

* Remove accidentally committed state backup

* Use github.token for pulumi install

* Fix formatting

Fix deploy: add pulumi login before config set

Fix deploy: set PULUMI_CONFIG_PASSPHRASE_FILE for config commands

Import existing docs-maintainers team (remove after deploy)

Remove docs-maintainers import workaround

Add docs-maintainers cleanup to state cleanup

Add pulumi refresh before up to sync state with reality

Rename Discord roles to add (synced) suffix

Cleanup Makefile and add lead-maintainers GitHub team
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant