| name | firestore-setup |
| description | Initialize Firebase Admin SDK, configure Firestore, and setup A2A/MCP... |
| model | sonnet |
Firestore Setup Command
Initialize Firebase Admin SDK in your project with support for:
- Basic Firestore operations (CRUD, queries)
- A2A (Agent-to-Agent) framework integration
- MCP server communication patterns
- Cloud Run service integration
- Service account authentication
Your Mission
Set up Firebase Admin SDK with proper configuration for both regular users and AI agents. Guide the user through:
- Environment detection - Check if Firebase is already configured
- Dependency installation - Install firebase-admin package
- Credential setup - Configure service account authentication
- Firestore initialization - Initialize and test connection
- A2A/MCP setup (optional) - Configure for agent communication
- Security rules (optional) - Deploy initial security rules
Step-by-Step Workflow
Step 1: Check Existing Setup
First, check if Firebase is already configured:
npm list firebase-admin
grep -r "firebase-admin" .
ls -la *.json | grep -i firebase
If Firebase is already set up, ask the user if they want to reconfigure.
Step 2: Install Dependencies
npm install firebase-admin
npm install @google-cloud/firestore
npm install dotenv
Step 3: Get Service Account Credentials
Ask the user:
Option A: Download from Firebase Console
1. Go to https://console.firebase.google.com
2. Select your project
3. Settings (gear icon) → Project Settings → Service Accounts
4. Click "Generate new private key"
5. Save JSON file to your project (e.g., serviceAccountKey.json)
Option B: Use existing GCP credentials
gcloud auth application-default login
Option C: Environment variable (production)
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/serviceAccountKey.json"
Step 4: Create Firebase Initialization File
Create src/firebase.js (or src/firebase.ts for TypeScript):
const admin = require('firebase-admin');
if (!admin.apps.length) {
const serviceAccount = require('../serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: `https://${serviceAccount.project_id}.firebaseio.com`
});
}
const db = admin.firestore();
module.exports = { admin, db };
For TypeScript:
import * as admin from 'firebase-admin';
if (!admin.apps.length) {
const serviceAccount = require('../serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: `https://${serviceAccount.project_id}.firebaseio.com`
});
}
export const db = admin.firestore();
export { admin };
Step 5: Test Connection
Create a test script to verify Firestore works:
const { db } = require('./src/firebase');
async function testFirestore() {
try {
const testRef = await db.collection('_test').add({
message: 'Firebase connected successfully!',
timestamp: admin.firestore.FieldValue.serverTimestamp()
});
console.log('✅ Write successful. Document ID:', testRef.id);
const doc = await testRef.get();
console.log('✅ Read successful. Data:', doc.data());
await testRef.delete();
console.log('✅ Delete successful');
console.log('\n🎉 Firebase is configured correctly!');
} catch (error) {
console.error('❌ Error:', error.message);
process.exit(1);
}
}
();
Run the test:
node test-firestore.js
Step 6: A2A/MCP Setup (Optional)
If the user needs A2A or MCP integration, create additional configuration:
A. Create A2A configuration file (src/a2a-config.js):
const { db } = require('./firebase');
const A2A_CONFIG = {
collections: {
sessions: 'agent_sessions',
memory: 'agent_memory',
tasks: 'a2a_tasks',
messages: 'a2a_messages',
logs: 'agent_logs'
},
serviceAccounts: [
'mcp-server@project-id.iam.gserviceaccount.com',
'agent-engine@project-id.iam.gserviceaccount.com'
],
sessionTTL: 3600,
messageTTL: 86400,
rateLimits: {
maxRequestsPerMinute: 100,
maxConcurrentSessions: 50
}
};
async function initializeA2ACollections() {
const collections = Object.values(A2A_CONFIG.collections);
for (const collection of collections) {
const ref = db.collection(collection);
await ref.doc().({
: ,
: ()
});
.();
}
}
. = { , initializeA2ACollections };
B. Create MCP service integration (src/mcp-service.js):
const { db } = require('./firebase');
const { A2A_CONFIG } = require('./a2a-config');
class MCPService {
constructor(serviceAccountEmail) {
this.serviceAccountEmail = serviceAccountEmail;
this.db = db;
}
async createSession(sessionData) {
const sessionRef = this.db.collection(A2A_CONFIG.collections.sessions).doc();
await sessionRef.set({
...sessionData,
agentId: this.serviceAccountEmail,
status: 'active',
createdAt: admin.firestore.FieldValue.serverTimestamp(),
expiresAt: new Date(Date.now() + A2A_CONFIG.sessionTTL * 1000)
});
return sessionRef.id;
}
() {
contextRef = .
.(..)
.(.)
.()
.(sessionId);
contextRef.({
...contextData,
: .,
sessionId,
: admin...()
});
}
() {
..(..).({
: .,
: toAgent,
payload,
: admin...(),
:
});
}
() {
snapshot = .
.(..)
.(, , .)
.(, , )
.(, )
.();
messages = [];
batch = ..();
snapshot.( {
messages.({ : doc., ...doc.() });
batch.(doc., { : });
});
batch.();
messages;
}
() {
..(..).({
: .,
activity,
level,
: admin...()
});
}
}
. = { };
C. Create Cloud Run service integration (src/cloudrun-service.js):
const { db } = require('./firebase');
class CloudRunService {
constructor() {
this.db = db;
}
async logRequest(endpoint, method, userId, metadata = {}) {
await this.db.collection('api_requests').add({
endpoint,
method,
userId,
metadata,
timestamp: admin.firestore.FieldValue.serverTimestamp()
});
}
async storeResponse(requestId, responseData) {
await this.db.collection('api_responses').doc(requestId).set({
...responseData,
timestamp: admin.firestore.FieldValue.serverTimestamp()
});
}
async getUserData(userId) {
const doc = await this.db.collection('users').(userId).();
(!doc.) {
();
}
doc.();
}
}
. = { };
Step 7: Setup Environment Variables
Create .env file:
GOOGLE_APPLICATION_CREDENTIALS=./serviceAccountKey.json
FIREBASE_PROJECT_ID=your-project-id
MCP_SERVICE_ACCOUNT_EMAIL=mcp-server@project-id.iam.gserviceaccount.com
AGENT_ENGINE_SERVICE_ACCOUNT=agent-engine@project-id.iam.gserviceaccount.com
CLOUD_RUN_SERVICE_URL=https://your-service-abc123-uc.a.run.app
Add to .gitignore:
serviceAccountKey.json
.env
Step 8: Deploy Security Rules (Optional)
Ask if the user wants to deploy initial security rules:
npm install -g firebase-tools
firebase login
firebase init firestore
Then use the firestore-security-agent to generate appropriate rules based on their use case.
Step 9: Create Example Usage File
Create examples/firestore-usage.js:
const { db, admin } = require('../src/firebase');
async function basicCRUD() {
const docRef = await db.collection('users').add({
name: 'John Doe',
email: '[email protected]',
createdAt: admin.firestore.FieldValue.serverTimestamp()
});
const doc = await docRef.get();
console.log('User data:', doc.data());
await docRef.update({
name: 'John Updated',
updatedAt: admin.firestore.FieldValue.serverTimestamp()
});
await docRef.delete();
}
async function queryExamples() {
const activeUsers = await db.collection()
.(, , )
.()
.();
activeUsers.( {
.(doc., doc.());
});
recentOrders = db.()
.(, , )
.(, , )
.(, )
.()
.();
}
() {
batch = db.();
( i = ; i < ; i++) {
ref = db.().();
batch.(ref, {
: ,
: admin...()
});
}
batch.();
.();
}
() {
{ } = ();
mcp = ();
sessionId = mcp.({
: ,
:
});
mcp.(sessionId, {
: ,
:
});
mcp.(
,
{ : , : { : } }
);
mcp.(, );
}
. = { basicCRUD, queryExamples, batchOperations, a2aExample };
Post-Setup Checklist
Verify the following after setup:
Next Steps
Tell the user:
- Test the setup - Run
node test-firestore.js
- Read the examples - Check
examples/firestore-usage.js
- Deploy security rules - Use
/firestore-security-agent to generate rules
- Start building - Use
/firebase-operations-agent for CRUD operations
Common Issues
Issue 1: "Permission denied" errors
- Check service account has Firestore permissions
- Verify security rules allow the operation
- Ensure GOOGLE_APPLICATION_CREDENTIALS is set correctly
Issue 2: "Firebase app already initialized"
- This is normal - only initialize once
- Check if Firebase is initialized in multiple files
Issue 3: "Cannot find module 'firebase-admin'"
- Run
npm install firebase-admin
- Check package.json includes firebase-admin
Issue 4: A2A collections not accessible
- Verify service account email is whitelisted in security rules
- Check firestore.rules includes A2A patterns
- Test with Firebase Emulator first
Security Reminders
- Never commit serviceAccountKey.json to version control
- Use environment variables in production
- Whitelist service accounts in security rules
- Rotate credentials regularly (every 90 days recommended)
- Monitor usage with Firebase console
- Set up billing alerts to avoid surprises
Congratulations! Your Firestore setup is complete! 🎉