Add comprehensive agent activity tracking

- Enhanced Agent struct with current_activity, current_files, and activity_history fields
- Created ActivityTracker module to infer activities from tool calls
- Integrated activity tracking into MCP server tool routing
- Updated task board APIs to include activity information
- Agents now show real-time status like 'Reading file.ex', 'Editing main.py', 'Sequential thinking', etc.
- Added activity history to track recent agent actions
- All file operations and tool calls are now tracked and displayed
This commit is contained in:
Ra
2025-09-06 09:58:59 -07:00
parent 1056672e7c
commit b1f55799ec
27 changed files with 4761 additions and 321 deletions

View File

@@ -0,0 +1,253 @@
# MCP Compliance Enhancement Summary
## Overview
This document summarizes the enhanced Model Context Protocol (MCP) compliance features implemented in the Agent Coordinator system, focusing on session management, security, and real-time streaming capabilities.
## Implemented Features
### 1. 🔐 Enhanced Session Management
#### Session Token Authentication
- **Implementation**: Modified `register_agent` to return cryptographically secure session tokens
- **Token Format**: 32-byte secure random tokens, Base64 encoded
- **Expiry**: 60-minute session timeout with automatic cleanup
- **Headers**: Support for `Mcp-Session-Id` header (MCP compliant) and `X-Session-Id` (legacy)
#### Session Validation Flow
```
Client Server
| |
|-- POST /mcp/request ---->|
| register_agent |
| |
|<-- session_token --------|
| expires_at |
| |
|-- Subsequent requests -->|
| Mcp-Session-Id: token |
| |
|<-- Authenticated resp ---|
```
#### Key Components
- **SessionManager GenServer**: Manages token lifecycle and validation
- **Secure token generation**: Uses `:crypto.strong_rand_bytes/1`
- **Automatic cleanup**: Periodic removal of expired sessions
- **Backward compatibility**: Supports legacy X-Session-Id headers
### 2. 📋 MCP Protocol Version Compliance
#### Protocol Headers
- **MCP-Protocol-Version**: `2025-06-18` (current specification)
- **Server**: `AgentCoordinator/1.0` identification
- **Applied to**: All JSON responses via enhanced `send_json_response/3`
#### CORS Enhancement
- **Session Headers**: Added `mcp-session-id`, `mcp-protocol-version` to allowed headers
- **Exposed Headers**: Protocol version and server headers exposed to clients
- **Security**: Enhanced origin validation with localhost and HTTPS preference
### 3. 🔒 Security Enhancements
#### Origin Validation
```elixir
defp validate_origin(origin) do
case URI.parse(origin) do
%URI{host: host} when host in ["localhost", "127.0.0.1", "::1"] -> origin
%URI{host: host} when is_binary(host) ->
if String.starts_with?(origin, "https://") or
String.contains?(host, ["localhost", "127.0.0.1", "dev", "local"]) do
origin
else
Logger.warning("Potentially unsafe origin: #{origin}")
"*"
end
_ -> "*"
end
end
```
#### Authenticated Method Protection
Protected methods requiring valid session tokens:
- `agents/register`
- `agents/unregister`
- `agents/heartbeat`
- `tasks/create`
- `tasks/complete`
- `codebase/register`
- `stream/subscribe`
### 4. 📡 Server-Sent Events (SSE) Support
#### Real-time Streaming Endpoint
- **Endpoint**: `GET /mcp/stream`
- **Transport**: Streamable HTTP (MCP specification)
- **Authentication**: Requires valid session token
- **Content-Type**: `text/event-stream`
#### SSE Event Format
```
event: connected
data: {"session_id":"agent_123","protocol_version":"2025-06-18","timestamp":"2025-01-11T..."}
event: heartbeat
data: {"timestamp":"2025-01-11T...","session_id":"agent_123"}
```
#### Features
- **Connection establishment**: Sends initial `connected` event
- **Heartbeat**: Periodic keepalive events
- **Session tracking**: Events include session context
- **Graceful disconnection**: Handles client disconnects
## Technical Implementation Details
### File Structure
```
lib/agent_coordinator/
├── session_manager.ex # Session token management
├── mcp_server.ex # Enhanced register_agent
├── http_interface.ex # HTTP/SSE endpoints + security
└── application.ex # Supervision tree
```
### Session Manager API
```elixir
# Create new session
{:ok, session_info} = SessionManager.create_session(agent_id, capabilities)
# Validate existing session
{:ok, session_info} = SessionManager.validate_session(token)
{:error, :expired} = SessionManager.validate_session(old_token)
# Manual cleanup (automatic via timer)
SessionManager.cleanup_expired_sessions()
```
### HTTP Interface Enhancements
```elixir
# Session validation middleware
case validate_session_for_method(method, conn, context) do
{:ok, session_info} -> # Process request
{:error, auth_error} -> # Return 401 Unauthorized
end
# MCP headers on all responses
defp put_mcp_headers(conn) do
conn
|> put_resp_header("mcp-protocol-version", "2025-06-18")
|> put_resp_header("server", "AgentCoordinator/1.0")
end
```
## Usage Examples
### 1. Agent Registration with Session Token
```bash
curl -X POST http://localhost:4000/mcp/request \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": "1",
"method": "agents/register",
"params": {
"name": "My Agent Blue Koala",
"capabilities": ["coding", "testing"],
"codebase_id": "my_project"
}
}'
# Response:
{
"jsonrpc": "2.0",
"id": "1",
"result": {
"agent_id": "My Agent Blue Koala",
"session_token": "abc123...",
"expires_at": "2025-01-11T15:30:00Z"
}
}
```
### 2. Authenticated Tool Call
```bash
curl -X POST http://localhost:4000/mcp/request \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: abc123..." \
-d '{
"jsonrpc": "2.0",
"id": "2",
"method": "tools/call",
"params": {
"name": "get_task_board",
"arguments": {"agent_id": "My Agent Blue Koala"}
}
}'
```
### 3. Server-Sent Events Stream
```javascript
const eventSource = new EventSource('/mcp/stream', {
headers: {
'Mcp-Session-Id': 'abc123...'
}
});
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log('Received:', data);
};
```
## Testing and Verification
### Automated Test Script
- **File**: `test_session_management.exs`
- **Coverage**: Registration flow, session validation, protocol headers
- **Usage**: `elixir test_session_management.exs`
### Manual Testing
1. Start server: `mix phx.server`
2. Register agent via `/mcp/request`
3. Use returned session token for authenticated calls
4. Verify MCP headers in responses
5. Test SSE stream endpoint
## Benefits
### 🔐 Security
- **Token-based authentication**: Prevents unauthorized access
- **Session expiry**: Limits exposure of compromised tokens
- **Origin validation**: Mitigates CSRF and unauthorized origins
- **Method-level protection**: Granular access control
### 📋 MCP Compliance
- **Official protocol version**: Headers indicate MCP 2025-06-18 support
- **Streamable HTTP**: Real-time capabilities via SSE
- **Proper error handling**: Standard JSON-RPC error responses
- **Session context**: Request metadata for debugging
### 🚀 Developer Experience
- **Backward compatibility**: Legacy headers still supported
- **Clear error messages**: Detailed authentication failure reasons
- **Real-time updates**: Live agent status via SSE
- **Easy testing**: Comprehensive test utilities
## Future Enhancements
### Planned Features
- **PubSub integration**: Event-driven SSE updates
- **Session persistence**: Redis/database backing
- **Rate limiting**: Per-session request throttling
- **Audit logging**: Session activity tracking
- **WebSocket upgrade**: Bidirectional real-time communication
### Configuration Options
- **Session timeout**: Configurable expiry duration
- **Security levels**: Strict/permissive origin validation
- **Token rotation**: Automatic refresh mechanisms
- **Multi-tenancy**: Workspace-scoped sessions
---
*This implementation provides a solid foundation for MCP-compliant session management while maintaining the flexibility to extend with additional features as requirements evolve.*