Skip to content

Add Pulumi-managed Discord channels (forum/media support) - #208

Merged
localden merged 2 commits into
mainfrom
claude/discord-channels
Oct 5, 2026
Merged

localden merged 2 commits into
mainfrom
claude/discord-channels

Conversation

@claude

@claude claude Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Den Delimarsky · Slack thread

Before: Discord channels were not managed from this repo at all; src/discord.ts only synced roles and member role assignments. There was no way to declare a channel's settings here, and no way to get a thread-only channel (Discord's forum/media types) through the deploy.

After: Maintainers declare channels in src/config/channels.ts, keyed by Discord channel ID. An entry with id adopts the existing channel and enforces the declared settings on it in place (anything not declared is left as it is, name included: it is optional when adopting, so a typo cannot rename a live channel); an entry without id creates a new text, forum or media channel, which is the only way to get thread-only behaviour. Removing an entry never deletes the channel (it is only dropped from Pulumi state), and changing an entry's id or type likewise leaves the old channel alone. Existing text channels cannot be converted: Discord's API only converts text <-> announcement, so type: 'forum' on the id of a text channel fails the deploy with an error that says to create a new forum channel instead.

How: A DiscordChannel dynamic resource in src/discord.ts next to the existing ones, using the shared discordFetch helper and the same discord:botToken/discord:guildId gate: GET /channels/{id} (adopt + refresh), POST /guilds/{guild}/channels (create), PATCH /channels/{id} (settings). read() is side-effect free and stores the live settings as state; a custom diff() compares that state with the declared config, so drift made by hand in Discord is corrected by the next deploy (make up runs pulumi up --refresh), while id/type/guildId changes trigger replacement. Only type-valid fields are sent (forum/media fields never reach text channels, defaultForumLayout only forums), tag IDs read back from Discord are reused so updates do not recreate tags, REQUIRE_TAG is merged into the channel's other flag bits (and refused with a clear error when the channel would have no tags to pick from), position is a create-time hint only (Discord renumbers positions, so it is sent on POST and excluded from drift and PATCH), and the channel POST/PATCH calls carry X-Audit-Log-Reason: modelcontextprotocol/access deploy so the guild audit log shows where a change came from. The config <-> API mapping lives in pure functions in channels.ts; scripts/validate-config.ts checks snowflake formats, duplicates, name length (Discord's 1-100 characters, unicode and emoji allowed) and topic length (1024 text / 4096 forum and media), requireTag without tags, the 20-tag limit, type-specific settings and allowed auto-archive durations, and prints a WARNING: without failing for names Discord would normalize (uppercase, spaces) and for requireTag on an adopted channel that relies on the tags already on Discord; scripts/test-config.ts gains 35 tests for validation and mapping. npm run check passes locally: formatting clean, validation OK, 79 tests passed, 0 failed. The README gets a short "Discord channels" section.

Notes for reviewers

  • The deploy bot needs the Manage Channels permission in the guild for POST/PATCH on channels. I could not verify its current permissions from the repo.
  • DISCORD_CHANNELS ships empty, so this PR is a no-op on deploy; it only adds the capability.
  • Converting an existing channel to thread-only means declaring a new forum/media channel here and retiring the old channel by hand once people have moved over.
  • Settings omitted from an entry are not managed (left as they are on Discord), including name on an adopted channel. Removing a setting from an entry stops managing it rather than resetting it. position is applied on creation only; reorder channels in Discord.
  • pulumi is not available in my environment, so npm run build could not be run locally; npx tsc --noEmit reports only the pre-existing missing @pulumi/googleworkspace local SDK (needs pulumi install). CI runs the real build and preview.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SyDWqMwnKtkynCQNahMKxf


Generated by Claude Code

Add a DiscordChannel dynamic resource to src/discord.ts, driven by a new
src/config/channels.ts, so maintainers can declare Discord channels in
this repo. Each entry either adopts an existing channel by its ID and
enforces the declared settings on it in place, or creates a new channel
of type text, forum or media. Forum and media are Discord's only
thread-only channel types.

The resource uses GET/PATCH /channels/{id} and
POST /guilds/{guild}/channels through the existing discordFetch helper.
read() is side-effect free and stores the live settings as `state`;
diff() compares that state with the declared config, so drift made by
hand in Discord is corrected by the next deploy (make up runs
`pulumi up --refresh`). Only declared settings are managed, and only
those valid for the channel type: forum/media settings are never sent to
text channels and defaultForumLayout only to forums. Tag IDs read from
Discord are reused on updates so tags are not recreated, and the
REQUIRE_TAG flag is merged into the channel's other flag bits.

The resource never deletes a channel: delete() only drops the resource
from Pulumi state, because deleting a channel destroys its history.
Changing an entry's `id` or `type` replaces the resource the same way.

Discord cannot convert a text channel into a forum (the API converts
text <-> announcement only), so an existing channel can only have its
settings managed; making it thread-only means creating a new forum/media
channel (no `id`) and retiring the old channel by hand. Adopting a text
channel with type 'forum' fails with an error that says so.

Validation (npm run validate) checks snowflake formats, duplicate
entries, the 20-tag limit, type-specific settings and allowed
auto-archive durations; test-config.ts covers the validation and the
pure config <-> Discord API mapping. DISCORD_CHANNELS ships empty, so
this change is a no-op on deploy.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyDWqMwnKtkynCQNahMKxf
@claude
claude Bot deployed to production October 3, 2026 19:41 Active
@github-actions

github-actions Bot commented Oct 3, 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]
    ~ googleworkspace:index/orgUnit:OrgUnit: (update)
        [id=id:03ph8a2z0nc6rsr]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/orgUnit:OrgUnit::mcp-org-unit]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        description      : "Model Context Protocol"
        name             : "Model Context Protocol"
        parentOrgUnitPath: "/"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=moderators@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::moderators]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : false
        email                : "moderators@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"
    ~ 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_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : true
        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"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=maintainers@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : true
        email                : "maintainers@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"
    ~ 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_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : true
        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"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=lead-maintainers@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::lead-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : false
        email                : "lead-maintainers@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"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=core-maintainers@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::core-maintainers]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : false
        email                : "core-maintainers@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"
    ~ googleworkspace:index/groupSettings:GroupSettings: (update)
        [id=appeals@modelcontextprotocol.io]
        [urn=urn:pulumi:prod::mcp-access::googleworkspace:index/groupSettings:GroupSettings::appeals]
        [provider=urn:pulumi:prod::mcp-access::pulumi:providers:googleworkspace::default_0_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : false
        email                : "appeals@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=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_11_2::2a78e29b-bbb9-425e-a8de-1a161a6a7d9f]
        allowExternalMembers : true
        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"
    --outputs:--
  ~ cloudflareAccessPolicies : {
      ~ security-room-maintainers: {
            accountId      : "c39d6379ccfdb20a3627eeddffa80ec9"
            appCount       : 1
            connectionRules: {
                rdp: {}
            }
            createdAt      : "2026-08-30T07:04:32Z"
            decision       : "allow"
            id             : "11a6814e-bb85-4ea2-aa12-6b081b09aa56"
            includes       : [
                [0]: {
                    githubOrganization: {
                        identityProviderId: "1e53bc11-a504-4572-92d1-4c8d56fc198b"
                        name              : "modelcontextprotocol"
                        team              : "core-maintainers"
                    }
                }
                [1]: {
                    githubOrganization: {
                        identityProviderId: "1e53bc11-a504-4572-92d1-4c8d56fc198b"
                        name              : "modelcontextprotocol"
                        team              : "lead-maintainers"
                    }
                }
                [2]: {
                    githubOrganization: {
                        identityProviderId: "1e53bc11-a504-4572-92d1-4c8d56fc198b"
                        name              : "modelcontextprotocol"
                        team              : "security-managers"
                    }
                }
                [3]: {
                    githubOrganization: {
                        identityProviderId: "1e53bc11-a504-4572-92d1-4c8d56fc198b"
                        name              : "modelcontextprotocol"
                        team              : "security-team"
                    }
                }
            ]
            name           : "Maintainers"
            reusable       : true
            updatedAt      : "2026-09-29T22:44:09Z"
            urn            : "urn:pulumi:prod::mcp-access::cloudflare:index/zeroTrustAccessPolicy:ZeroTrustAccessPolicy::access-policy-security-room-maintainers"
        }
    }
  + discordChannels          : {}
  ~ discordRoles             : {
      ~ administrators (synced)                                 : {
            guildId : "1358869848138059966"
            id      : "1460760673498959945"
            roleId  : "1460760673498959945"
            roleName: "administrators (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-administrators"
        }
      ~ agents working group (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1539652800403996692"
            roleId  : "1539652800403996692"
            roleName: "agents working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-agents-wg"
        }
      ~ auth fine-grained authorization working group (synced)  : {
            guildId : "1358869848138059966"
            id      : "1539652788047577128"
            roleId  : "1539652788047577128"
            roleName: "auth fine-grained authorization working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-auth-wg-fine-grained-authz"
        }
      ~ auth interest group (synced)                            : {
            guildId : "1358869848138059966"
            id      : "1460760779107209370"
            roleId  : "1460760779107209370"
            roleName: "auth interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-auth-ig"
        }
      ~ auth tool scopes working group (synced)                 : {
            guildId : "1358869848138059966"
            id      : "1539652784092090369"
            roleId  : "1539652784092090369"
            roleName: "auth tool scopes working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-auth-wg-tool-scopes"
        }
      ~ c# sdk maintainers (synced)                             : {
            guildId : "1358869848138059966"
            id      : "1460760658848252036"
            roleId  : "1460760658848252036"
            roleName: "c# sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-csharp-sdk"
        }
      ~ client implementor interest group (synced)              : {
            guildId : "1358869848138059966"
            id      : "1460760806584094783"
            roleId  : "1460760806584094783"
            roleName: "client implementor interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-client-implementor-ig"
        }
      ~ community managers (synced)                             : {
            guildId : "1358869848138059966"
            id      : "1461488567162503189"
            roleId  : "1461488567162503189"
            roleName: "community managers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-community-managers"
        }
      ~ community moderators (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1460760656226680903"
            roleId  : "1460760656226680903"
            roleName: "community moderators (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-moderators"
        }
      ~ core maintainers (synced)                               : {
            guildId : "1358869848138059966"
            id      : "1460760682076307516"
            roleId  : "1460760682076307516"
            roleName: "core maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-core-maintainers"
        }
      ~ core primitive working group (synced)                   : {
            guildId : "1358869848138059966"
            id      : "1540128486218539018"
            roleId  : "1540128486218539018"
            roleName: "core primitive working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-core-primitive-wg"
        }
      ~ enterprise-managed authorization interest group (synced): {
            guildId : "1358869848138059966"
            id      : "1539652812743381082"
            roleId  : "1539652812743381082"
            roleName: "enterprise-managed authorization interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-enterprise-managed-authorization-ig"
        }
      ~ file uploads working group (synced)                     : {
            guildId : "1358869848138059966"
            id      : "1497125934359249018"
            roleId  : "1497125934359249018"
            roleName: "file uploads working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-file-uploads-wg"
        }
      ~ filesystems working group (synced)                      : {
            guildId : "1358869848138059966"
            id      : "1547367326343630958"
            roleId  : "1547367326343630958"
            roleName: "filesystems working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-filesystems-wg"
        }
      ~ financial services interest group (synced)              : {
            guildId : "1358869848138059966"
            id      : "1460760782605123726"
            roleId  : "1460760782605123726"
            roleName: "financial services interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-financial-services-ig"
        }
      ~ gateways interest group (synced)                        : {
            guildId : "1358869848138059966"
            id      : "1461148028646854859"
            roleId  : "1461148028646854859"
            roleName: "gateways interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-gateways-ig"
        }
      ~ go sdk maintainers (synced)                             : {
            guildId : "1358869848138059966"
            id      : "1460760804134752443"
            roleId  : "1460760804134752443"
            roleName: "go sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-go-sdk"
        }
      ~ infrastructure working group (synced)                   : {
            guildId : "1358869848138059966"
            id      : "1551964002974830692"
            roleId  : "1551964002974830692"
            roleName: "infrastructure working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-infrastructure-wg"
        }
      ~ inspector maintainers (synced)                          : {
            guildId : "1358869848138059966"
            id      : "1460760676367597740"
            roleId  : "1460760676367597740"
            roleName: "inspector maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-inspector-maintainers"
        }
      ~ interceptors working group (synced)                     : {
            guildId : "1358869848138059966"
            id      : "1496277766046355539"
            roleId  : "1496277766046355539"
            roleName: "interceptors working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-interceptors-wg"
        }
      ~ java sdk maintainers (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1460760695821041767"
            roleId  : "1460760695821041767"
            roleName: "java sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-java-sdk"
        }
      ~ kotlin sdk maintainers (synced)                         : {
            guildId : "1358869848138059966"
            id      : "1460760698316652557"
            roleId  : "1460760698316652557"
            roleName: "kotlin sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-kotlin-sdk"
        }
      ~ lead maintainers (synced)                               : {
            guildId : "1358869848138059966"
            id      : "1460760679064535238"
            roleId  : "1460760679064535238"
            roleName: "lead maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-lead-maintainers"
        }
      ~ maintainers (synced)                                    : {
            guildId : "1358869848138059966"
            id      : "1460760670395039755"
            roleId  : "1460760670395039755"
            roleName: "maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-maintainers"
        }
      ~ mcp apps working group (synced)                         : {
            guildId : "1358869848138059966"
            id      : "1461149104573907161"
            roleId  : "1461149104573907161"
            roleName: "mcp apps working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-mcp-apps-wg"
        }
      ~ php sdk maintainers (synced)                            : {
            guildId : "1358869848138059966"
            id      : "1460760711796887821"
            roleId  : "1460760711796887821"
            roleName: "php sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-php-sdk"
        }
      ~ primitive grouping interest group (synced)              : {
            guildId : "1358869848138059966"
            id      : "1471155142358339685"
            roleId  : "1471155142358339685"
            roleName: "primitive grouping interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-primitive-grouping-ig"
        }
      ~ python sdk maintainers (synced)                         : {
            guildId : "1358869848138059966"
            id      : "1460760717434163281"
            roleId  : "1460760717434163281"
            roleName: "python sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-python-sdk"
        }
      ~ reference servers maintainers (synced)                  : {
            guildId : "1358869848138059966"
            id      : "1460760661985464506"
            roleId  : "1460760661985464506"
            roleName: "reference servers maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-reference-servers-maintainers"
        }
      ~ registry maintainers (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1460760690611720404"
            roleId  : "1460760690611720404"
            roleName: "registry maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-registry-maintainers"
        }
      ~ ruby sdk maintainers (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1460760769758101595"
            roleId  : "1460760769758101595"
            roleName: "ruby sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-ruby-sdk"
        }
      ~ rust sdk maintainers (synced)                           : {
            guildId : "1358869848138059966"
            id      : "1460760775705493770"
            roleId  : "1460760775705493770"
            roleName: "rust sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-rust-sdk"
        }
      ~ sdk maintainers (synced)                                : {
            guildId : "1358869848138059966"
            id      : "1460760687444758623"
            roleId  : "1460760687444758623"
            roleName: "sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-sdk-maintainers"
        }
      ~ server card working group (synced)                      : {
            guildId : "1358869848138059966"
            id      : "1493598979357671554"
            roleId  : "1493598979357671554"
            roleName: "server card working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-server-card-wg"
        }
      ~ skills over mcp working group (synced)                  : {
            guildId : "1358869848138059966"
            id      : "1539652804610621562"
            roleId  : "1539652804610621562"
            roleName: "skills over mcp working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-skills-over-mcp-wg"
        }
      ~ swift sdk maintainers (synced)                          : {
            guildId : "1358869848138059966"
            id      : "1460760701344813136"
            roleId  : "1460760701344813136"
            roleName: "swift sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-swift-sdk"
        }
      ~ tool annotations interest group (synced)                : {
            guildId : "1358869848138059966"
            id      : "1483420327001329685"
            roleId  : "1483420327001329685"
            roleName: "tool annotations interest group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-tool-annotations-ig"
        }
      ~ transports working group (synced)                       : {
            guildId : "1358869848138059966"
            id      : "1460760773134651505"
            roleId  : "1460760773134651505"
            roleName: "transports working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-transport-wg"
        }
      ~ triggers & events working group (synced)                : {
            guildId : "1358869848138059966"
            id      : "1486488186405392518"
            roleId  : "1486488186405392518"
            roleName: "triggers & events working group (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-triggers-events-wg"
        }
      ~ typescript sdk maintainers (synced)                     : {
            guildId : "1358869848138059966"
            id      : "1460760714607071465"
            roleId  : "1460760714607071465"
            roleName: "typescript sdk maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-typescript-sdk"
        }
      ~ use-mcp maintainers (synced)                            : {
            guildId : "1358869848138059966"
            id      : "1460760684643221556"
            roleId  : "1460760684643221556"
            roleName: "use-mcp maintainers (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-use-mcp-maintainers"
        }
      ~ wg/ig facilitators (synced)                             : {
            guildId : "1358869848138059966"
            id      : "1466097565048246467"
            roleId  : "1466097565048246467"
            roleName: "wg/ig facilitators (synced)"
            token   : [secret]
            urn     : "urn:pulumi:prod::mcp-access::pulumi-nodejs:dynamic:Resource::discord-role-wg-ig-facilitators"
        }
    }
  ~ githubTeams              : {
      ~ agents-wg                    : {
            createDefaultMaintainer: false
            description            : "Agents Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"0b1efde8dfdad6e81ef44f780a3260673ff2a9df71ed6ad899b7b58db3c1dcc4\""
            id                     : "17337325"
            membersCount           : 4
            name                   : "agents-wg"
            nodeId                 : "T_kwDOCt2Azc4BCIvt"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "agents-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::agents-wg"
        }
      ~ auth-maintainers             : {
            createDefaultMaintainer: false
            description            : "Auth Maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"6de0e38fa0fa638f201f76a59bcc8f561bd607c4e8b88a3d44d3a6ead1d083e5\""
            id                     : "16083315"
            membersCount           : 7
            name                   : "auth-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A9Wlz"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "auth-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::auth-maintainers"
        }
      ~ auth-wg-fine-grained-authz   : {
            createDefaultMaintainer: false
            description            : "Auth Fine-Grained Authorization Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"8ee5587ff93bb608fe181a7604dbbc81d53139c72e8dab4352fde11e6deb7018\""
            id                     : "19051555"
            membersCount           : 0
            name                   : "auth-wg-fine-grained-authz"
            nodeId                 : "T_kwDOCt2Azc4BIrQj"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "auth-wg-fine-grained-authz"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::auth-wg-fine-grained-authz"
        }
      ~ auth-wg-tool-scopes          : {
            createDefaultMaintainer: false
            description            : "Auth Tool Scopes Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"8370c2f7d0e99b9aba3dc85cb921006ced13357b67fbc82bcfc53cc8c44c7891\""
            id                     : "19051557"
            membersCount           : 0
            name                   : "auth-wg-tool-scopes"
            nodeId                 : "T_kwDOCt2Azc4BIrQl"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "auth-wg-tool-scopes"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::auth-wg-tool-scopes"
        }
      ~ conformance-auth             : {
            createDefaultMaintainer: false
            description            : "Conformance authorization-server code owners \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"4d1526849b2f9b8217312a40b4a80a003d3b79e97a2511e3d14a88d23a2ccf8f\""
            id                     : "19337897"
            membersCount           : 2
            name                   : "conformance-auth"
            nodeId                 : "T_kwDOCt2Azc4BJxKp"
            notificationSetting    : "notifications_enabled"
            privacy                : "closed"
            slug                   : "conformance-auth"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::conformance-auth"
        }
      ~ core-maintainers             : {
            createDefaultMaintainer: false
            description            : "Core maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"197e137d829f238ef882a82b2b465797772f8b9525f6c31b2a1b675958957a2f\""
            id                     : "14435865"
            membersCount           : 11
            name                   : "core-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A3EYZ"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435861"
            parentTeamReadId       : "14435861"
            parentTeamReadSlug     : "steering-committee"
            privacy                : "closed"
            slug                   : "core-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::core-maintainers"
        }
      ~ core-primitive-wg            : {
            createDefaultMaintainer: false
            description            : "Core Primitive Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"51759aee2703071fffb480c438a869dada2f4fad4ced81752cff8355df9cc193\""
            id                     : "19087061"
            membersCount           : 2
            name                   : "core-primitive-wg"
            nodeId                 : "T_kwDOCt2Azc4BIz7V"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "core-primitive-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::core-primitive-wg"
        }
      ~ csharp-sdk                   : {
            createDefaultMaintainer: false
            description            : "Official C# SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"f86642056d44d04d8e620a42827ad5ffa53dd82c060881dc3ef0409a0f396d1a\""
            id                     : "14435898"
            membersCount           : 10
            name                   : "csharp-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY6"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435871"
            parentTeamReadId       : "14435871"
            parentTeamReadSlug     : "sdk-maintainers"
            privacy                : "closed"
            slug                   : "csharp-sdk"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::csharp-sdk"
        }
      ~ csharp-sdk-admin             : {
            createDefaultMaintainer: false
            description            : "C# SDK repository admins \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"923b8e831f82cb529686040971aa9d52732631c2ca8e68aa59291fceb736d1eb\""
            id                     : "16644883"
            membersCount           : 8
            name                   : "csharp-sdk-admin"
            nodeId                 : "T_kwDOCt2Azc4A_fsT"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435898"
            parentTeamReadId       : "14435898"
            parentTeamReadSlug     : "csharp-sdk"
            privacy                : "closed"
            slug                   : "csharp-sdk-admin"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::csharp-sdk-admin"
        }
      ~ docs-maintainers             : {
            createDefaultMaintainer: false
            description            : "MCP docs maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"fce3dff5ed668a9f7bc03c356630b475349b6ff91111f7eb77699794254840ad\""
            id                     : "15811679"
            membersCount           : 13
            name                   : "docs-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A8URf"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435861"
            parentTeamReadId       : "14435861"
            parentTeamReadSlug     : "steering-committee"
            privacy                : "closed"
            slug                   : "docs-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::docs-maintainers"
        }
      ~ file-uploads-wg              : {
            createDefaultMaintainer: false
            description            : "File Uploads Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"3220429639a629a229a958ee277d9801b8759e28366a92aa7995915f3afb3ac5\""
            id                     : "17260661"
            membersCount           : 4
            name                   : "file-uploads-wg"
            nodeId                 : "T_kwDOCt2Azc4BB2B1"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "file-uploads-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::file-uploads-wg"
        }
      ~ filesystems-wg               : {
            createDefaultMaintainer: false
            description            : "Filesystems Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"cf1a736ef7b6a61e9bd92f836186a94a56ec8f4e94244745a0dfc9f8c5f76c9d\""
            id                     : "19423521"
            membersCount           : 5
            name                   : "filesystems-wg"
            nodeId                 : "T_kwDOCt2Azc4BKGEh"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "filesystems-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::filesystems-wg"
        }
      ~ go-sdk                       : {
            createDefaultMaintainer: false
            description            : "The Go SDK Team \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"2fe9974eb9293e8add9bb5763b950ac987d12b2fee68f09f3a5b87f9ad7b6b42\""
            id                     : "14435896"
            membersCount           : 10
            name                   : "go-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY4"
            notificationSetting    : "notifications_enabled"
            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/\"b2b8566978965286655da7bed603a8838f68948c0879d0b1b9886557de2bdd41\""
            id                     : "14435884"
            membersCount           : 5
            name                   : "ig-financial-services"
            nodeId                 : "T_kwDOCt2Azc4A3EYs"
            notificationSetting    : "notifications_enabled"
            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"
        }
      ~ infrastructure-wg            : {
            createDefaultMaintainer: false
            description            : "Infrastructure Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"0f3f6d73b4961769afe29e5701dff3e7b5de2836fa3e0cb6ccf35dadb6425611\""
            id                     : "19662960"
            membersCount           : 4
            name                   : "infrastructure-wg"
            nodeId                 : "T_kwDOCt2Azc4BLAhw"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "infrastructure-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::infrastructure-wg"
        }
      ~ inspector-maintainers        : {
            createDefaultMaintainer: false
            description            : "MCP Inspector maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"672e91fe663682c496ef39f33af3a66716ce5a45c9d264fc64e07e585e09b1ad\""
            id                     : "14642559"
            membersCount           : 4
            name                   : "inspector-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A321_"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435861"
            parentTeamReadId       : "14435861"
            parentTeamReadSlug     : "steering-committee"
            privacy                : "closed"
            slug                   : "inspector-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::inspector-maintainers"
        }
      ~ interceptors-wg              : {
            createDefaultMaintainer: false
            description            : "Interceptors Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"42064a66733d77c44ea5c85d064eaf98b0a0366f6ee77d0ac1794864f2b11911\""
            id                     : "17218506"
            membersCount           : 10
            name                   : "interceptors-wg"
            nodeId                 : "T_kwDOCt2Azc4BBrvK"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "interceptors-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::interceptors-wg"
        }
      ~ interest-groups              : {
            createDefaultMaintainer: false
            description            : "Interest Groups \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"1a4ee81067e816112f67cfb46e731f2ca28427104714bcc974d4f9f38b75e0ae\""
            id                     : "14435869"
            membersCount           : 18
            name                   : "interest-groups"
            nodeId                 : "T_kwDOCt2Azc4A3EYd"
            notificationSetting    : "notifications_enabled"
            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/\"beb9a8952fa62bec427b0696365c01c4781000f4df0f8c79d12e4466d57a4252\""
            id                     : "14435899"
            membersCount           : 4
            name                   : "java-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY7"
            notificationSetting    : "notifications_enabled"
            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/\"e01d8b15e8c912d9ae4c6b60a17e5c9b4a1dca6eafd503d90b0fbeb83393b6bc\""
            id                     : "14435895"
            membersCount           : 6
            name                   : "kotlin-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY3"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435871"
            parentTeamReadId       : "14435871"
            parentTeamReadSlug     : "sdk-maintainers"
            privacy                : "closed"
            slug                   : "kotlin-sdk"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::kotlin-sdk"
        }
      ~ lead-maintainers             : {
            createDefaultMaintainer: false
            description            : "Lead core maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"819539337994bf0babd6bb5f1339968192ef5262c445d5ff22543e2794be180a\""
            id                     : "15811944"
            membersCount           : 5
            name                   : "lead-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A8UVo"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435861"
            parentTeamReadId       : "14435861"
            parentTeamReadSlug     : "steering-committee"
            privacy                : "closed"
            slug                   : "lead-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::lead-maintainers"
        }
      ~ maintainers                  : {
            createDefaultMaintainer: false
            description            : "General maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"d0b309ef2a65a786df48572a189e0a998155a945a4dfdf017802c265ff89260d\""
            id                     : "19344364"
            membersCount           : 22
            name                   : "maintainers"
            nodeId                 : "T_kwDOCt2Azc4BJyvs"
            notificationSetting    : "notifications_enabled"
            privacy                : "closed"
            slug                   : "maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::maintainers"
        }
      ~ mcp-apps-sdk                 : {
            createDefaultMaintainer: false
            description            : "Official MCP Apps SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"28950fb0609bb004f26afce5e61a7e17062ebe05d60601acaf6fbbcede936b8f\""
            id                     : "15826445"
            membersCount           : 5
            name                   : "mcp-apps-sdk"
            nodeId                 : "T_kwDOCt2Azc4A8X4N"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435871"
            parentTeamReadId       : "14435871"
            parentTeamReadSlug     : "sdk-maintainers"
            privacy                : "closed"
            slug                   : "mcp-apps-sdk"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::mcp-apps-sdk"
        }
      ~ mcp-apps-wg                  : {
            createDefaultMaintainer: false
            description            : "MCP Apps Working Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"9d3221df16c612d87775609b63d2912305b609c1a8f373ed47bc0c110284b774\""
            id                     : "15826444"
            membersCount           : 3
            name                   : "mcp-apps-wg"
            nodeId                 : "T_kwDOCt2Azc4A8X4M"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435868"
            parentTeamReadId       : "14435868"
            parentTeamReadSlug     : "working-groups"
            privacy                : "closed"
            slug                   : "mcp-apps-wg"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::mcp-apps-wg"
        }
      ~ mcpb-maintainers             : {
            createDefaultMaintainer: false
            description            : "MCPB (Model Context Protocol Bundle) maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"5aae10a933563de42431e30bbaf1c4fde4a742a6c0fc3cad21bff7b373068f35\""
            id                     : "14899069"
            membersCount           : 5
            name                   : "mcpb-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A41d9"
            notificationSetting    : "notifications_enabled"
            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/\"bdd3814ce80f81d62ab5f13220444bdbcc3adaa167cb1a180aa6917e64399b6c\""
            id                     : "14435866"
            membersCount           : 12
            name                   : "moderators"
            nodeId                 : "T_kwDOCt2Azc4A3EYa"
            notificationSetting    : "notifications_enabled"
            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/\"bd6a787d8f84314e04e5b028fdd5c933cdaffb0685e54c2695ab11debaf8b7b5\""
            id                     : "14435889"
            membersCount           : 9
            name                   : "php-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EYx"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435871"
            parentTeamReadId       : "14435871"
            parentTeamReadSlug     : "sdk-maintainers"
            privacy                : "closed"
            slug                   : "php-sdk"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::php-sdk"
        }
      ~ primitive-grouping-ig        : {
            createDefaultMaintainer: false
            description            : "Primitive Grouping Interest Group \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"a9e74dff00d2b3fcf20f71d6ff266ee1eed3e99af25fa89b2f90baba3644bc1b\""
            id                     : "16220576"
            membersCount           : 3
            name                   : "primitive-grouping-ig"
            nodeId                 : "T_kwDOCt2Azc4A94Gg"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435869"
            parentTeamReadId       : "14435869"
            parentTeamReadSlug     : "interest-groups"
            privacy                : "closed"
            slug                   : "primitive-grouping-ig"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::primitive-grouping-ig"
        }
      ~ python-sdk                   : {
            createDefaultMaintainer: false
            description            : "Official Python SDK maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"f0f15d18a4911a45c930849d04b0012f6aba0ff51d5f91f3e276348983cdda09\""
            id                     : "14435893"
            membersCount           : 10
            name                   : "python-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY1"
            notificationSetting    : "notifications_enabled"
            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/\"a0655500b3e4ce1554505a2c6c9e9430353aefe0735be84828955132b3369295\""
            id                     : "14435945"
            membersCount           : 2
            name                   : "python-sdk-auth"
            nodeId                 : "T_kwDOCt2Azc4A3EZp"
            notificationSetting    : "notifications_enabled"
            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"
        }
      ~ reference-servers-maintainers: {
            createDefaultMaintainer: false
            description            : "Reference servers maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"e3853ee43d098606b8c255f73bc984b32f32a1132017b7cef7e1abc3066ec9a0\""
            id                     : "16791801"
            membersCount           : 3
            name                   : "reference-servers-maintainers"
            nodeId                 : "T_kwDOCt2Azc4BADj5"
            notificationSetting    : "notifications_enabled"
            privacy                : "closed"
            slug                   : "reference-servers-maintainers"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::reference-servers-maintainers"
        }
      ~ registry-collaborators       : {
            createDefaultMaintainer: false
            description            : "Registry working group collaborators \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"733b8d1f20668c205083bb7a460f0f6c1db199aa77651389da1bf370f65c01d1\""
            id                     : "17849690"
            membersCount           : 1
            name                   : "registry-collaborators"
            nodeId                 : "T_kwDOCt2Azc4BEF1a"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435879"
            parentTeamReadId       : "14435879"
            parentTeamReadSlug     : "registry-wg"
            privacy                : "closed"
            slug                   : "registry-collaborators"
            urn                    : "urn:pulumi:prod::mcp-access::github:index/team:Team::registry-collaborators"
        }
      ~ registry-wg                  : {
            createDefaultMaintainer: false
            description            : "Official registry builders and maintainers \n(Managed by github.com/modelcontextprotocol/access)"
            etag                   : "W/\"a05431fa207610160a230d8f686121e20948a75cedd94057ec9f8818b2a8be24\""
            id                     : "14435879"
            membersCount           : 4
            name                   : "registry-wg"
            nodeId                 : "T_kwDOCt2Azc4A3EYn"
            notificationSetting    : "notifications_enabled"
            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/\"ec7973b47f7f181716dcd7f186c5bb0d7cbd073e1a0e204d3bfebf610b8ec7d2\""
            id                     : "14435891"
            membersCount           : 4
            name                   : "ruby-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EYz"
            notificationSetting    : "notifications_enabled"
            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/\"c58ed5e9e239a44d3ea03dfa8911b0f9a2a4f6f4b398a361da197a8e681fe6c2\""
            id                     : "14435894"
            membersCount           : 7
            name                   : "rust-sdk"
            nodeId                 : "T_kwDOCt2Azc4A3EY2"
            notificationSetting    : "notifications_enabled"
            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/\"ce0067820b461c1ea8cdc958ca8c9cca1bb8cb8b7c698e9fecc560ac1f8669f4\""
            id                     : "14435871"
            membersCount           : 61
            name                   : "sdk-maintainers"
            nodeId                 : "T_kwDOCt2Azc4A3EYf"
            notificationSetting    : "notifications_enabled"
            parentTeamId           : "14435861"
            parentTeamReadId       : "14435861"
            parentTeamReadSlug     : "steering-committee"
            privacy        

... (truncated)

@localden
localden marked this pull request as ready for review October 3, 2026 20:16
@localden
localden requested a review from a team as a code owner October 3, 2026 20:16
- name is optional when adopting by id (DiscordChannelConfig is now a
  union of adopted/new entries); it is sent in the PATCH and compared for
  drift only when declared, and labels fall back to the id
- Name validation follows Discord's rule (1-100 code points); uppercase
  letters and spaces are a WARNING (printed, never failing the check)
- requireTag needs tags: error on a new channel or with availableTags
  empty, warning on an adopted channel that declares none, and the
  provider refuses the PATCH when the live channel has no tags either
- Topic length is validated: 1024 for text, 4096 for forum/media
- position is a create-time hint only (sent on POST, excluded from drift
  and PATCH), documented in channels.ts and the README
- Channel POST/PATCH calls send X-Audit-Log-Reason so the guild audit log
  shows where changes came from

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyDWqMwnKtkynCQNahMKxf
@claude
claude Bot deployed to production October 3, 2026 20:25 Active
@localden
localden merged commit fc80c38 into main Oct 5, 2026
5 checks passed
@localden
localden deleted the claude/discord-channels branch October 5, 2026 04:20

This branch was successfully deployed

1 active deployment
production — 3319c6f2 Deployed Oct 3, 2026 by claude[bot] via Preview Changes #334
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.

2 participants