|
| 1 | +# 📊 Metadata Tracking & Audit Trails |
| 2 | + |
| 3 | +MCP Gateway provides comprehensive metadata tracking for all entities (Tools, Resources, Prompts, Servers, Gateways) to enable enterprise-grade audit trails, compliance monitoring, and operational troubleshooting. |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## 🎯 **Overview** |
| 8 | + |
| 9 | +Every entity in MCP Gateway now includes detailed metadata about: |
| 10 | +- **Who** created or modified the entity |
| 11 | +- **When** the operation occurred |
| 12 | +- **From where** (IP address, user agent) |
| 13 | +- **How** it was created (UI, API, bulk import, federation) |
| 14 | +- **Source tracking** for federated entities and bulk operations |
| 15 | + |
| 16 | +--- |
| 17 | + |
| 18 | +## 📊 **Metadata Fields** |
| 19 | + |
| 20 | +All entities include the following metadata fields: |
| 21 | + |
| 22 | +| Category | Field | Description | Example Values | |
| 23 | +|----------|-------|-------------|----------------| |
| 24 | +| **Creation** | `created_by` | Username who created entity | `"admin"`, `"alice"`, `"anonymous"` | |
| 25 | +| | `created_at` | Creation timestamp | `"2024-01-15T10:30:00Z"` | |
| 26 | +| | `created_from_ip` | IP address of creator | `"192.168.1.100"`, `"10.0.0.1"` | |
| 27 | +| | `created_via` | Creation method | `"ui"`, `"api"`, `"import"`, `"federation"` | |
| 28 | +| | `created_user_agent` | Browser/client info | `"Mozilla/5.0"`, `"curl/7.68.0"` | |
| 29 | +| **Modification** | `modified_by` | Last modifier username | `"bob"`, `"system"`, `"anonymous"` | |
| 30 | +| | `modified_at` | Last modification timestamp | `"2024-01-16T14:22:00Z"` | |
| 31 | +| | `modified_from_ip` | IP of last modifier | `"172.16.0.1"` | |
| 32 | +| | `modified_via` | Modification method | `"ui"`, `"api"` | |
| 33 | +| | `modified_user_agent` | Client of last change | `"HTTPie/2.4.0"` | |
| 34 | +| **Source** | `import_batch_id` | Bulk import UUID | `"550e8400-e29b-41d4-a716-446655440000"` | |
| 35 | +| | `federation_source` | Source gateway name | `"gateway-prod-east"` | |
| 36 | +| | `version` | Change tracking version | `1`, `2`, `3`... | |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +## 🖥️ **Viewing Metadata** |
| 41 | + |
| 42 | +### **Admin UI** |
| 43 | + |
| 44 | +Metadata is displayed in the detail view modals for all entity types: |
| 45 | + |
| 46 | +1. **Navigate** to any entity list (Tools, Resources, Prompts, Servers, Gateways) |
| 47 | +2. **Click "View"** on any entity |
| 48 | +3. **Scroll down** to the "Metadata" section |
| 49 | + |
| 50 | +**Example metadata display:** |
| 51 | +``` |
| 52 | +┌─ Metadata ──────────────────────────────────────┐ |
| 53 | +│ Created By: admin │ |
| 54 | +│ Created At: 1/15/2024, 10:30:00 AM │ |
| 55 | +│ Created From: 192.168.1.100 │ |
| 56 | +│ Created Via: ui │ |
| 57 | +│ Last Modified By: alice │ |
| 58 | +│ Last Modified At: 1/16/2024, 2:22:00 PM │ |
| 59 | +│ Version: 3 │ |
| 60 | +│ Import Batch: N/A │ |
| 61 | +└─────────────────────────────────────────────────┘ |
| 62 | +``` |
| 63 | + |
| 64 | +### **API Responses** |
| 65 | + |
| 66 | +All entity read endpoints include metadata fields in JSON responses: |
| 67 | + |
| 68 | +```bash |
| 69 | +# Get tool with metadata |
| 70 | +curl -H "Authorization: Bearer $TOKEN" \ |
| 71 | + http://localhost:4444/tools/abc123 |
| 72 | + |
| 73 | +{ |
| 74 | + "id": "abc123", |
| 75 | + "name": "example_tool", |
| 76 | + "description": "Example tool", |
| 77 | + "createdBy": "admin", |
| 78 | + "createdAt": "2024-01-15T10:30:00Z", |
| 79 | + "createdFromIp": "192.168.1.100", |
| 80 | + "createdVia": "ui", |
| 81 | + "createdUserAgent": "Mozilla/5.0...", |
| 82 | + "modifiedBy": "alice", |
| 83 | + "modifiedAt": "2024-01-16T14:22:00Z", |
| 84 | + "version": 3, |
| 85 | + "importBatchId": null, |
| 86 | + "federationSource": null, |
| 87 | + ... |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +--- |
| 92 | + |
| 93 | +## 🔍 **Metadata by Source Type** |
| 94 | + |
| 95 | +### **Manual Creation (UI/API)** |
| 96 | +- `created_via`: `"ui"` or `"api"` |
| 97 | +- `created_by`: Authenticated username |
| 98 | +- `created_from_ip`: Client IP address |
| 99 | +- `federation_source`: `null` |
| 100 | +- `import_batch_id`: `null` |
| 101 | + |
| 102 | +### **Bulk Import Operations** |
| 103 | +- `created_via`: `"import"` |
| 104 | +- `import_batch_id`: UUID linking related imports |
| 105 | +- `created_by`: User who initiated import |
| 106 | +- `federation_source`: `null` |
| 107 | + |
| 108 | +### **Federation (MCP Server Discovery)** |
| 109 | +- `created_via`: `"federation"` |
| 110 | +- `federation_source`: Source gateway name |
| 111 | +- `created_by`: User who registered the gateway |
| 112 | +- `import_batch_id`: `null` |
| 113 | + |
| 114 | +### **Legacy Entities (Pre-Metadata)** |
| 115 | +- All metadata fields: `null` |
| 116 | +- UI displays: `"Legacy Entity"`, `"Pre-metadata"` |
| 117 | +- `version`: `1` (automatically assigned) |
| 118 | + |
| 119 | +--- |
| 120 | + |
| 121 | +## 🛡️ **Authentication Compatibility** |
| 122 | + |
| 123 | +Metadata tracking works seamlessly across all authentication modes: |
| 124 | + |
| 125 | +### **With Authentication (`AUTH_REQUIRED=true`)** |
| 126 | +```bash |
| 127 | +# Example: User "admin" creates a tool |
| 128 | +{ |
| 129 | + "createdBy": "admin", |
| 130 | + "createdVia": "api", |
| 131 | + "createdFromIp": "192.168.1.100" |
| 132 | +} |
| 133 | +``` |
| 134 | + |
| 135 | +### **Without Authentication (`AUTH_REQUIRED=false`)** |
| 136 | +```bash |
| 137 | +# Example: Anonymous creation |
| 138 | +{ |
| 139 | + "createdBy": "anonymous", |
| 140 | + "createdVia": "api", |
| 141 | + "createdFromIp": "192.168.1.100" |
| 142 | +} |
| 143 | +``` |
| 144 | + |
| 145 | +### **JWT vs Basic Authentication** |
| 146 | +- **JWT Authentication**: Extracts username from token payload (`username` or `sub` field) |
| 147 | +- **Basic Authentication**: Uses provided username directly |
| 148 | +- **Both formats handled gracefully** by the `extract_username()` utility |
| 149 | + |
| 150 | +--- |
| 151 | + |
| 152 | +## 🔄 **Version Tracking** |
| 153 | + |
| 154 | +Each entity maintains a version number that increments on modifications: |
| 155 | + |
| 156 | +```bash |
| 157 | +# Initial creation |
| 158 | +POST /tools -> version: 1 |
| 159 | + |
| 160 | +# First update |
| 161 | +PUT /tools/123 -> version: 2 |
| 162 | + |
| 163 | +# Second update |
| 164 | +PUT /tools/123 -> version: 3 |
| 165 | +``` |
| 166 | + |
| 167 | +Version tracking helps identify: |
| 168 | +- **Configuration drift** between environments |
| 169 | +- **Change frequency** for troubleshooting |
| 170 | +- **Rollback points** for recovery scenarios |
| 171 | + |
| 172 | +--- |
| 173 | + |
| 174 | +## 📈 **Use Cases** |
| 175 | + |
| 176 | +### **Security Auditing** |
| 177 | +- Track who created/modified sensitive configurations |
| 178 | +- Identify unauthorized changes by IP address |
| 179 | +- Monitor bulk import operations for compliance |
| 180 | + |
| 181 | +### **Operational Troubleshooting** |
| 182 | +- Trace entity origins during incident response |
| 183 | +- Identify batch operations that may have caused issues |
| 184 | +- Understand federation dependencies between gateways |
| 185 | + |
| 186 | +### **Compliance Reporting** |
| 187 | +- Generate audit reports for regulatory requirements |
| 188 | +- Track change management processes |
| 189 | +- Demonstrate access controls and change attribution |
| 190 | + |
| 191 | +### **Development & Testing** |
| 192 | +- Identify test vs production entities |
| 193 | +- Track deployment-specific configurations |
| 194 | +- Monitor cross-environment migrations |
| 195 | + |
| 196 | +--- |
| 197 | + |
| 198 | +## 🔧 **Configuration** |
| 199 | + |
| 200 | +### **No Additional Setup Required** |
| 201 | + |
| 202 | +Metadata tracking is **automatically enabled** for all new installations and upgrades: |
| 203 | + |
| 204 | +- **Database migration** runs automatically on startup |
| 205 | +- **Existing entities** show graceful fallbacks for missing metadata |
| 206 | +- **No environment variables** needed - uses existing `AUTH_REQUIRED` setting |
| 207 | + |
| 208 | +### **Proxy Support** |
| 209 | + |
| 210 | +Metadata capture automatically handles reverse proxy scenarios: |
| 211 | + |
| 212 | +```bash |
| 213 | +# Respects X-Forwarded-For headers |
| 214 | +X-Forwarded-For: 203.0.113.1, 192.168.1.1, 127.0.0.1 |
| 215 | +# Records: created_from_ip = "203.0.113.1" (original client) |
| 216 | +``` |
| 217 | + |
| 218 | +### **Privacy Considerations** |
| 219 | + |
| 220 | +The system captures IP addresses and user agents for audit purposes: |
| 221 | + |
| 222 | +- **IP addresses**: Consider GDPR/privacy implications for EU deployments |
| 223 | +- **User agents**: May contain personally identifiable information |
| 224 | +- **Data retention**: Define policies for metadata archival |
| 225 | +- **Access control**: Metadata follows same permissions as parent entity |
| 226 | + |
| 227 | +--- |
| 228 | + |
| 229 | +## 🚀 **Migration Guide** |
| 230 | + |
| 231 | +### **Upgrading Existing Deployments** |
| 232 | + |
| 233 | +1. **Automatic Migration** |
| 234 | + ```bash |
| 235 | + # Migration runs automatically on startup |
| 236 | + # Or run manually: |
| 237 | + alembic upgrade head |
| 238 | + ``` |
| 239 | + |
| 240 | +2. **Verify Migration** |
| 241 | + - Check admin UI - all entities show metadata sections |
| 242 | + - API responses include new metadata fields |
| 243 | + - Legacy entities display gracefully |
| 244 | + |
| 245 | +3. **No Downtime Required** |
| 246 | + - All metadata columns are nullable |
| 247 | + - Existing functionality unchanged |
| 248 | + - Gradual adoption of metadata features |
| 249 | + |
| 250 | +### **Metadata Backfill (Optional)** |
| 251 | + |
| 252 | +For enhanced audit trails, optionally backfill known metadata: |
| 253 | + |
| 254 | +```sql |
| 255 | +-- Backfill system-created entities |
| 256 | +UPDATE tools SET |
| 257 | + created_by = 'system', |
| 258 | + created_via = 'migration', |
| 259 | + version = 1 |
| 260 | +WHERE created_by IS NULL; |
| 261 | + |
| 262 | +-- Similar for other entity tables |
| 263 | +UPDATE gateways SET created_by = 'system', created_via = 'migration', version = 1 WHERE created_by IS NULL; |
| 264 | +UPDATE servers SET created_by = 'system', created_via = 'migration', version = 1 WHERE created_by IS NULL; |
| 265 | +UPDATE prompts SET created_by = 'system', created_via = 'migration', version = 1 WHERE created_by IS NULL; |
| 266 | +UPDATE resources SET created_by = 'system', created_via = 'migration', version = 1 WHERE created_by IS NULL; |
| 267 | +``` |
| 268 | + |
| 269 | +--- |
| 270 | + |
| 271 | +## 🔮 **Future Enhancements** |
| 272 | + |
| 273 | +### **Enhanced Audit Features** |
| 274 | +- **Change history tracking** - Before/after state comparison |
| 275 | +- **Metadata-based filtering** - Search entities by creator, date, source |
| 276 | +- **Audit log export** - Generate compliance reports |
| 277 | +- **Custom metadata fields** - User-defined entity attributes |
| 278 | + |
| 279 | +### **Cross-Gateway Features** |
| 280 | +- **Metadata synchronization** across federated gateways |
| 281 | +- **Trust scoring** based on metadata quality |
| 282 | +- **Provenance tracking** for complex federation scenarios |
| 283 | + |
| 284 | +### **Analytics Integration** |
| 285 | +- **Usage pattern analysis** from metadata |
| 286 | +- **Creator activity dashboards** |
| 287 | +- **Import/export trend monitoring** |
| 288 | + |
| 289 | +--- |
| 290 | + |
| 291 | +## 📋 **API Examples** |
| 292 | + |
| 293 | +### **Creating Entities with Metadata** |
| 294 | + |
| 295 | +Metadata is captured automatically - no additional parameters needed: |
| 296 | + |
| 297 | +```bash |
| 298 | +# Create tool - metadata captured automatically |
| 299 | +curl -X POST http://localhost:4444/tools \ |
| 300 | + -H "Authorization: Bearer $TOKEN" \ |
| 301 | + -H "Content-Type: application/json" \ |
| 302 | + -d '{ |
| 303 | + "name": "example_tool", |
| 304 | + "url": "http://example.com/api", |
| 305 | + "integration_type": "REST", |
| 306 | + "request_type": "GET" |
| 307 | + }' |
| 308 | + |
| 309 | +# Response includes metadata |
| 310 | +{ |
| 311 | + "id": "abc123", |
| 312 | + "name": "example_tool", |
| 313 | + "createdBy": "admin", |
| 314 | + "createdAt": "2024-01-15T10:30:00Z", |
| 315 | + "createdVia": "api", |
| 316 | + "version": 1, |
| 317 | + ... |
| 318 | +} |
| 319 | +``` |
| 320 | + |
| 321 | +### **Filtering by Metadata (Future)** |
| 322 | + |
| 323 | +```bash |
| 324 | +# Future enhancement - filter by creator |
| 325 | +GET /tools?created_by=admin |
| 326 | + |
| 327 | +# Filter by creation method |
| 328 | +GET /tools?created_via=federation |
| 329 | + |
| 330 | +# Filter by date range |
| 331 | +GET /tools?created_after=2024-01-01&created_before=2024-01-31 |
| 332 | +``` |
| 333 | + |
| 334 | +--- |
| 335 | + |
| 336 | +## ❓ **FAQ** |
| 337 | + |
| 338 | +### **Q: Will this affect existing deployments?** |
| 339 | +A: No breaking changes. Existing entities show graceful fallbacks, all APIs work unchanged. |
| 340 | + |
| 341 | +### **Q: What happens if authentication is disabled?** |
| 342 | +A: Metadata still works - `created_by` will be `"anonymous"` instead of a username. |
| 343 | + |
| 344 | +### **Q: How much storage does metadata require?** |
| 345 | +A: Minimal - approximately 13 additional nullable text columns per entity. |
| 346 | + |
| 347 | +### **Q: Can I disable metadata tracking?** |
| 348 | +A: Not currently - metadata is core to the audit system. All fields are optional and backwards compatible. |
| 349 | + |
| 350 | +### **Q: How do I export metadata for compliance?** |
| 351 | +A: Use the standard export functionality - metadata is included in all entity exports. |
| 352 | + |
| 353 | +This comprehensive metadata system provides enterprise-grade audit capabilities while maintaining full backwards compatibility and operational simplicity. |
0 commit comments