A production-ready Agent-to-Agent (A2A) that seamlessly integrates with Google Calendar.
Enables AI assistants and automated systems to manage calendar events, schedule meetings, and query availability through a standardized protocol. Built with Go for high performance and reliability, with optional mock mode for testing and development.
# Run the agent
go run main.go
# Or with Docker
docker build -t google-calendar-agent .
docker run -p 8080:8080 google-calendar-agent
- ✅ A2A protocol compliant
- ✅ Google Calendar integration (when configured)
- ✅ Minimal dependencies
- ✅ Production ready
- ✅ Mock mode for testing
GET /.well-known/agent.json
- Agent metadataGET /health
- Health checkPOST /a2a
- A2A protocol endpoint
Configure the agent via environment variables:
ENVIRONMENT
- Deployment environment (default:dev
)DEMO_MODE
- Enable demo mode with mock services (default:false
)
GOOGLE_CALENDAR_ID
- Target Google Calendar ID (default:primary
)GOOGLE_CALENDAR_SA_JSON
- Google Service Account credentials (JSON format)GOOGLE_APPLICATION_CREDENTIALS
- Path to Google credentials file (alternative to SA_JSON)GOOGLE_CALENDAR_READ_ONLY
- Access calendar in read-only mode (default:false
)GOOGLE_CALENDAR_TIMEZONE
- Default timezone for time inputs (default:UTC
)
LOG_LEVEL
- Log level:debug
,info
,warn
,error
(default:info
)LOG_FORMAT
- Log format:json
,console
(default:json
)LOG_OUTPUT
- Log output:stdout
,stderr
, or file path (default:stdout
)LOG_ENABLE_CALLER
- Add caller info to logs (default:true
)LOG_ENABLE_STACKTRACE
- Add stacktrace to error logs (default:true
)
A2A_AGENT_URL
- Agent URL (default:http://helloworld-agent:8080
)
A2A_DEBUG
- Enable debug mode (default:false
)A2A_TIMEZONE
- Timezone for timestamps (default:UTC
)A2A_STREAMING_STATUS_UPDATE_INTERVAL
- Interval for streaming status updates (default:1s
)
A2A_AGENT_CLIENT_PROVIDER
- LLM provider:openai
,anthropic
,groq
,ollama
,deepseek
,cohere
,cloudflare
A2A_AGENT_CLIENT_MODEL
- Model to useA2A_AGENT_CLIENT_API_KEY
- API key for LLM providerA2A_AGENT_CLIENT_BASE_URL
- Custom LLM API endpointA2A_AGENT_CLIENT_TIMEOUT
- Timeout for LLM requests (default:30s
)A2A_AGENT_CLIENT_MAX_RETRIES
- Maximum retries for LLM requests (default:3
)A2A_AGENT_CLIENT_MAX_CHAT_COMPLETION_ITERATIONS
- Maximum chat completion iterations (default:10
)A2A_AGENT_CLIENT_MAX_TOKENS
- Maximum tokens for LLM responses (default:4096
)A2A_AGENT_CLIENT_TEMPERATURE
- Controls randomness of LLM output (default:0.7
)A2A_AGENT_CLIENT_TOP_P
- Top-p sampling parameter (default:1.0
)A2A_AGENT_CLIENT_FREQUENCY_PENALTY
- Frequency penalty (default:0.0
)A2A_AGENT_CLIENT_PRESENCE_PENALTY
- Presence penalty (default:0.0
)A2A_AGENT_CLIENT_SYSTEM_PROMPT
- System prompt to guide the LLM (default:You are a helpful AI assistant processing an A2A (Agent-to-Agent) task. Please provide helpful and accurate responses.
)A2A_AGENT_CLIENT_MAX_CONVERSATION_HISTORY
- Maximum conversation history per context (default:20
)A2A_AGENT_CLIENT_USER_AGENT
- User agent string (default:a2a-agent/1.0
)
A2A_CAPABILITIES_STREAMING
- Enable streaming support (default:true
)A2A_CAPABILITIES_PUSH_NOTIFICATIONS
- Enable push notifications (default:true
)A2A_CAPABILITIES_STATE_TRANSITION_HISTORY
- Enable state transition history (default:false
)
A2A_AUTH_ENABLE
- Enable OIDC authentication (default:false
)A2A_AUTH_ISSUER_URL
- OIDC issuer URL (default:http://keycloak:8080/realms/inference-gateway-realm
)A2A_AUTH_CLIENT_ID
- OIDC client ID (default:inference-gateway-client
)A2A_AUTH_CLIENT_SECRET
- OIDC client secret
A2A_SERVER_TLS_ENABLE
- Enable TLS (default:false
)A2A_SERVER_TLS_CERT_PATH
- Path to TLS certificate fileA2A_SERVER_TLS_KEY_PATH
- Path to TLS private key file
A2A_QUEUE_MAX_SIZE
- Queue maximum size (default:100
)A2A_QUEUE_CLEANUP_INTERVAL
- Queue cleanup interval (default:30s
)
A2A_SERVER_PORT
- Server port (default:8080
)A2A_SERVER_READ_TIMEOUT
- Maximum duration for reading requests (default:120s
)A2A_SERVER_WRITE_TIMEOUT
- Maximum duration for writing responses (default:120s
)A2A_SERVER_IDLE_TIMEOUT
- Maximum time to wait for next request (default:120s
)A2A_SERVER_DISABLE_HEALTHCHECK_LOG
- Disable logging for health check requests (default:true
)
A2A_TELEMETRY_ENABLE
- Enable OpenTelemetry metrics collection (default:false
)A2A_TELEMETRY_METRICS_PORT
- Metrics server port (default:9090
)A2A_TELEMETRY_METRICS_HOST
- Metrics server hostA2A_TELEMETRY_METRICS_READ_TIMEOUT
- Metrics server read timeout (default:30s
)A2A_TELEMETRY_METRICS_WRITE_TIMEOUT
- Metrics server write timeout (default:30s
)A2A_TELEMETRY_METRICS_IDLE_TIMEOUT
- Metrics server idle timeout (default:60s
)
For a complete working example with Docker Compose setup, see the example directory.
# Test the agent
curl -X POST http://localhost:8080/a2a \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "message/send",
"params": {
"message": {
"role": "user",
"content": "List my calendar events for today"
}
},
"id": 1
}'
MIT