[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FAJ23SYR7YN8BT2Y39M2WS":3,"skill-same:01M6FAJ23SYR7YN8BT2Y39M2WS":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6FAJ23SYR7YN8BT2Y39M2WS","firestore-operations-manager",null,"Manages Firebase\u002FFirestore operations including CRUD, queries, batch processing, A2A agent communication, MCP server integration, and Cloud Run service coordination.\nActivates when you request \"firestore operations\", \"create firestore document\", \"query firestore\", \"A2A agent communication\", \"MCP server setup\", \"agent-to-agent messaging\", or \"Cloud Run firestore integration\".\nHandles both basic database operations for regular users and advanced A2A framework patterns for AI agents.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Ffirestore-manager\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"firestore operations manager","firestore","operations","coordination","you","advanced","processing","database operations","query","agent-to-agent","MCP","crud","Bash","server","messaging","batch","database","create","mcp server","ai agents","2026-11-10 10:12:30",false,"---\nname: firestore-operations-manager\ndescription: |\n  Manages Firebase\u002FFirestore operations including CRUD, queries, batch processing, A2A agent communication, MCP server integration, and Cloud Run service coordination.\n  Activates when you request \"firestore operations\", \"create firestore document\", \"query firestore\", \"A2A agent communication\", \"MCP server setup\", \"agent-to-agent messaging\", or \"Cloud Run firestore integration\".\n  Handles both basic database operations for regular users and advanced A2A framework patterns for AI agents.\nallowed-tools: Read, Write, Edit, Grep, Glob, Bash\nversion: 1.0.0\n---\n\n# Firestore Operations Manager\n\n## Overview\n\nThis skill manages Firebase\u002FFirestore operations for both regular web\u002Fmobile applications and AI agent-to-agent (A2A) frameworks. It handles:\n\n- **Basic Operations**: CRUD, queries, batch processing for standard applications\n- **A2A Framework**: Agent-to-agent communication patterns using Firestore as state store\n- **MCP Integration**: Model Context Protocol server communication via Firestore\n- **Cloud Run Services**: Integration patterns for Cloud Run services accessing Firestore\n- **Security**: Proper authentication, validation, and security rules for both humans and agents\n\n## Core Capabilities\n\n### For Everyone (Basic Firestore)\n- Create, read, update, delete documents\n- Complex queries with filters and ordering\n- Batch operations for efficiency\n- Collection management and organization\n- Security rules generation and validation\n- Data migrations and transformations\n\n### For AI Power Users (A2A\u002FMCP)\n- Agent session management with Firestore state\n- Agent-to-agent messaging and task coordination\n- MCP server communication patterns\n- Agent memory and context storage\n- Cloud Run service integration\n- Multi-agent workflow orchestration\n\n## When to Use This Skill\n\nThis skill activates when users mention:\n\n- **Basic operations**: \"create a firestore document\", \"query users collection\", \"batch update documents\"\n- **A2A patterns**: \"setup agent communication\", \"A2A task queue\", \"agent-to-agent messaging\"\n- **MCP integration**: \"MCP server firestore\", \"agent memory storage\", \"session management\"\n- **Cloud Run**: \"Cloud Run firestore integration\", \"service account access\"\n- **Security**: \"firestore security rules\", \"agent authentication\", \"service account permissions\"\n\n## Workflow\n\n### Phase 1: Setup and Initialization\n\n**For basic users:**\n1. Check if Firebase Admin SDK is installed\n2. Guide through credential setup (service account JSON)\n3. Initialize Firestore connection\n4. Run connection test\n5. Create basic usage examples\n\n**For A2A\u002FMCP users:**\n1. Perform basic setup (above)\n2. Install additional dependencies (@google-cloud\u002Ffirestore)\n3. Create A2A collection structure (sessions, memory, tasks, messages, logs)\n4. Configure service account whitelisting\n5. Setup security rules for agent access\n6. Create MCP service wrapper classes\n\nExample setup:\n```bash\n# Basic setup\nnpm install firebase-admin\n\n# A2A\u002FMCP setup\nnpm install firebase-admin @google-cloud\u002Ffirestore dotenv\n\n# Set credentials\nexport GOOGLE_APPLICATION_CREDENTIALS=\".\u002FserviceAccountKey.json\"\n\n# Run setup command\n\u002Ffirestore-setup\n```\n\n### Phase 2: Basic CRUD Operations\n\nFor standard database operations:\n\n**Create documents:**\n```javascript\nconst { db, admin } = require('.\u002Fsrc\u002Ffirebase');\n\n\u002F\u002F Single document\nawait db.collection('users').add({\n  name: 'John Doe',\n  email: '[email protected]',\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F With custom ID\nawait db.collection('users').doc('user123').set({\n  name: 'Jane Doe',\n  email: '[email protected]'\n});\n```\n\n**Read documents:**\n```javascript\n\u002F\u002F Single document\nconst doc = await db.collection('users').doc('user123').get();\nconst userData = doc.data();\n\n\u002F\u002F Query\nconst snapshot = await db.collection('users')\n  .where('status', '==', 'active')\n  .orderBy('createdAt', 'desc')\n  .limit(10)\n  .get();\n\nsnapshot.forEach(doc => console.log(doc.data()));\n```\n\n**Update documents:**\n```javascript\n\u002F\u002F Partial update\nawait db.collection('users').doc('user123').update({\n  status: 'active',\n  updatedAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Increment counter\nawait db.collection('stats').doc('views').update({\n  count: admin.firestore.FieldValue.increment(1)\n});\n```\n\n**Delete documents:**\n```javascript\n\u002F\u002F Single delete\nawait db.collection('users').doc('user123').delete();\n\n\u002F\u002F Batch delete\nconst batch = db.batch();\nconst docs = await db.collection('temp').limit(500).get();\ndocs.forEach(doc => batch.delete(doc.ref));\nawait batch.commit();\n```\n\n### Phase 3: A2A Framework Operations\n\nFor agent-to-agent communication patterns:\n\n**1. Create Agent Session:**\n```javascript\nconst { MCPService } = require('.\u002Fsrc\u002Fmcp-service');\nconst mcp = new MCPService('mcp-server@project.iam.gserviceaccount.com');\n\n\u002F\u002F Create session for agent workflow\nconst sessionId = await mcp.createSession({\n  task: 'process_user_data',\n  priority: 'high',\n  metadata: { userId: 'user123' }\n});\n\nconsole.log(`Session created: ${sessionId}`);\n```\n\n**2. Store Agent Context:**\n```javascript\n\u002F\u002F Store agent memory\u002Fcontext in Firestore\nawait mcp.storeContext(sessionId, {\n  conversation: [...messages],\n  userPreferences: { theme: 'dark' },\n  currentStep: 'data_validation'\n});\n\n\u002F\u002F Retrieve context later\nconst context = await db\n  .collection('agent_memory')\n  .doc('mcp-server@project.iam.gserviceaccount.com')\n  .collection('contexts')\n  .doc(sessionId)\n  .get();\n```\n\n**3. Agent-to-Agent Messaging:**\n```javascript\n\u002F\u002F Send message from one agent to another\nawait mcp.sendMessage(\n  'agent-engine@project.iam.gserviceaccount.com',\n  {\n    action: 'analyze_data',\n    data: { userId: 'user123', fields: ['name', 'email'] }\n  }\n);\n\n\u002F\u002F Receive messages (in receiving agent)\nconst messages = await mcp.receiveMessages();\nmessages.forEach(msg => {\n  console.log(`From: ${msg.from}, Payload:`, msg.payload);\n});\n```\n\n**4. Task Queue Management:**\n```javascript\n\u002F\u002F Create task for another agent\nawait db.collection('a2a_tasks').add({\n  taskType: 'data_processing',\n  assignedTo: 'worker-agent@project.iam.gserviceaccount.com',\n  status: 'pending',\n  priority: 1,\n  payload: { userId: 'user123' },\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Agent claims and processes task\nconst taskQuery = await db.collection('a2a_tasks')\n  .where('assignedTo', '==', 'worker-agent@project.iam.gserviceaccount.com')\n  .where('status', '==', 'pending')\n  .orderBy('priority', 'asc')\n  .limit(1)\n  .get();\n\nif (!taskQuery.empty) {\n  const task = taskQuery.docs[0];\n  await task.ref.update({ status: 'in_progress' });\n  \u002F\u002F Process task...\n  await task.ref.update({ status: 'completed' });\n}\n```\n\n**5. Agent Activity Logging:**\n```javascript\n\u002F\u002F Log agent activities for audit trail\nawait mcp.logActivity({\n  action: 'processed_data',\n  userId: 'user123',\n  duration: 1500, \u002F\u002F ms\n  result: 'success'\n}, 'info');\n```\n\n### Phase 4: Cloud Run Integration\n\nFor Cloud Run services accessing Firestore:\n\n**Setup Cloud Run service class:**\n```javascript\nconst { CloudRunService } = require('.\u002Fsrc\u002Fcloudrun-service');\nconst cloudrun = new CloudRunService();\n\n\u002F\u002F In your Cloud Run endpoint\napp.post('\u002Fapi\u002Fusers\u002F:userId\u002Fdata', async (req, res) => {\n  const { userId } = req.params;\n\n  try {\n    \u002F\u002F Log request\n    await cloudrun.logRequest('\u002Fapi\u002Fusers\u002Fdata', 'POST', userId);\n\n    \u002F\u002F Get user data from Firestore\n    const userData = await cloudrun.getUserData(userId);\n\n    \u002F\u002F Store response\n    await cloudrun.storeResponse(req.id, {\n      userId,\n      data: userData,\n      status: 'success'\n    });\n\n    res.json({ success: true, data: userData });\n  } catch (error) {\n    await cloudrun.storeResponse(req.id, {\n      userId,\n      error: error.message,\n      status: 'error'\n    });\n\n    res.status(500).json({ error: error.message });\n  }\n});\n```\n\n### Phase 5: Security Rules Management\n\nGenerate and deploy security rules for both users and agents:\n\n**For basic users:**\n```javascript\nrules_version = '2';\nservice cloud.firestore {\n  match \u002Fdatabases\u002F{database}\u002Fdocuments {\n    match \u002Fusers\u002F{userId} {\n      allow read, write: if request.auth != null && request.auth.uid == userId;\n    }\n  }\n}\n```\n\n**For A2A\u002FMCP (service accounts):**\n```javascript\nrules_version = '2';\nservice cloud.firestore {\n  match \u002Fdatabases\u002F{database}\u002Fdocuments {\n    function isServiceAccount() {\n      return request.auth.token.email.matches('.*@.*\\\\.iam\\\\.gserviceaccount\\\\.com$');\n    }\n\n    function isAuthorizedAgent() {\n      return isServiceAccount() && request.auth.token.email in [\n        'mcp-server@project-id.iam.gserviceaccount.com',\n        'agent-engine@project-id.iam.gserviceaccount.com'\n      ];\n    }\n\n    \u002F\u002F Agent sessions\n    match \u002Fagent_sessions\u002F{sessionId} {\n      allow read, write: if isAuthorizedAgent();\n    }\n\n    \u002F\u002F Agent memory\n    match \u002Fagent_memory\u002F{agentId}\u002F{document=**} {\n      allow read, write: if isAuthorizedAgent();\n    }\n\n    \u002F\u002F A2A messages\n    match \u002Fa2a_messages\u002F{messageId} {\n      allow create: if isAuthorizedAgent();\n      allow read: if isAuthorizedAgent() &&\n                     (resource.data.from == request.auth.token.email ||\n                      resource.data.to == request.auth.token.email);\n    }\n  }\n}\n```\n\nDeploy rules:\n```bash\nfirebase deploy --only firestore:rules\n```\n\n## Advanced Patterns\n\n### Pattern 1: Multi-Agent Workflow Orchestration\n\n```javascript\n\u002F\u002F Coordinator agent creates workflow\nconst workflowId = await db.collection('workflows').add({\n  name: 'user_data_processing',\n  steps: [\n    { agent: 'validator@project.iam.gserviceaccount.com', status: 'pending' },\n    { agent: 'processor@project.iam.gserviceaccount.com', status: 'pending' },\n    { agent: 'notifier@project.iam.gserviceaccount.com', status: 'pending' }\n  ],\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Each agent listens for their step\nconst unsubscribe = db.collection('workflows')\n  .doc(workflowId)\n  .onSnapshot(async (doc) => {\n    const workflow = doc.data();\n    const myStep = workflow.steps.find(s => s.agent === myEmail && s.status === 'pending');\n\n    if (myStep) {\n      \u002F\u002F Process step\n      await processStep(myStep);\n\n      \u002F\u002F Mark complete and notify next agent\n      myStep.status = 'completed';\n      await doc.ref.update({ steps: workflow.steps });\n    }\n  });\n```\n\n### Pattern 2: Agent Context Sharing\n\n```javascript\n\u002F\u002F Agent 1 stores context\nawait db.collection('shared_context').doc('task_abc').set({\n  sharedBy: 'agent1@project.iam.gserviceaccount.com',\n  sharedWith: ['agent2@project.iam.gserviceaccount.com'],\n  context: {\n    userId: 'user123',\n    analysis: { sentiment: 'positive', score: 0.85 }\n  },\n  expiresAt: new Date(Date.now() + 3600000) \u002F\u002F 1 hour\n});\n\n\u002F\u002F Agent 2 retrieves context\nconst contextDoc = await db.collection('shared_context').doc('task_abc').get();\nif (contextDoc.exists && contextDoc.data().sharedWith.includes(myEmail)) {\n  const context = contextDoc.data().context;\n  \u002F\u002F Use context...\n}\n```\n\n### Pattern 3: Rate Limiting for Agents\n\n```javascript\n\u002F\u002F Check and enforce rate limits\nconst rateLimitRef = db.collection('rate_limits').doc(agentEmail);\nconst rateLimitDoc = await rateLimitRef.get();\n\nif (rateLimitDoc.exists) {\n  const { count, resetAt } = rateLimitDoc.data();\n\n  if (Date.now() \u003C resetAt && count >= 100) {\n    throw new Error('Rate limit exceeded');\n  }\n\n  if (Date.now() >= resetAt) {\n    \u002F\u002F Reset counter\n    await rateLimitRef.set({\n      count: 1,\n      resetAt: Date.now() + 60000 \u002F\u002F 1 minute\n    });\n  } else {\n    \u002F\u002F Increment counter\n    await rateLimitRef.update({\n      count: admin.firestore.FieldValue.increment(1)\n    });\n  }\n} else {\n  \u002F\u002F First request\n  await rateLimitRef.set({\n    count: 1,\n    resetAt: Date.now() + 60000\n  });\n}\n```\n\n## Performance Optimization\n\n### For Basic Users:\n1. **Use batch operations** - Write\u002Fupdate 500 docs at once\n2. **Create indexes** - Required for complex queries\n3. **Paginate results** - Use cursor-based pagination\n4. **Cache frequently read data** - Reduce read costs\n\n### For A2A\u002FMCP Users:\n1. **Connection pooling** - Reuse Firestore connections\n2. **Batch agent messages** - Combine multiple messages\n3. **TTL for agent data** - Clean up expired sessions automatically\n4. **Denormalize agent state** - Avoid cross-collection queries\n\n## Cost Optimization\n\nFirestore costs:\n- Document reads: $0.06 per 100k\n- Document writes: $0.18 per 100k\n- Document deletes: $0.02 per 100k\n\nReduce costs:\n- Use batch writes (1 operation vs 500)\n- Cache agent context locally\n- Archive old agent logs to Cloud Storage\n- Set up billing alerts\n\n## Security Best Practices\n\n1. **Never allow open access** - Always require authentication\n2. **Whitelist service accounts** - Don't allow all service accounts\n3. **Validate all inputs** - Check types, formats, required fields\n4. **Make logs immutable** - Prevent tampering with audit trails\n5. **Rotate credentials** - Change service account keys every 90 days\n6. **Monitor usage** - Set up Firebase console alerts\n7. **Test rules** - Use Firebase Emulator before deploying\n\n## Troubleshooting\n\n### Issue: Permission Denied\n- Check security rules allow the operation\n- Verify service account is whitelisted\n- Ensure GOOGLE_APPLICATION_CREDENTIALS is set\n\n### Issue: A2A Messages Not Delivered\n- Verify recipient agent email is correct\n- Check message status in Firestore console\n- Ensure security rules allow cross-agent messaging\n\n### Issue: Rate Limit Errors\n- Implement exponential backoff\n- Use batch operations\n- Increase rate limits in configuration\n\n### Issue: Cloud Run Connection Fails\n- Verify service account has Firestore permissions\n- Check VPC connectivity if using private IP\n- Ensure project ID matches in code and credentials\n\n## Examples\n\nSee `examples\u002Ffirestore-usage.js` for complete code examples covering:\n- Basic CRUD operations\n- Complex queries and pagination\n- Batch operations\n- A2A agent communication\n- MCP server integration\n- Cloud Run service patterns\n- Security rules testing\n\n## Resources\n\n- [Firestore Documentation](https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Ffirestore)\n- [A2A Protocol Specification](https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fvertex-ai-agents)\n- [MCP Documentation](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fmcp)\n- [Cloud Run Integration](https:\u002F\u002Fcloud.google.com\u002Frun\u002Fdocs\u002Ftutorials)\n\n## Summary\n\nThis skill provides comprehensive Firestore operations for:\n- **Everyone**: Standard database CRUD, queries, batch ops, security\n- **AI Power Users**: A2A communication, MCP integration, Cloud Run services, multi-agent workflows\n\nUse `\u002Ffirestore-setup` to initialize, then leverage the agents and commands for specific operations!\n\n","# Firestore Operations Manager\n\n## Overview\n\nThis skill manages Firebase\u002FFirestore operations for both regular web\u002Fmobile applications and AI agent-to-agent (A2A) frameworks. It handles:\n\n- **Basic Operations**: CRUD, queries, batch processing for standard applications\n- **A2A Framework**: Agent-to-agent communication patterns using Firestore as state store\n- **MCP Integration**: Model Context Protocol server communication via Firestore\n- **Cloud Run Services**: Integration patterns for Cloud Run services accessing Firestore\n- **Security**: Proper authentication, validation, and security rules for both humans and agents\n\n## Core Capabilities\n\n### For Everyone (Basic Firestore)\n- Create, read, update, delete documents\n- Complex queries with filters and ordering\n- Batch operations for efficiency\n- Collection management and organization\n- Security rules generation and validation\n- Data migrations and transformations\n\n### For AI Power Users (A2A\u002FMCP)\n- Agent session management with Firestore state\n- Agent-to-agent messaging and task coordination\n- MCP server communication patterns\n- Agent memory and context storage\n- Cloud Run service integration\n- Multi-agent workflow orchestration\n\n## When to Use This Skill\n\nThis skill activates when users mention:\n\n- **Basic operations**: \"create a firestore document\", \"query users collection\", \"batch update documents\"\n- **A2A patterns**: \"setup agent communication\", \"A2A task queue\", \"agent-to-agent messaging\"\n- **MCP integration**: \"MCP server firestore\", \"agent memory storage\", \"session management\"\n- **Cloud Run**: \"Cloud Run firestore integration\", \"service account access\"\n- **Security**: \"firestore security rules\", \"agent authentication\", \"service account permissions\"\n\n## Workflow\n\n### Phase 1: Setup and Initialization\n\n**For basic users:**\n1. Check if Firebase Admin SDK is installed\n2. Guide through credential setup (service account JSON)\n3. Initialize Firestore connection\n4. Run connection test\n5. Create basic usage examples\n\n**For A2A\u002FMCP users:**\n1. Perform basic setup (above)\n2. Install additional dependencies (@google-cloud\u002Ffirestore)\n3. Create A2A collection structure (sessions, memory, tasks, messages, logs)\n4. Configure service account whitelisting\n5. Setup security rules for agent access\n6. Create MCP service wrapper classes\n\nExample setup:\n```bash\n# Basic setup\nnpm install firebase-admin\n\n# A2A\u002FMCP setup\nnpm install firebase-admin @google-cloud\u002Ffirestore dotenv\n\n# Set credentials\nexport GOOGLE_APPLICATION_CREDENTIALS=\".\u002FserviceAccountKey.json\"\n\n# Run setup command\n\u002Ffirestore-setup\n```\n\n### Phase 2: Basic CRUD Operations\n\nFor standard database operations:\n\n**Create documents:**\n```javascript\nconst { db, admin } = require('.\u002Fsrc\u002Ffirebase');\n\n\u002F\u002F Single document\nawait db.collection('users').add({\n  name: 'John Doe',\n  email: '[email protected]',\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F With custom ID\nawait db.collection('users').doc('user123').set({\n  name: 'Jane Doe',\n  email: '[email protected]'\n});\n```\n\n**Read documents:**\n```javascript\n\u002F\u002F Single document\nconst doc = await db.collection('users').doc('user123').get();\nconst userData = doc.data();\n\n\u002F\u002F Query\nconst snapshot = await db.collection('users')\n  .where('status', '==', 'active')\n  .orderBy('createdAt', 'desc')\n  .limit(10)\n  .get();\n\nsnapshot.forEach(doc => console.log(doc.data()));\n```\n\n**Update documents:**\n```javascript\n\u002F\u002F Partial update\nawait db.collection('users').doc('user123').update({\n  status: 'active',\n  updatedAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Increment counter\nawait db.collection('stats').doc('views').update({\n  count: admin.firestore.FieldValue.increment(1)\n});\n```\n\n**Delete documents:**\n```javascript\n\u002F\u002F Single delete\nawait db.collection('users').doc('user123').delete();\n\n\u002F\u002F Batch delete\nconst batch = db.batch();\nconst docs = await db.collection('temp').limit(500).get();\ndocs.forEach(doc => batch.delete(doc.ref));\nawait batch.commit();\n```\n\n### Phase 3: A2A Framework Operations\n\nFor agent-to-agent communication patterns:\n\n**1. Create Agent Session:**\n```javascript\nconst { MCPService } = require('.\u002Fsrc\u002Fmcp-service');\nconst mcp = new MCPService('mcp-server@project.iam.gserviceaccount.com');\n\n\u002F\u002F Create session for agent workflow\nconst sessionId = await mcp.createSession({\n  task: 'process_user_data',\n  priority: 'high',\n  metadata: { userId: 'user123' }\n});\n\nconsole.log(`Session created: ${sessionId}`);\n```\n\n**2. Store Agent Context:**\n```javascript\n\u002F\u002F Store agent memory\u002Fcontext in Firestore\nawait mcp.storeContext(sessionId, {\n  conversation: [...messages],\n  userPreferences: { theme: 'dark' },\n  currentStep: 'data_validation'\n});\n\n\u002F\u002F Retrieve context later\nconst context = await db\n  .collection('agent_memory')\n  .doc('mcp-server@project.iam.gserviceaccount.com')\n  .collection('contexts')\n  .doc(sessionId)\n  .get();\n```\n\n**3. Agent-to-Agent Messaging:**\n```javascript\n\u002F\u002F Send message from one agent to another\nawait mcp.sendMessage(\n  'agent-engine@project.iam.gserviceaccount.com',\n  {\n    action: 'analyze_data',\n    data: { userId: 'user123', fields: ['name', 'email'] }\n  }\n);\n\n\u002F\u002F Receive messages (in receiving agent)\nconst messages = await mcp.receiveMessages();\nmessages.forEach(msg => {\n  console.log(`From: ${msg.from}, Payload:`, msg.payload);\n});\n```\n\n**4. Task Queue Management:**\n```javascript\n\u002F\u002F Create task for another agent\nawait db.collection('a2a_tasks').add({\n  taskType: 'data_processing',\n  assignedTo: 'worker-agent@project.iam.gserviceaccount.com',\n  status: 'pending',\n  priority: 1,\n  payload: { userId: 'user123' },\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Agent claims and processes task\nconst taskQuery = await db.collection('a2a_tasks')\n  .where('assignedTo', '==', 'worker-agent@project.iam.gserviceaccount.com')\n  .where('status', '==', 'pending')\n  .orderBy('priority', 'asc')\n  .limit(1)\n  .get();\n\nif (!taskQuery.empty) {\n  const task = taskQuery.docs[0];\n  await task.ref.update({ status: 'in_progress' });\n  \u002F\u002F Process task...\n  await task.ref.update({ status: 'completed' });\n}\n```\n\n**5. Agent Activity Logging:**\n```javascript\n\u002F\u002F Log agent activities for audit trail\nawait mcp.logActivity({\n  action: 'processed_data',\n  userId: 'user123',\n  duration: 1500, \u002F\u002F ms\n  result: 'success'\n}, 'info');\n```\n\n### Phase 4: Cloud Run Integration\n\nFor Cloud Run services accessing Firestore:\n\n**Setup Cloud Run service class:**\n```javascript\nconst { CloudRunService } = require('.\u002Fsrc\u002Fcloudrun-service');\nconst cloudrun = new CloudRunService();\n\n\u002F\u002F In your Cloud Run endpoint\napp.post('\u002Fapi\u002Fusers\u002F:userId\u002Fdata', async (req, res) => {\n  const { userId } = req.params;\n\n  try {\n    \u002F\u002F Log request\n    await cloudrun.logRequest('\u002Fapi\u002Fusers\u002Fdata', 'POST', userId);\n\n    \u002F\u002F Get user data from Firestore\n    const userData = await cloudrun.getUserData(userId);\n\n    \u002F\u002F Store response\n    await cloudrun.storeResponse(req.id, {\n      userId,\n      data: userData,\n      status: 'success'\n    });\n\n    res.json({ success: true, data: userData });\n  } catch (error) {\n    await cloudrun.storeResponse(req.id, {\n      userId,\n      error: error.message,\n      status: 'error'\n    });\n\n    res.status(500).json({ error: error.message });\n  }\n});\n```\n\n### Phase 5: Security Rules Management\n\nGenerate and deploy security rules for both users and agents:\n\n**For basic users:**\n```javascript\nrules_version = '2';\nservice cloud.firestore {\n  match \u002Fdatabases\u002F{database}\u002Fdocuments {\n    match \u002Fusers\u002F{userId} {\n      allow read, write: if request.auth != null && request.auth.uid == userId;\n    }\n  }\n}\n```\n\n**For A2A\u002FMCP (service accounts):**\n```javascript\nrules_version = '2';\nservice cloud.firestore {\n  match \u002Fdatabases\u002F{database}\u002Fdocuments {\n    function isServiceAccount() {\n      return request.auth.token.email.matches('.*@.*\\\\.iam\\\\.gserviceaccount\\\\.com$');\n    }\n\n    function isAuthorizedAgent() {\n      return isServiceAccount() && request.auth.token.email in [\n        'mcp-server@project-id.iam.gserviceaccount.com',\n        'agent-engine@project-id.iam.gserviceaccount.com'\n      ];\n    }\n\n    \u002F\u002F Agent sessions\n    match \u002Fagent_sessions\u002F{sessionId} {\n      allow read, write: if isAuthorizedAgent();\n    }\n\n    \u002F\u002F Agent memory\n    match \u002Fagent_memory\u002F{agentId}\u002F{document=**} {\n      allow read, write: if isAuthorizedAgent();\n    }\n\n    \u002F\u002F A2A messages\n    match \u002Fa2a_messages\u002F{messageId} {\n      allow create: if isAuthorizedAgent();\n      allow read: if isAuthorizedAgent() &&\n                     (resource.data.from == request.auth.token.email ||\n                      resource.data.to == request.auth.token.email);\n    }\n  }\n}\n```\n\nDeploy rules:\n```bash\nfirebase deploy --only firestore:rules\n```\n\n## Advanced Patterns\n\n### Pattern 1: Multi-Agent Workflow Orchestration\n\n```javascript\n\u002F\u002F Coordinator agent creates workflow\nconst workflowId = await db.collection('workflows').add({\n  name: 'user_data_processing',\n  steps: [\n    { agent: 'validator@project.iam.gserviceaccount.com', status: 'pending' },\n    { agent: 'processor@project.iam.gserviceaccount.com', status: 'pending' },\n    { agent: 'notifier@project.iam.gserviceaccount.com', status: 'pending' }\n  ],\n  createdAt: admin.firestore.FieldValue.serverTimestamp()\n});\n\n\u002F\u002F Each agent listens for their step\nconst unsubscribe = db.collection('workflows')\n  .doc(workflowId)\n  .onSnapshot(async (doc) => {\n    const workflow = doc.data();\n    const myStep = workflow.steps.find(s => s.agent === myEmail && s.status === 'pending');\n\n    if (myStep) {\n      \u002F\u002F Process step\n      await processStep(myStep);\n\n      \u002F\u002F Mark complete and notify next agent\n      myStep.status = 'completed';\n      await doc.ref.update({ steps: workflow.steps });\n    }\n  });\n```\n\n### Pattern 2: Agent Context Sharing\n\n```javascript\n\u002F\u002F Agent 1 stores context\nawait db.collection('shared_context').doc('task_abc').set({\n  sharedBy: 'agent1@project.iam.gserviceaccount.com',\n  sharedWith: ['agent2@project.iam.gserviceaccount.com'],\n  context: {\n    userId: 'user123',\n    analysis: { sentiment: 'positive', score: 0.85 }\n  },\n  expiresAt: new Date(Date.now() + 3600000) \u002F\u002F 1 hour\n});\n\n\u002F\u002F Agent 2 retrieves context\nconst contextDoc = await db.collection('shared_context').doc('task_abc').get();\nif (contextDoc.exists && contextDoc.data().sharedWith.includes(myEmail)) {\n  const context = contextDoc.data().context;\n  \u002F\u002F Use context...\n}\n```\n\n### Pattern 3: Rate Limiting for Agents\n\n```javascript\n\u002F\u002F Check and enforce rate limits\nconst rateLimitRef = db.collection('rate_limits').doc(agentEmail);\nconst rateLimitDoc = await rateLimitRef.get();\n\nif (rateLimitDoc.exists) {\n  const { count, resetAt } = rateLimitDoc.data();\n\n  if (Date.now() \u003C resetAt && count >= 100) {\n    throw new Error('Rate limit exceeded');\n  }\n\n  if (Date.now() >= resetAt) {\n    \u002F\u002F Reset counter\n    await rateLimitRef.set({\n      count: 1,\n      resetAt: Date.now() + 60000 \u002F\u002F 1 minute\n    });\n  } else {\n    \u002F\u002F Increment counter\n    await rateLimitRef.update({\n      count: admin.firestore.FieldValue.increment(1)\n    });\n  }\n} else {\n  \u002F\u002F First request\n  await rateLimitRef.set({\n    count: 1,\n    resetAt: Date.now() + 60000\n  });\n}\n```\n\n## Performance Optimization\n\n### For Basic Users:\n1. **Use batch operations** - Write\u002Fupdate 500 docs at once\n2. **Create indexes** - Required for complex queries\n3. **Paginate results** - Use cursor-based pagination\n4. **Cache frequently read data** - Reduce read costs\n\n### For A2A\u002FMCP Users:\n1. **Connection pooling** - Reuse Firestore connections\n2. **Batch agent messages** - Combine multiple messages\n3. **TTL for agent data** - Clean up expired sessions automatically\n4. **Denormalize agent state** - Avoid cross-collection queries\n\n## Cost Optimization\n\nFirestore costs:\n- Document reads: $0.06 per 100k\n- Document writes: $0.18 per 100k\n- Document deletes: $0.02 per 100k\n\nReduce costs:\n- Use batch writes (1 operation vs 500)\n- Cache agent context locally\n- Archive old agent logs to Cloud Storage\n- Set up billing alerts\n\n## Security Best Practices\n\n1. **Never allow open access** - Always require authentication\n2. **Whitelist service accounts** - Don't allow all service accounts\n3. **Validate all inputs** - Check types, formats, required fields\n4. **Make logs immutable** - Prevent tampering with audit trails\n5. **Rotate credentials** - Change service account keys every 90 days\n6. **Monitor usage** - Set up Firebase console alerts\n7. **Test rules** - Use Firebase Emulator before deploying\n\n## Troubleshooting\n\n### Issue: Permission Denied\n- Check security rules allow the operation\n- Verify service account is whitelisted\n- Ensure GOOGLE_APPLICATION_CREDENTIALS is set\n\n### Issue: A2A Messages Not Delivered\n- Verify recipient agent email is correct\n- Check message status in Firestore console\n- Ensure security rules allow cross-agent messaging\n\n### Issue: Rate Limit Errors\n- Implement exponential backoff\n- Use batch operations\n- Increase rate limits in configuration\n\n### Issue: Cloud Run Connection Fails\n- Verify service account has Firestore permissions\n- Check VPC connectivity if using private IP\n- Ensure project ID matches in code and credentials\n\n## Examples\n\nSee `examples\u002Ffirestore-usage.js` for complete code examples covering:\n- Basic CRUD operations\n- Complex queries and pagination\n- Batch operations\n- A2A agent communication\n- MCP server integration\n- Cloud Run service patterns\n- Security rules testing\n\n## Resources\n\n- [Firestore Documentation](https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Ffirestore)\n- [A2A Protocol Specification](https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fvertex-ai-agents)\n- [MCP Documentation](https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fmcp)\n- [Cloud Run Integration](https:\u002F\u002Fcloud.google.com\u002Frun\u002Fdocs\u002Ftutorials)\n\n## Summary\n\nThis skill provides comprehensive Firestore operations for:\n- **Everyone**: Standard database CRUD, queries, batch ops, security\n- **AI Power Users**: A2A communication, MCP integration, Cloud Run services, multi-agent workflows\n\nUse `\u002Ffirestore-setup` to initialize, then leverage the agents and commands for specific operations!\n\n",{"name":5,"version":52,"description":53,"allowed-tools":54},"1.0.0","Manages Firebase\u002FFirestore operations including CRUD, queries, batch processing, A2A agent communication, MCP server integration, and Cloud Run service coordination.\nActivates when you request \"firestore operations\", \"create firestore document\", \"query firestore\", \"A2A agent communication\", \"MCP server setup\", \"agent-to-agent messaging\", or \"Cloud Run firestore integration\".\nHandles both basic database operations for regular users and advanced A2A framework patterns for AI agents.\n","Read, Write, Edit, Grep, Glob, Bash","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Ffirestore-manager",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill firestore-operations-manager",{"tool":70,"command":71},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill firestore-operations-manager",{"tool":73,"command":74},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill firestore-operations-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Ffirestore-manager\u002FSKILL.md",true,[],[79,89,98,107,113,120],{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":85,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[84],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[86,87,88],"model","model hierarchy","model hierarchy skill",{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":95,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[94],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[37,96,97],"zoom","zoom mcp",{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[104,105,106,96],"sdk","zoom apps sdk","apps",{"skillNo":108,"name":109,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[109],{"skillNo":114,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":119,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[118],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[115],{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[122]]