337 lines
7.7 KiB
Markdown
337 lines
7.7 KiB
Markdown
# 🔑 MCP API Keys for ChatGPT Integration
|
|
|
|
## ✅ Non-Expiring API Keys - Complete!
|
|
|
|
I've built a complete system for **non-expiring API keys** that users can generate directly in the Vibn UI to connect ChatGPT.
|
|
|
|
---
|
|
|
|
## 🎯 How It Works
|
|
|
|
### **1. User Visits Connections Page**
|
|
**URL:** `https://vibnai.com/your-workspace/connections`
|
|
|
|
### **2. Generate API Key**
|
|
- Click **"Generate MCP API Key"** button
|
|
- System creates a unique, long-lived key: `vibn_mcp_abc123...`
|
|
- Key is stored in Firestore (`mcpKeys` collection)
|
|
- **Key never expires** until explicitly revoked
|
|
|
|
### **3. Copy Settings to ChatGPT**
|
|
- Click **"Copy All Settings"** button
|
|
- Paste into ChatGPT's "New Connector" form
|
|
- Done! ChatGPT can now access Vibn data
|
|
|
|
---
|
|
|
|
## 🏗️ What I Built
|
|
|
|
### **1. API Key Generation Endpoint**
|
|
**File:** `app/api/mcp/generate-key/route.ts`
|
|
|
|
```typescript
|
|
POST /api/mcp/generate-key
|
|
- Generates: vibn_mcp_{64-character-hex}
|
|
- Stores in Firestore with userId
|
|
- Returns existing key if one already exists
|
|
```
|
|
|
|
```typescript
|
|
DELETE /api/mcp/generate-key
|
|
- Revokes user's MCP API key
|
|
- Removes from Firestore
|
|
- Forces ChatGPT to disconnect
|
|
```
|
|
|
|
### **2. Updated MCP API to Accept API Keys**
|
|
**File:** `app/api/mcp/route.ts`
|
|
|
|
The MCP endpoint now accepts **two types** of authentication:
|
|
|
|
**Option A: MCP API Key** (for ChatGPT)
|
|
```bash
|
|
Authorization: Bearer vibn_mcp_abc123...
|
|
```
|
|
|
|
**Option B: Firebase ID Token** (for direct user access)
|
|
```bash
|
|
Authorization: Bearer eyJhbGciOiJSUzI1Ni...
|
|
```
|
|
|
|
### **3. UI Component for Key Management**
|
|
**File:** `components/mcp-connection-card.tsx`
|
|
|
|
Features:
|
|
- ✅ Generate API key button
|
|
- ✅ Show/hide key toggle
|
|
- ✅ Copy individual settings
|
|
- ✅ **Copy all settings** button (one-click setup!)
|
|
- ✅ Setup instructions
|
|
- ✅ Revoke key with confirmation dialog
|
|
|
|
### **4. Integrated into Connections Page**
|
|
**File:** `app/[workspace]/connections/page.tsx`
|
|
|
|
The MCP connection card is now live on the Connections page, replacing the old placeholder.
|
|
|
|
### **5. Firestore Security Rules**
|
|
**File:** `firestore.rules`
|
|
|
|
```javascript
|
|
match /mcpKeys/{keyId} {
|
|
// Only server can manage keys via Admin SDK
|
|
// Users can't directly access or modify
|
|
allow read, write: if false;
|
|
}
|
|
```
|
|
|
|
**Deployed:** ✅ Rules are live in production
|
|
|
|
---
|
|
|
|
## 📋 User Flow (Step-by-Step)
|
|
|
|
### **From Vibn:**
|
|
|
|
1. User goes to: `/your-workspace/connections`
|
|
2. Scrolls to "ChatGPT Integration (MCP)" card
|
|
3. Clicks: **"Generate MCP API Key"**
|
|
4. Waits 1-2 seconds
|
|
5. Sees:
|
|
- MCP Server URL: `https://vibnai.com/api/mcp`
|
|
- API Key: `vibn_mcp_...` (hidden by default)
|
|
6. Clicks: **"Copy All Settings"**
|
|
7. Toast: "All settings copied! Paste into ChatGPT"
|
|
|
|
### **To ChatGPT:**
|
|
|
|
1. User opens ChatGPT
|
|
2. Goes to: **Settings → Personalization → Custom Tools**
|
|
3. Clicks: **"Add New Connector"**
|
|
4. Pastes settings from clipboard:
|
|
```
|
|
Name: Vibn
|
|
Description: Access your Vibn coding projects...
|
|
MCP Server URL: https://vibnai.com/api/mcp
|
|
Authentication: Bearer
|
|
API Key: vibn_mcp_abc123...
|
|
```
|
|
5. Checks: **"I understand and want to continue"**
|
|
6. Clicks: **"Create"**
|
|
7. Done! ✅
|
|
|
|
### **Test It:**
|
|
|
|
User asks ChatGPT:
|
|
- "Show me my Vibn projects"
|
|
- "What are my recent coding sessions?"
|
|
- "How much have I spent on AI?"
|
|
|
|
ChatGPT uses the MCP API key to fetch data and respond!
|
|
|
|
---
|
|
|
|
## 🔐 Security Features
|
|
|
|
### **API Key Format:**
|
|
```
|
|
vibn_mcp_{64-character-hex-string}
|
|
```
|
|
|
|
**Example:** `vibn_mcp_a1b2c3d4e5f6...` (72 chars total)
|
|
|
|
### **Storage:**
|
|
```javascript
|
|
// Firestore: mcpKeys collection
|
|
{
|
|
userId: "firebase-user-id",
|
|
key: "vibn_mcp_abc123...",
|
|
type: "mcp",
|
|
createdAt: "2024-11-14T...",
|
|
lastUsed: "2024-11-14T..." // Updated on each use
|
|
}
|
|
```
|
|
|
|
### **Authentication Flow:**
|
|
|
|
```
|
|
ChatGPT Request
|
|
↓
|
|
POST /api/mcp
|
|
Authorization: Bearer vibn_mcp_abc123...
|
|
↓
|
|
Check if token starts with "vibn_mcp_"
|
|
↓
|
|
Query Firestore: mcpKeys.where('key', '==', token)
|
|
↓
|
|
Extract userId from key doc
|
|
↓
|
|
Update lastUsed timestamp
|
|
↓
|
|
Process MCP request with userId context
|
|
↓
|
|
Return data to ChatGPT
|
|
```
|
|
|
|
### **Security Rules:**
|
|
- ✅ Users can't directly read their key from Firestore
|
|
- ✅ Keys are only accessible via Admin SDK (server-side)
|
|
- ✅ Keys are scoped to a single user
|
|
- ✅ All MCP queries filter by userId
|
|
- ✅ Keys can be revoked instantly
|
|
|
|
---
|
|
|
|
## 🆚 Comparison: Old vs New
|
|
|
|
### **Old Way (Manual):**
|
|
❌ User needs to run console commands
|
|
❌ Firebase ID token expires every 1 hour
|
|
❌ User must regenerate token constantly
|
|
❌ Poor user experience
|
|
|
|
### **New Way (API Keys):**
|
|
✅ User clicks a button
|
|
✅ Key never expires
|
|
✅ One-time setup
|
|
✅ Can be revoked anytime
|
|
✅ Great user experience
|
|
|
|
---
|
|
|
|
## 📊 Database Schema
|
|
|
|
### **mcpKeys Collection:**
|
|
```typescript
|
|
{
|
|
userId: string; // Firebase user ID
|
|
key: string; // vibn_mcp_{hex}
|
|
type: string; // "mcp"
|
|
createdAt: string; // ISO timestamp
|
|
lastUsed: string | null; // ISO timestamp or null
|
|
}
|
|
```
|
|
|
|
### **Indexes:**
|
|
```javascript
|
|
// Compound index on 'key' (for fast lookup during auth)
|
|
mcpKeys: {
|
|
key: "ascending"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Testing
|
|
|
|
### **1. Generate Key:**
|
|
```bash
|
|
# From browser console (when logged in):
|
|
const token = await firebase.auth().currentUser.getIdToken();
|
|
const response = await fetch('/api/mcp/generate-key', {
|
|
method: 'POST',
|
|
headers: { 'Authorization': `Bearer ${token}` }
|
|
});
|
|
const data = await response.json();
|
|
console.log(data.apiKey);
|
|
```
|
|
|
|
### **2. Test API with Key:**
|
|
```bash
|
|
curl -X POST https://vibnai.com/api/mcp \
|
|
-H "Authorization: Bearer vibn_mcp_YOUR_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"action": "list_resources"}'
|
|
```
|
|
|
|
### **3. Revoke Key:**
|
|
```bash
|
|
const token = await firebase.auth().currentUser.getIdToken();
|
|
await fetch('/api/mcp/generate-key', {
|
|
method: 'DELETE',
|
|
headers: { 'Authorization': `Bearer ${token}` }
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Benefits
|
|
|
|
### **For Users:**
|
|
- ✅ No technical knowledge required
|
|
- ✅ One-click copy/paste setup
|
|
- ✅ Keys never expire (set and forget)
|
|
- ✅ Clear revocation if needed
|
|
- ✅ Visual feedback (show/hide key)
|
|
|
|
### **For ChatGPT:**
|
|
- ✅ Stable, long-lived authentication
|
|
- ✅ Fast key validation (Firestore lookup)
|
|
- ✅ Automatic last-used tracking
|
|
- ✅ User-scoped data access
|
|
|
|
### **For Vibn:**
|
|
- ✅ No Firebase ID token management
|
|
- ✅ Simple key rotation if needed
|
|
- ✅ Usage analytics (lastUsed field)
|
|
- ✅ Better security posture
|
|
|
|
---
|
|
|
|
## 📝 Files Modified/Created
|
|
|
|
### **New Files:**
|
|
```
|
|
app/api/mcp/generate-key/route.ts ← Key generation/revocation API
|
|
components/mcp-connection-card.tsx ← UI component for key management
|
|
MCP_API_KEYS_GUIDE.md ← This file
|
|
```
|
|
|
|
### **Modified Files:**
|
|
```
|
|
app/api/mcp/route.ts ← Now accepts MCP API keys
|
|
app/[workspace]/connections/page.tsx ← Integrated MCP card
|
|
firestore.rules ← Added mcpKeys rules
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 What's Live
|
|
|
|
✅ **API Key Generation:** `/api/mcp/generate-key`
|
|
✅ **API Key Authentication:** `/api/mcp`
|
|
✅ **UI for Key Management:** `/your-workspace/connections`
|
|
✅ **Firestore Rules:** Deployed to production
|
|
✅ **Security:** Keys are server-side only
|
|
|
|
---
|
|
|
|
## 🎉 Result
|
|
|
|
**Users can now:**
|
|
1. Generate a non-expiring API key in 1 click
|
|
2. Copy all settings in 1 click
|
|
3. Paste into ChatGPT's connector form
|
|
4. Connect ChatGPT to their Vibn data
|
|
5. Never worry about token expiration
|
|
|
|
**No console commands. No manual token refresh. Just works!** ✨
|
|
|
|
---
|
|
|
|
## 🔮 Future Enhancements
|
|
|
|
Potential additions:
|
|
- [ ] Multiple MCP keys per user (for different AI assistants)
|
|
- [ ] Key usage analytics dashboard
|
|
- [ ] Automatic key rotation (optional)
|
|
- [ ] Scoped keys (read-only vs full access)
|
|
- [ ] Key expiration dates (optional)
|
|
|
|
---
|
|
|
|
**Built and ready to use!** 🚀
|
|
|
|
Visit: `https://vibnai.com/your-workspace/connections` to try it now!
|
|
|