Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5b2b01d
Use intermediate env var for Pulumi passphrase (#4)
domdomegg Oct 1, 2025
7883dbc
Migrate GitHub teams to infrastructure-as-code (#5)
domdomegg Oct 3, 2025
45497bf
give akimov triage on quickstart-resources
dsp-ant Oct 6, 2025
6e41d74
Add a-akimov to quickstart-resources; Add pre-commit hooks for code q…
dsp-ant Oct 6, 2025
db8d9ea
Add evalstate and cliffhall to docs-maintaners team (#7)
olaservo Oct 7, 2025
55fe24b
Grant auth-wg maintainers admin on ext-auth repository (#8)
pcarleton Oct 14, 2025
e6f5f44
Add inspector maintainer group (#9)
olaservo Oct 20, 2025
0c72db3
add bhosmer-ant to typescript-sdk, python-sdk (#10)
bhosmer-ant Oct 25, 2025
96279fb
Add Peder to FSIG (#11)
sambhav Nov 4, 2025
eb56e47
make max a python sdk maintianer
dsp-ant Nov 7, 2025
9699fbb
Add MCPB maintainers group (#12)
domdomegg Nov 11, 2025
d0cb7df
Add KKonstantinov and mattzcarey to typescript-sdk (#13)
felixweinberger Nov 13, 2025
0377e27
Add felixreiseberg and marshallofsound to mcpb-maintainers (#15)
joan-anthropic Nov 14, 2025
e469f7e
fix typo; (#16)
joan-anthropic Nov 14, 2025
7b068c2
Remove core group (#17)
domdomegg Nov 25, 2025
524a045
give akimov write access
dsp-ant Dec 1, 2025
e20b61b
fix
dsp-ant Dec 1, 2025
e982169
add michael bolin from openai as a rust sdk maintainer
dsp-ant Dec 13, 2025
8d0a1bc
fix
dsp-ant Dec 13, 2025
680934d
Fix deployment: remove stale 'core' team references and add validation
dsp-ant Dec 13, 2025
3c1d641
Add prettier formatting and CI validation checks
dsp-ant Dec 13, 2025
fc9e1ba
fix
dsp-ant Dec 13, 2025
dd446c3
Use GitHub secret for Pulumi GitHub token instead of encrypted config
dsp-ant Dec 13, 2025
609880c
Add one-time migration workflow to set GitHub token and clean up state
dsp-ant Dec 13, 2025
c47f769
Use GITHUB_TOKEN env var for Pulumi GitHub provider
dsp-ant Dec 13, 2025
27f046e
Add state cleanup before deploy to remove orphaned core team
dsp-ant Dec 13, 2025
22972bf
Add bolinfest to rust-sdk group
dsp-ant Dec 13, 2025
fbc1851
Remove bolinfest from rust-sdk group, keep direct push access
dsp-ant Dec 13, 2025
d12eeca
Add jonathanhefner to ruby-sdk (#20)
atesgoral Jan 6, 2026
6aa2a38
add kurtis and caitie to core maintainers as per decision of core mai…
dsp-ant Jan 13, 2026
0c010f3
remove inna from core maintainers as per her own wish
dsp-ant Jan 13, 2026
7281f0d
Add a-akimov to docs-maintaners, tighten inspector/servers permission…
olaservo Jan 13, 2026
f0336a9
Add movetz and stallent as Swift SDK maintainers (#21)
pcarleton Jan 13, 2026
f960494
Add Discord role sync with role-centric architecture (#22)
dsp-ant Jan 13, 2026
4177552
Add dsp-ant to lead-maintainers
dsp-ant Jan 13, 2026
4e08d76
Add user caitiem20 (#26)
CaitieM20 Jan 14, 2026
a1e9b03
Skip preview workflow for fork PRs
dsp-ant Jan 14, 2026
12e0417
Add LucaButBoring (#24)
LucaButBoring Jan 14, 2026
9cd19af
Update discord & email for chr-hertel (#27)
chr-hertel Jan 14, 2026
a3269d3
Add Discord ID to user configuration for Rado (#28)
rdimitrov Jan 14, 2026
ac93a40
Remove automatic refresh from deploy flow
dsp-ant Jan 14, 2026
4c01df2
Updated user Cliff Hall (#25)
cliffhall Jan 14, 2026
6db46ea
chore: add discord identifier for myself (#31)
alexhancock Jan 14, 2026
29f1d92
Core Maintainer Discord IDs (#29)
dend Jan 14, 2026
3b45cbf
add discord id for kurtisvg (#33)
kurtisvg Jan 14, 2026
9fb0db9
Remove invalid Discord ID for ihrpr
dsp-ant Jan 14, 2026
c92a408
Handle missing Discord members gracefully
dsp-ant Jan 14, 2026
95bcd72
Add gateways-ig, roles for Tadas (#30)
tadasant Jan 14, 2026
1ee9051
chore: add apps-wg and discord/github for liad (#32)
liady Jan 15, 2026
52112df
Add Discord IDs for 30 users
dsp-ant Jan 15, 2026
a667c43
Add Discord role inheritance via parent traversal and discordImplies
dsp-ant Jan 15, 2026
b6eba69
Remove redundant MAINTAINERS from SDK users (now implied)
dsp-ant Jan 15, 2026
18253ff
Add maciej to go-sdk maintainers; discord ID for findleyr (#34)
findleyr Jan 15, 2026
d12dc88
Add repo access management for ext-apps, use-mcp, example-remote-client
dsp-ant Jan 15, 2026
e36544e
Fix ext-apps: mcp-apps-wg should have push, not admin
dsp-ant Jan 15, 2026
94a5b31
remove unused scripts
dsp-ant Jan 16, 2026
3c7336f
Add MCP_APPS_SDK role for antonpk1 (ext-apps access)
antonpk1 Jan 19, 2026
ac929e1
Update user config to remove discord IDs
filforopen-source Jul 3, 2026
b32832a
Merge pull request #6 from 55-build-Runtime-state/filforopen-source-p…
filforopen-source Jul 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,27 @@ jobs:
with:
pulumi-version: '3.197.0'

- name: Cache Pulumi plugins
uses: actions/cache@v4
with:
path: ~/.pulumi/plugins
key: pulumi-plugins-${{ hashFiles('Pulumi.yaml') }}
restore-keys: |
pulumi-plugins-

- name: Install Pulumi packages
env:
GITHUB_TOKEN: ${{ github.token }}
run: pulumi install

- name: Install dependencies
run: npm ci

- name: Build
run: npm run build
run: npm run build

- name: Validate config
run: npm run validate

- name: Check formatting
run: npm run format:check
21 changes: 20 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,17 @@ jobs:
with:
pulumi-version: ${{ env.PULUMI_VERSION }}

- name: Cache Pulumi plugins
uses: actions/cache@v4
with:
path: ~/.pulumi/plugins
key: pulumi-plugins-${{ hashFiles('Pulumi.yaml') }}
restore-keys: |
pulumi-plugins-

- name: Install Pulumi packages
env:
GITHUB_TOKEN: ${{ github.token }}
run: pulumi install

- name: Install dependencies
Expand All @@ -49,6 +59,15 @@ jobs:
credentials_json: ${{ secrets.GCP_PROD_SERVICE_ACCOUNT_KEY }}

- name: Deploy to Production
env:
PULUMI_PASSPHRASE: ${{ secrets.PULUMI_PROD_PASSPHRASE }}
GITHUB_TOKEN: ${{ secrets.PULUMI_GITHUB_TOKEN }}
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
DISCORD_GUILD_ID: ${{ secrets.DISCORD_GUILD_ID }}
run: |
echo "${{ secrets.PULUMI_PROD_PASSPHRASE }}" > passphrase.prod.txt
echo "$PULUMI_PASSPHRASE" > passphrase.prod.txt
export PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt
pulumi login gs://mcp-access-prod-pulumi-state
pulumi config set discord:guildId "$DISCORD_GUILD_ID" --stack prod
pulumi config set discord:botToken "$DISCORD_BOT_TOKEN" --secret --stack prod
make up
155 changes: 155 additions & 0 deletions .github/workflows/preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
name: Preview

on:
pull_request:
branches:
- main

permissions:
contents: read
pull-requests: write

env:
PULUMI_VERSION: "3.197.0"

jobs:
preview:
name: Preview Changes
runs-on: ubuntu-latest
# Skip preview for fork PRs - they don't have access to secrets
if: github.event.pull_request.head.repo.full_name == github.repository
environment: production
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'

- name: Setup Pulumi
uses: pulumi/actions@v6
with:
pulumi-version: ${{ env.PULUMI_VERSION }}

- name: Cache Pulumi plugins
uses: actions/cache@v4
with:
path: ~/.pulumi/plugins
key: pulumi-plugins-${{ hashFiles('Pulumi.yaml') }}
restore-keys: |
pulumi-plugins-

- name: Install Pulumi packages
env:
GITHUB_TOKEN: ${{ github.token }}
run: pulumi install

- name: Install dependencies
run: npm ci

- name: Run validation
run: npm run check

- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.GCP_PROD_SERVICE_ACCOUNT_KEY }}

- name: Preview changes
id: preview
env:
PULUMI_PASSPHRASE: ${{ secrets.PULUMI_PROD_PASSPHRASE }}
GITHUB_TOKEN: ${{ secrets.PULUMI_GITHUB_TOKEN }}
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }}
DISCORD_GUILD_ID: ${{ secrets.DISCORD_GUILD_ID }}
run: |
echo "$PULUMI_PASSPHRASE" > passphrase.prod.txt
pulumi login gs://mcp-access-prod-pulumi-state

# Build config flags for Discord if secrets are available
CONFIG_FLAGS=""
if [ -n "$DISCORD_GUILD_ID" ]; then
CONFIG_FLAGS="$CONFIG_FLAGS --config discord:guildId=$DISCORD_GUILD_ID"
fi
if [ -n "$DISCORD_BOT_TOKEN" ]; then
CONFIG_FLAGS="$CONFIG_FLAGS --config discord:botToken=$DISCORD_BOT_TOKEN"
fi

# Run preview and capture output
set +e
PREVIEW_OUTPUT=$(PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt pulumi preview --stack prod --diff $CONFIG_FLAGS 2>&1)
PREVIEW_EXIT_CODE=$?
set -e

# Save output for comment
echo "exit_code=$PREVIEW_EXIT_CODE" >> $GITHUB_OUTPUT

# Write preview to file (handles multiline)
echo "$PREVIEW_OUTPUT" > preview_output.txt

# Also print to logs
echo "$PREVIEW_OUTPUT"

# Exit with preview exit code
exit $PREVIEW_EXIT_CODE

- name: Comment on PR
if: always()
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
let output = '';
try {
output = fs.readFileSync('preview_output.txt', 'utf8');
} catch (e) {
output = 'Failed to read preview output';
}

// Truncate if too long for GitHub comment
const maxLength = 60000;
if (output.length > maxLength) {
output = output.substring(0, maxLength) + '\n\n... (truncated)';
}

const body = `## Pulumi Preview

<details>
<summary>Click to expand preview output</summary>

\`\`\`
${output}
\`\`\`

</details>
`;

// Find existing comment
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});

const botComment = comments.find(c =>
c.user.type === 'Bot' && c.body.includes('## Pulumi Preview')
);

if (botComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: body
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: body
});
}
31 changes: 31 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-merge-conflict

- repo: local
hooks:
- id: typescript-check
name: TypeScript type check
entry: npm run build
language: system
pass_filenames: false
files: \.(ts|tsx)$

- id: validate-config
name: Validate team references
entry: npm run validate
language: system
pass_filenames: false
files: ^src/config/

- id: prettier
name: Prettier formatting
entry: npx prettier --write --ignore-unknown
language: system
types: [text]
files: \.(ts|tsx|js|jsx|json|md)$
5 changes: 5 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
sdks/
*.yaml
*.yml
package-lock.json
7 changes: 7 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 100,
"tabWidth": 2
}
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help login preview up
.PHONY: help login preview refresh up

# Default target
help: ## Show this help message
Expand All @@ -12,5 +12,8 @@ login: ## Login to Pulumi backend (GCS)
preview: login ## Preview infrastructure changes
PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt pulumi preview --stack prod

refresh: login ## Refresh state to match reality
PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt pulumi refresh --yes --stack prod

up: login ## Deploy infrastructure
PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt pulumi up --yes --stack prod
PULUMI_CONFIG_PASSPHRASE_FILE=passphrase.prod.txt pulumi up --yes --stack prod
2 changes: 0 additions & 2 deletions Pulumi.prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,3 @@ config:
googleworkspace:credentials:
secure: v1:Ntr2su0kgwp0oAh3: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
github:owner: modelcontextprotocol
github:token:
secure: v1:RKjKUcq1e0V7kVNf:5PP+vWbnRzgX8MmhF/yp52Fh78cTMBYz798JNc9LiyrubSt4AAZH/y/UA6kErP0FmXfFLRpdDIMmrR3RiNQlCe7nbkB6hf0CsV8mg8U7oB0EkA5wnRlqrZaKBri5l5puy2ZBFWjLhHr6oC714A==
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Infrastructure as Code for managing access to MCP community resources using Pulu
### Manual Deployment

Pre-requisites:

- [Pulumi CLI installed](https://www.pulumi.com/docs/iac/download-install/)
- [Google Cloud SDK installed](https://cloud.google.com/sdk/docs/install)
- Access to GCP project and GCS bucket
Expand Down Expand Up @@ -79,6 +80,7 @@ gsutil mb gs://mcp-access-prod-pulumi-state
```

Then:

1. In Google Workspace Admin Console, go to **Account** → **Admin roles**
2. Select **Groups Admin** role (or create a custom role with these privileges):
- Read, create, update, and delete groups
Expand All @@ -104,5 +106,6 @@ pulumi config set --secret github:token "ghp_your_github_token_here"
### 3. Configure GitHub Actions Secrets

Add the CI/CD secrets to GitHub Actions (repository settings → Secrets and variables → Actions):

- `GCP_PROD_SERVICE_ACCOUNT_KEY`: Content of `sa-key.json`
- `PULUMI_PROD_PASSPHRASE`: The passphrase you set above
Loading