2月19日 21:35
How does resource management work in MCP?
MCP's resource management mechanism allows LLMs to access and manipulate external resources such as files, database records, API endpoints, etc. Here are detailed implementation methods:
Resource Definition
MCP resources are identified and accessed through URIs (Uniform Resource Identifiers):
python{ "uri": "file:///path/to/resource", "name": "Resource Name", "description": "Resource description", "mimeType": "text/plain" }
1. Resource Types
MCP supports multiple resource types:
- File Resources:
file:///path/to/file - HTTP Resources:
http://example.com/api/resource - Database Resources:
db://database/table/id - Custom Resources:
custom://resource-type/id
2. Resource Registration
pythonfrom mcp.server import Server from mcp.types import Resource server = Server("my-mcp-server") @server.resource( uri="file:///config/app.json", name="Application Config", description="Application configuration file", mimeType="application/json" ) async def get_app_config() -> str: """Get application configuration""" return """ { "name": "MyApp", "version": "1.0.0", "settings": { "debug": false, "maxConnections": 100 } } """ @server.resource( uri="db://users/{id}", name="User Information", description="User detailed information", mimeType="application/json" ) async def get_user(id: str) -> str: """Get user information""" user = await database.get_user(id) return json.dumps(user)
3. Resource Access Control
pythonclass ResourceAccessControl: def __init__(self): self.permissions = {} self.acl = {} def grant_permission(self, user: str, resource_pattern: str, access: str): """Grant resource access permission""" if user not in self.permissions: self.permissions[user] = [] self.permissions[user].append({ "pattern": resource_pattern, "access": access # "read", "write", "delete" }) def check_permission(self, user: str, resource_uri: str, access: str) -> bool: """Check access permission""" if user not in self.permissions: return False for perm in self.permissions[user]: if self._match_pattern(perm["pattern"], resource_uri): if access in perm["access"] or perm["access"] == "all": return True return False def _match_pattern(self, pattern: str, uri: str) -> bool: """Match resource pattern""" import re # Convert wildcards to regex regex = pattern.replace("*", ".*").replace("?", ".") return re.match(regex, uri) is not None
4. Resource Caching
pythonfrom functools import lru_cache from datetime import datetime, timedelta import hashlib class ResourceCache: def __init__(self, ttl: int = 3600): self.cache = {} self.ttl = ttl def get(self, resource_uri: str) -> Optional[str]: """Get cached resource""" if resource_uri not in self.cache: return None entry = self.cache[resource_uri] # Check if expired if datetime.now() > entry["expires"]: del self.cache[resource_uri] return None return entry["data"] def set(self, resource_uri: str, data: str): """Set cached resource""" self.cache[resource_uri] = { "data": data, "expires": datetime.now() + timedelta(seconds=self.ttl), "hash": hashlib.md5(data.encode()).hexdigest() } def invalidate(self, resource_uri: str): """Invalidate cache""" if resource_uri in self.cache: del self.cache[resource_uri] def clear(self): """Clear cache""" self.cache.clear()
5. Resource Version Control
pythonclass ResourceVersionManager: def __init__(self): self.versions = {} def save_version(self, resource_uri: str, data: str, version: str): """Save resource version""" if resource_uri not in self.versions: self.versions[resource_uri] = {} self.versions[resource_uri][version] = { "data": data, "timestamp": datetime.now().isoformat() } def get_version(self, resource_uri: str, version: str) -> Optional[str]: """Get specified version""" if resource_uri not in self.versions: return None return self.versions[resource_uri].get(version, {}).get("data") def list_versions(self, resource_uri: str) -> List[str]: """List all versions""" if resource_uri not in self.versions: return [] return list(self.versions[resource_uri].keys()) def get_latest_version(self, resource_uri: str) -> Optional[str]: """Get latest version""" versions = self.list_versions(resource_uri) if not versions: return None return max(versions)
6. Resource Monitoring
pythonclass ResourceMonitor: def __init__(self): self.access_log = [] self.metrics = { "total_access": 0, "unique_resources": set(), "access_by_type": {} } def log_access(self, resource_uri: str, user: str, action: str): """Log resource access""" log_entry = { "timestamp": datetime.now().isoformat(), "resource": resource_uri, "user": user, "action": action } self.access_log.append(log_entry) # Update metrics self.metrics["total_access"] += 1 self.metrics["unique_resources"].add(resource_uri) # Statistics by type resource_type = resource_uri.split("://")[0] if resource_type not in self.metrics["access_by_type"]: self.metrics["access_by_type"][resource_type] = 0 self.metrics["access_by_type"][resource_type] += 1 def get_metrics(self) -> dict: """Get monitoring metrics""" return { "total_access": self.metrics["total_access"], "unique_resources": len(self.metrics["unique_resources"]), "access_by_type": self.metrics["access_by_type"] } def get_access_history(self, resource_uri: str, limit: int = 100) -> List[dict]: """Get access history""" filtered = [ log for log in self.access_log if log["resource"] == resource_uri ] return filtered[-limit:]
7. Resource Lifecycle Management
pythonclass ResourceLifecycleManager: def __init__(self): self.resources = {} self.cleanup_interval = 3600 # 1 hour def register_resource(self, resource_uri: str, metadata: dict): """Register resource""" self.resources[resource_uri] = { "metadata": metadata, "created_at": datetime.now(), "last_accessed": datetime.now(), "access_count": 0 } def access_resource(self, resource_uri: str): """Access resource""" if resource_uri in self.resources: self.resources[resource_uri]["last_accessed"] = datetime.now() self.resources[resource_uri]["access_count"] += 1 def cleanup_old_resources(self, max_age_days: int = 30): """Clean up old resources""" cutoff = datetime.now() - timedelta(days=max_age_days) to_remove = [] for uri, info in self.resources.items(): if info["last_accessed"] < cutoff: to_remove.append(uri) for uri in to_remove: del self.resources[uri] return len(to_remove) def get_resource_stats(self) -> dict: """Get resource statistics""" return { "total_resources": len(self.resources), "total_accesses": sum(r["access_count"] for r in self.resources.values()), "oldest_resource": min( (r["created_at"] for r in self.resources.values()), default=None ) }
Best Practices:
- URI Design: Use clear, hierarchical URI structures
- Access Control: Implement principle of least privilege
- Caching Strategy: Set appropriate TTL based on resource characteristics
- Monitoring and Logging: Log all resource access operations
- Version Management: Implement version control for important resources
- Regular Cleanup: Clean up unused resources
Through comprehensive resource management mechanisms, you can ensure secure and efficient access to resources in MCP systems.