About
Aaif — Model Context Protocol server
README
49 tools across 12 domains for automating Linux Foundation AAIF member onboarding — tier validation, compliance screening, mailing list provisioning, contact management, calendar scheduling, working group enrollment, elections, press releases, brand validation, renewal intelligence, and D1-D5 checklist orchestration.
The same MCP server powers multiple clients:
| Client | Audience | How It Connects |
|---|---|---|
| LFX PCC | PMO staff (day-to-day operations) | MCP client in the PCC operations dashboard |
| Cowork Plugin | Executives & leadership (oversight, status, ad-hoc questions) | Drag-and-drop plugin for Claude Desktop's Cowork tab |
| Intercom Fin | Members (self-service onboarding, FAQ) | MCP data connector for the member-facing chatbot |
| Goose | Developers (optional) | Open-source MCP client for local development |
Sandbox Mode: This server runs entirely on mock data by default. No backend credentials or API access needed to demo all 48 tools. Each connector auto-falls back to mock when its environment variables are unset.
Quick Start (5 minutes)
1. Clone and install
git clone [email protected]:linuxfoundation/aaif-mcp-server.git
cd aaif-mcp-server
pip install -e ".[test]"
2. Add to Claude Desktop
Open Settings > Developer > Edit Config in Claude Desktop, then add this to mcpServers:
{
"mcpServers": {
"aaif-onboarding": {
"command": "python",
"args": ["-m", "aaif_mcp_server.server"],
"cwd": "/path/to/aaif-mcp-server/src"
}
}
}
Alternative if you ran
pip install -e .:{ "mcpServers": { "aaif-onboarding": { "command": "aaif-mcp-server" } } }
3. Restart Claude Desktop
After restarting, you should see 49 tools available. The server runs against mock data by default — no credentials needed to test.
Verify it works
In Claude Desktop, try:
- "Validate Hitachi's membership tier" →
validate_membership_tier - "List contacts for Bloomberg" →
list_contacts - "Enroll Sam Altman in the Agentic Commerce working group" →
enroll_in_working_group - "Check election status for Agentic Commerce chair" →
get_election_status - "What's the churn risk for Natoma?" →
predict_churn_risk - "Draft a press release for OpenAI joining AAIF" →
draft_press_release - "Get the renewal dashboard" →
get_renewal_dashboard - "Run the onboarding checklist for Sam Altman at OpenAI" →
run_onboarding_checklist
Run tests
pytest tests/ -v
# 176 tests pass (28 pre-existing failures in tests without registry init)
Tools (49 across 12 domains)
Domain 1: Mailing List Provisioning (4 tools)
| Tool | Description |
|---|---|
provision_mailing_lists |
Add contact to tier-appropriate lists (dry_run default) |
remove_from_mailing_lists |
Remove contact from all lists |
check_mailing_list_membership |
Check subscription status |
remediate_mailing_lists |
Find and fix list gaps foundation-wide |
Domain 2: Calendar & Meeting Management (3 tools)
| Tool | Description |
|---|---|
provision_calendar_invites |
Send calendar invites based on tier/role |
update_meeting_schedule |
Update WG recurring meeting time/link |
get_upcoming_meetings |
Get upcoming meetings for a contact |
Domain 3: Compliance & Sanctions (4 tools)
| Tool | Description |
|---|---|
check_sanctions |
Look up Descartes screening status in SFDC |
check_tax_exempt_status |
Verify 501(c)(6) compliance |
get_compliance_report |
Full compliance summary |
flag_compliance_issue |
Create compliance ticket for human review |
Domain 4: Tier Validation (3 tools)
| Tool | Description |
|---|---|
validate_membership_tier |
Look up org tier from SFDC |
check_tier_entitlements |
Return entitlement matrix for a tier |
detect_tier_anomalies |
Scan all members for access mismatches |
Domain 5: Contact Role Management (5 tools)
| Tool | Description |
|---|---|
list_contacts |
List all contacts with roles and downstream access |
add_contact |
Add contact, trigger downstream provisioning |
update_contact_role |
Change role, show downstream effects |
remove_contact |
Remove contact, trigger offboarding |
transfer_voting_rights |
Transfer voting rights between contacts |
Domain 6: Working Group Enrollment (5 tools)
| Tool | Description |
|---|---|
enroll_in_working_group |
Enroll across Groups.io + Discord + GitHub + Calendar |
leave_working_group |
Remove from WG across all systems |
list_available_working_groups |
List WGs with enrollment status |
get_wg_members |
Get WG member roster |
check_wg_eligibility |
Check tier/role eligibility for a WG |
Domain 7: Election & Voting Operations (5 tools)
| Tool | Description |
|---|---|
create_election |
Create WG chair election in LFX Platform |
validate_candidate_eligibility |
Check candidate prerequisites |
check_voter_eligibility |
Check voting contact status |
get_election_status |
Get election timeline, candidates, votes |
diagnose_ballot_access |
Diagnose all blockers for ballot access |
Domain 8: Press Release Drafting (3 tools)
| Tool | Description |
|---|---|
draft_press_release |
Generate press release from template + org data |
get_press_release_status |
Check approval workflow progress |
list_press_release_templates |
List available PR templates |
Domain 9: Logo & Brand Validation (3 tools)
| Tool | Description |
|---|---|
validate_logo |
Validate logo against brand guidelines |
get_brand_guidelines |
Retrieve brand specs and requirements |
request_logo_upload |
Generate secure upload URL for logo submission |
Domain 10: Onboarding Call Scheduling (3 tools)
| Tool | Description |
|---|---|
schedule_onboarding_call |
Schedule call with contacts and LF staff |
reschedule_onboarding_call |
Reschedule an existing call |
get_onboarding_call_status |
Check call status (scheduled/pending/done) |
Domain 11: Renewal & Engagement Intelligence (5 tools)
| Tool | Description |
|---|---|
get_renewal_status |
Contract renewal timeline and stage |
get_engagement_score |
Calculate engagement score (0-100) |
predict_churn_risk |
Predict churn risk (0-100) |
get_renewal_dashboard |
Foundation-wide renewal pipeline view |
trigger_renewal_outreach |
Generate outreach plan with email template |
Domain 12: Orchestration (5 tools)
| Tool | Description |
|---|---|
run_onboarding_checklist |
Execute D1-D5 onboarding flow |
get_onboarding_status |
Check checklist progress |
reconcile_silos |
Compare SFDC vs Groups.io vs SSO |
run_offboarding_checklist |
Remove access on departure |
get_silo_health |
Foundation-wide sync health score |
API Access Required for Production
This server connects to 7 external systems. In sandbox mode, all connectors auto-fall back to mock data when their environment variables are unset.
Connector Status
| # | Connector | Service | Auth Type | Sandbox | Production |
|---|---|---|---|---|---|
| 1 | Salesforce | CRM (accounts, contacts) | OAuth 2.0 | Mock | Implemented |
| 2 | Groups.io | Mailing lists | Bearer token | Mock | Implemented |
| 3 | PIS Groups.io | Mailing lists via LFX PIS | X-ACL header | Mock | Built (awaiting creds) |
| 4 | PIS Meeting | LFX Meeting (Zoom-backed) | X-ACL header | Mock | Built (awaiting creds) |
| 5 | PIS GitHub | GitHub org/repo tracking | X-ACL header | Mock | Built (read-only) |
| 6 | Google Calendar | Meeting scheduling (legacy) | Service account JWT | Mock | Replaced by PIS Meeting |
| 7 | Discord | Community channels/roles | Bot token | Mock | Stub |
| 8 | GitHub | Repo collaborator access | PAT (Bearer) | Mock | Stub |
| 9 | LFX Platform | LFID, elections, voting | API key | Mock | Stub |
| 10 | HubSpot | Email templates, outreach | Private app key | Mock | Stub |
Environment Variables
# 0. PIS (Project Infrastructure Service) — X-ACL header auth
# API: V2 — Groups.io, LFX Meeting, GitHub connectors
# Used by: Mailing List Provisioning, Calendar/Meeting Mgmt, WG Enrollment, Offboarding
PIS_ACL_TOKEN=<x-acl-token-from-lf-sso-or-m2m>
PIS_USERNAME=<lfid-username>
PIS_PROJECT_ID=lfZA9uadMdkwBqqHsj
# 1. Salesforce CRM — OAuth 2.0 username-password flow
# API: REST v59.0 — SOQL queries on Account, Contact objects
# Used by: Tier Validation, Compliance, Contact Roles, Orchestrator
SFDC_INSTANCE_URL=https://aaif--sandbox.my.salesforce.com
SFDC_CLIENT_ID=<connected-app-consumer-key>
SFDC_CLIENT_SECRET=<connected-app-consumer-secret>
SFDC_USERNAME=<api-user-email>
SFDC_PASSWORD=<password+security-token>
# 2. Groups.io — Bearer token
# API: v1 — directadd, removemember, getmembers, getgroups
# Used by: Mailing List Provisioning, WG Enrollment
GROUPSIO_API_TOKEN=<bearer-token>
GROUPSIO_ORG_ID=aaif
# 3. Google Calendar — Service account JWT
# API: Calendar v3 — events.insert, events.list, events.patch, events.delete
# Used by: Calendar Management, Call Scheduling, WG Enrollment
GOOGLE_CALENDAR_CREDENTIALS=</path/to/service-account.json>
GOOGLE_CALENDAR_ADMIN_EMAIL=<[email protected]>
# 4. Discord — Bot token
# API: Bot API v10 — guild member roles, channel access
# Used by: WG Enrollment (channel/role provisioning)
DISCORD_BOT_TOKEN=<bot-token>
DISCORD_SERVER_ID=<guild-id>
# 5. GitHub — Personal access token
# API: REST v3 — repos collaborators (add/remove/list)
# Used by: WG Enrollment (repo access)
GITHUB_TOKEN=<pat-with-repo-scope>
GITHUB_ORG=aaif
# 6. LFX Platform — API key
# API: OpenProfile v1 — elections, LFID verification, ballots
# Used by: Elections & Voting, LFID checks
LFX_API_URL=https://api.lfx.platform/v1
LFX_API_KEY=<api-key>
# 7. HubSpot — Private app API key
# API: v3 — transactional email, templates
# Used by: Press Release distribution, Renewal Outreach
HUBSPOT_API_KEY=<private-app-key>
API Operations by Connector
Salesforce (REST v59.0):
POST /services/oauth2/token— authenticateGET /services/data/v59.0/query?q={SOQL}— query accounts, contacts- Custom fields:
Membership_Tier__c,Membership_Status__c,Contract_Signed_Date__c,LFID__c
Groups.io (v1):
POST /directadd— add member to groupPOST /removemember— remove member from groupGET /getmembers— list group members (paginated)GET /getmember— check single membership
Google Calendar (v3):
POST /calendars/{id}/events— create event/inviteGET /calendars/{id}/events— list eventsPATCH /calendars/{id}/events/{eventId}— update eventDELETE /calendars/{id}/events/{eventId}— cancel event
Discord (Bot API v10):
PUT /guilds/{id}/members/{userId}/roles/{roleId}— add roleDELETE /guilds/{id}/members/{userId}/roles/{roleId}— remove roleGET /guilds/{id}/members— list members
GitHub (REST v3):
PUT /repos/{owner}/{repo}/collaborators/{username}— add collaboratorDELETE /repos/{owner}/{repo}/collaborators/{username}— remove collaboratorGET /repos/{owner}/{repo}/collaborators— list collaborators
LFX Platform (v1):
POST /elections— create electionGET /elections/{id}— get election statusGET /contacts/{id}/lfid— verify LFIDGET /elections/{id}/ballot/{contactId}— check ballot status
HubSpot (v3):
POST /transactional/email— send email from templateGET /marketing/emails/templates— list templates
Architecture
src/aaif_mcp_server/
├── server.py # MCP server (FastMCP) — registers 48 tools, 7 resources, 3 prompts
├── config.py # Mock data + provisioning rules + checklist templates
├── models.py # Pydantic models (MemberOrg, Contact, SanctionsResult, etc.)
├── connectors/
│ ├── base.py # Abstract base classes (BaseConnector, BaseCRMConnector, etc.)
│ ├── registry.py # Connector registry (singleton init, env-var toggled PIS/mock)
│ ├── pis_client.py # Shared PIS HTTP client (X-ACL auth, retry, base URL)
│ ├── pis_groupsio.py # PIS Groups.io connector (mailing list CRUD via PIS V2)
│ ├── pis_meeting.py # PIS Meeting connector (LFX Meeting V2 / zoomV2 API)
│ ├── pis_github.py # PIS GitHub connector (org/repo tracking via PIS V2)
│ ├── salesforce.py # Salesforce REST API v59 (auto-falls back to mock)
│ ├── groupsio.py # Groups.io API v1 (legacy — auto-falls back to mock)
│ ├── calendar.py # Google Calendar API v3 (legacy — replaced by PIS Meeting)
│ ├── discord.py # Discord Bot API v10 (mock)
│ ├── github_connector.py # GitHub REST API v3 (mock)
│ ├── lfx_platform.py # LFX Platform / OpenProfile API (mock)
│ └── hubspot.py # HubSpot Marketing API (mock)
├── tools/
│ ├── tier_validation.py # 3 tools: validate, entitlements, anomalies
│ ├── compliance.py # 4 tools: sanctions, tax-exempt, report, flag
│ ├── mailing_list.py # 4 tools: provision, remove, check, remediate
│ ├── orchestrator.py # 5 tools: onboard, status, reconcile, offboard, health
│ ├── contact_roles.py # 5 tools: list, add, update, remove, transfer
│ ├── calendar.py # 3 tools: provision invites, update schedule, upcoming
│ ├── wg_enrollment.py # 5 tools: enroll, leave, list, members, eligibility
│ ├── call_scheduling.py # 3 tools: schedule, reschedule, status
│ ├── elections.py # 5 tools: create, candidate, voter, status, diagnose
│ ├── press_release.py # 3 tools: draft, status, templates
│ ├── logo_brand.py # 3 tools: validate, guidelines, upload
│ └── renewal_intelligence.py # 5 tools: renewal, engagement, churn, dashboard, outreach
└── resources/
├── member.py # member:// resources (profiles, list)
├── checklist.py # checklist:// resources (D1-D5 templates)
└── rules.py # rules:// resources (entitlements, provisioning, WGs)
Mock Members (for testing)
| Org | Tier | Contact(s) |
|---|---|---|
| Hitachi, Ltd. | Gold | Takeshi Yamada, Yuki Tanaka |
| Bloomberg LP | Gold | Sambhav Kothari, Ania Musial |
| Natoma | Silver | Paresh Bhaya |
| iProov | Silver | Andrew Bud |
| OpenAI | Platinum | Sam Altman |
License
Apache 2.0
Installing Aaif
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/linuxfoundation/aaif-mcp-serverFAQ
Is Aaif MCP free?
Yes, Aaif MCP is free — one-click install via Unyly at no cost.
Does Aaif need an API key?
No, Aaif runs without API keys or environment variables.
Is Aaif hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Aaif in Claude Desktop, Claude Code or Cursor?
Open Aaif on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
by duxiaohuiSupabase
Database, auth and storage
by SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Aaif with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
