TeamSnap MCP Server
The TeamSnap MCP Server connects Claude to your TeamSnap account, allowing you to access and manage sports team data through natural language.
Authenticate with TeamSnap via OAuth 2.0 (
teamsnap_auth), check connection status (teamsnap_auth_status), or disconnect (teamsnap_logout)List all teams you have access to, including names, IDs, sport, division, and season info (
teamsnap_list_teams)Get detailed team information for a specific team by ID (
teamsnap_get_team)View rosters including player and coach names, jersey numbers, positions, and roles (
teamsnap_get_roster)Browse events such as games, practices, and other activities, with optional date range filtering (
teamsnap_get_events), or get details for a specific event (teamsnap_get_event)Check availability/RSVPs for any event, categorizing responses as available, declined, uncertain, or no response (
teamsnap_get_availability)Secure data handling via AES-256-GCM encrypted token storage, read-only TeamSnap access, and CSRF protection
Flexible deployment — run locally, via
npx, or serverlessly on AWS Lambda with API Gateway and DynamoDB for persistent token storage
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TeamSnap MCP ServerWhat games do we have scheduled this month?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TeamSnap MCP Server
A Model Context Protocol (MCP) server that connects Claude to your TeamSnap account. Read and manage teams, rosters, events, availability, volunteer sign-ups, and team communications directly from Claude Desktop or CLI.
Features
21 read tools — teams, rosters, events, availability, locations, contacts, announcements, assignments, opponents, standings, stats, forums, calendars, and custom fields
8 write tools — set RSVPs, create/update/cancel events, create and assign tracked items (snacks, volunteers, carpools), send team messages, and send broadcast email/push announcements
Safety rails on every write —
preview: trueby default returns the payload without calling TeamSnap; destructive writes additionally requireconfirm: true; POST tools support an optionalidempotency_key. See Write Tools & Safety.Localized event times — events always returned in their own timezone; optional viewer-timezone field for travel
Secure — OAuth 2.0 with AES-256-GCM encrypted local storage or DynamoDB
Flexible Deployment — Run locally, via npx, or on AWS Lambda
Prerequisites
Node.js >= 18
A TeamSnap Developer OAuth application (Client ID + Secret)
Quick Start
1. Get TeamSnap OAuth Credentials
Create a new application
Set the redirect URI (see deployment options below)
Note your Client ID and Client Secret
2. Choose Your Deployment
Option A: Local MCP Server
Best for development. Requires a tunnel (e.g., Cloudflare) for the OAuth callback.
git clone https://github.com/mrelph/TeamSnapMCP.git
cd TeamSnapMCP
cp .env.example .env # Add your credentials
npm install
npm run buildAdd to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"teamsnap": {
"command": "node",
"args": ["/path/to/TeamSnapMCP/dist/index.js"],
"env": {
"TEAMSNAP_CLIENT_ID": "your-client-id",
"TEAMSNAP_CLIENT_SECRET": "your-client-secret",
"TEAMSNAP_REDIRECT_URI": "https://your-tunnel-url/callback"
}
}
}
}Tip: Use
cloudflared tunnel --url http://localhost:8374to create an HTTPS callback URL.
Option B: npx (Connects to AWS Deployment)
Easiest option if the AWS backend is already deployed. No local clone needed.
{
"mcpServers": {
"teamsnap": {
"command": "npx",
"args": ["-y", "teamsnap-mcp"],
"env": {
"TEAMSNAP_MCP_ENDPOINT": "https://your-api-id.execute-api.us-east-1.amazonaws.com/mcp"
}
}
}
}Option C: AWS Serverless
Deploy to AWS Lambda for a permanent HTTPS callback URL — no tunnels needed.
cd aws
npm installSet environment variables:
export AWS_ACCESS_KEY_ID=your-aws-key
export AWS_SECRET_ACCESS_KEY=your-aws-secret
export AWS_REGION=us-east-1
export TEAMSNAP_CLIENT_ID=your-client-id
export TEAMSNAP_CLIENT_SECRET=your-client-secretDeploy:
node scripts/deploy.cjsThis creates:
API Gateway — Permanent HTTPS endpoint
Lambda — MCP server (Node.js 20, 256MB, 30s timeout)
DynamoDB — Token storage with TTL auto-cleanup
Then configure Claude Desktop to use the wrapper:
{
"mcpServers": {
"teamsnap": {
"command": "node",
"args": ["/path/to/TeamSnapMCP/dist/wrapper.js"],
"env": {
"TEAMSNAP_MCP_ENDPOINT": "https://your-api-id.execute-api.us-east-1.amazonaws.com/mcp"
}
}
}
}3. Authenticate
Tell Claude: "Connect to TeamSnap"
A browser window will open for OAuth login. Once you authorize, you're connected.
Available Tools
Tool | Description | Required args |
| Connect to TeamSnap via OAuth | — |
| Check connection status | — |
| Disconnect | — |
| List all your teams | — |
| Team details (sport, timezone, public site) |
|
| Players + coaches with contact info, photos |
|
| Events with arrival/duration/uniform/localized times |
|
| One event, with inlined location |
|
| Field address, map link, parking notes |
|
| Event RSVP status grouped |
|
| One member's RSVPs across events |
|
| Parent/guardian contacts (email + phone) |
|
| Recent broadcast emails + alerts + messages |
|
| Snacks/volunteer/carpool sign-ups |
|
| Opponent catalog with head-to-head record |
|
| Team record + division standings |
|
| Team/member/event statistics |
|
| Team forum discussion topics |
|
| Posts in a forum topic |
|
| iCal/webcal feeds (all or games-only) |
|
| League/team custom field values |
|
| Set a member's RSVP for an event (preview by default) |
|
| Update a tracked-item status (preview by default) |
|
| Create a snack/volunteer/carpool tracked item (preview by default) |
|
| Assign a tracked item to a member (preview by default) |
|
| Create a new event (preview by default) |
|
| Update or cancel an event; confirm required for cancel |
|
| Post an in-app team message (preview by default) |
|
| Send an email/alert broadcast; confirm required to send |
|
Availability Status Codes
The teamsnap_get_availability tool groups members into four categories based on the TeamSnap status_code field returned by the API:
Status | Numeric code | String code | Meaning |
|
|
| Member marked as available |
|
|
| Member declined (not attending) |
|
|
| Member is uncertain |
| null/absent | — | Member has not responded |
Note: The numeric code
0for "declined" is a falsy value in JavaScript. The server uses nullish coalescing (??) rather than the logical OR (||) operator when readingstatus_codeto ensure that a numeric0is correctly categorized as "no" rather than silently falling through to "no response".
Write Tools & Safety
Phase 2 added 8 write tools that can modify TeamSnap data. They follow consistent safety rails:
preview: trueby default. Every write tool returns the payload it would send without actually calling TeamSnap, so you can inspect first. Passpreview: falseto commit.confirm: truefor destructive actions.teamsnap_send_announcementalways requires it;teamsnap_update_eventrequires it only when the patch setsis_canceled: true.idempotency_keyfor POST tools. Optional 60-second in-memory dedup cache keyed on the value you supply. Best-effort on Lambda (short function lifetime).Re-authentication. If you authenticated before Phase 2, your existing token has
readscope only. Your first write will returnreauthentication_required— just runteamsnap_authagain to get aread writetoken. Reads continue to work throughout.
Example: preview → commit flow
You: "RSVP Mark as 'yes' for event 12345"
Claude (calls teamsnap_set_availability with defaults):
{ preview: true, would_patch: "availability 987", with: { status: "yes", status_code: 1, notes: null } }
You: "Looks right, do it"
Claude (calls teamsnap_set_availability with preview: false):
{ status: "yes", event_id: 12345, member_id: 67890, notes: null }Example Prompts
Reading:
"What teams do I have in TeamSnap?"
"Show me the roster for the Jr Kraken"
"What games do we have scheduled this month?"
"Who's available for Saturday's game?"
"Who has declined Saturday's game?"
Writing (preview first, commit second):
"Preview setting my RSVP to yes for Saturday's game" → inspect the payload → "Looks right, do it"
"Create a snack sign-up called 'Post-game snacks' for next week's event"
"Post a team message saying 'Uniforms this Saturday are white'"
"Draft an announcement to the team about Sunday's rain-out — don't send it until I confirm"
Architecture
Local Deployment:
Claude Desktop <--stdio--> MCP Server (Node.js)
|
TeamSnap API
|
localhost:8374 (OAuth callback)
AWS Deployment:
Claude Desktop <--stdio--> Wrapper --HTTPS--> API Gateway
|
Lambda
| |
DynamoDB TeamSnap APIEnvironment Variables
Variable | Required | Default | Description |
| Yes (local) | — | OAuth Client ID |
| Yes (local) | — | OAuth Client Secret |
| No |
| Local OAuth callback port |
| No | — | Override redirect URI (for tunnels) |
| AWS wrapper only | — | API Gateway endpoint URL |
| No | — | Your personal ("viewer") timezone. Events are always localized to their own timezone first (from the API); if this variable is set to a different IANA zone, tools add a second |
Security
Encryption — Local tokens encrypted with AES-256-GCM (scrypt key derivation)
OAuth scope —
read writescope requested from TeamSnap; writes are gated behindpreview/confirm(see Write Tools & Safety)No hardcoded credentials — All secrets loaded from environment variables
CSRF protection — OAuth state parameter validation
Auto-cleanup — DynamoDB TTL removes stale pending auth after 10 minutes
File permissions — Local credentials saved with
0600(owner-only)
Development
npm install # Install dependencies
npm run build # Compile TypeScript
npm run dev # Watch mode
node dist/index.js # Run local server
node dist/wrapper.js # Run AWS wrapperAWS deployment
cd aws
npm install
npm run build # Bundle with esbuild
node scripts/deploy.cjs # Deploy to AWSLicense
MIT
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mrelph/TeamSnapMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server