Initial commit
This commit is contained in:
216
templates/resources-examples.py
Normal file
216
templates/resources-examples.py
Normal file
@@ -0,0 +1,216 @@
|
||||
"""
|
||||
FastMCP Resources Examples
|
||||
===========================
|
||||
Examples of static resources, dynamic resources, and resource templates.
|
||||
"""
|
||||
|
||||
from fastmcp import FastMCP
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Any
|
||||
import os
|
||||
|
||||
mcp = FastMCP("Resources Examples")
|
||||
|
||||
# ============================================================================
|
||||
# Static Resources
|
||||
# ============================================================================
|
||||
|
||||
@mcp.resource("data://config")
|
||||
def get_config() -> dict:
|
||||
"""Static configuration resource."""
|
||||
return {
|
||||
"version": "1.0.0",
|
||||
"environment": os.getenv("ENVIRONMENT", "development"),
|
||||
"features": ["search", "analytics", "notifications"],
|
||||
"limits": {
|
||||
"max_requests": 1000,
|
||||
"max_results": 100
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@mcp.resource("info://server")
|
||||
def server_info() -> dict:
|
||||
"""Server metadata."""
|
||||
return {
|
||||
"name": "Resources Examples Server",
|
||||
"description": "Demonstrates various resource patterns",
|
||||
"version": "1.0.0",
|
||||
"capabilities": [
|
||||
"static_resources",
|
||||
"dynamic_resources",
|
||||
"resource_templates"
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Dynamic Resources
|
||||
# ============================================================================
|
||||
|
||||
@mcp.resource("info://status")
|
||||
async def server_status() -> dict:
|
||||
"""Dynamic status resource (updated on each read)."""
|
||||
import psutil
|
||||
|
||||
return {
|
||||
"status": "operational",
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"uptime_seconds": 0, # Would track actual uptime
|
||||
"system": {
|
||||
"cpu_percent": psutil.cpu_percent(interval=1),
|
||||
"memory_percent": psutil.virtual_memory().percent,
|
||||
"disk_percent": psutil.disk_usage('/').percent
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@mcp.resource("data://statistics")
|
||||
async def get_statistics() -> dict:
|
||||
"""Dynamic statistics resource."""
|
||||
return {
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"total_requests": 1234, # Would track actual requests
|
||||
"active_connections": 5,
|
||||
"cache_hit_rate": 0.87,
|
||||
"average_response_time_ms": 45.3
|
||||
}
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Resource Templates (with parameters)
|
||||
# ============================================================================
|
||||
|
||||
@mcp.resource("user://{user_id}/profile")
|
||||
async def get_user_profile(user_id: str) -> dict:
|
||||
"""Get user profile by ID."""
|
||||
# In production, fetch from database
|
||||
return {
|
||||
"id": user_id,
|
||||
"name": f"User {user_id}",
|
||||
"email": f"user{user_id}@example.com",
|
||||
"created_at": "2024-01-01T00:00:00Z",
|
||||
"role": "user"
|
||||
}
|
||||
|
||||
|
||||
@mcp.resource("user://{user_id}/posts")
|
||||
async def get_user_posts(user_id: str) -> List[dict]:
|
||||
"""Get posts for a specific user."""
|
||||
# In production, fetch from database
|
||||
return [
|
||||
{
|
||||
"id": 1,
|
||||
"user_id": user_id,
|
||||
"title": "First Post",
|
||||
"content": "Hello, world!",
|
||||
"created_at": "2024-01-01T00:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"user_id": user_id,
|
||||
"title": "Second Post",
|
||||
"content": "Another post",
|
||||
"created_at": "2024-01-02T00:00:00Z"
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@mcp.resource("org://{org_id}/team/{team_id}/members")
|
||||
async def get_team_members(org_id: str, team_id: str) -> List[dict]:
|
||||
"""Get team members with org and team context."""
|
||||
# In production, fetch from database with filters
|
||||
return [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Alice",
|
||||
"role": "engineer",
|
||||
"org_id": org_id,
|
||||
"team_id": team_id
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Bob",
|
||||
"role": "designer",
|
||||
"org_id": org_id,
|
||||
"team_id": team_id
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@mcp.resource("api://{version}/config")
|
||||
async def get_versioned_config(version: str) -> dict:
|
||||
"""Get configuration for specific API version."""
|
||||
configs = {
|
||||
"v1": {
|
||||
"api_version": "v1",
|
||||
"endpoints": ["/users", "/posts"],
|
||||
"deprecated": True
|
||||
},
|
||||
"v2": {
|
||||
"api_version": "v2",
|
||||
"endpoints": ["/users", "/posts", "/comments", "/likes"],
|
||||
"deprecated": False
|
||||
}
|
||||
}
|
||||
|
||||
return configs.get(version, {"error": f"Unknown version: {version}"})
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# File-based Resources
|
||||
# ============================================================================
|
||||
|
||||
@mcp.resource("file://docs/{filename}")
|
||||
async def get_documentation(filename: str) -> dict:
|
||||
"""Get documentation file content."""
|
||||
# In production, read actual files
|
||||
docs = {
|
||||
"getting-started.md": {
|
||||
"filename": "getting-started.md",
|
||||
"content": "# Getting Started\n\nWelcome to the docs!",
|
||||
"last_modified": "2024-01-01T00:00:00Z"
|
||||
},
|
||||
"api-reference.md": {
|
||||
"filename": "api-reference.md",
|
||||
"content": "# API Reference\n\nAPI documentation here.",
|
||||
"last_modified": "2024-01-02T00:00:00Z"
|
||||
}
|
||||
}
|
||||
|
||||
return docs.get(filename, {"error": f"File not found: {filename}"})
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# List-style Resources
|
||||
# ============================================================================
|
||||
|
||||
@mcp.resource("data://users")
|
||||
async def list_users() -> List[dict]:
|
||||
"""List all users."""
|
||||
# In production, fetch from database
|
||||
return [
|
||||
{"id": "1", "name": "Alice", "email": "alice@example.com"},
|
||||
{"id": "2", "name": "Bob", "email": "bob@example.com"},
|
||||
{"id": "3", "name": "Charlie", "email": "charlie@example.com"}
|
||||
]
|
||||
|
||||
|
||||
@mcp.resource("data://categories")
|
||||
def list_categories() -> List[str]:
|
||||
"""List available categories."""
|
||||
return [
|
||||
"Technology",
|
||||
"Science",
|
||||
"Business",
|
||||
"Entertainment",
|
||||
"Sports"
|
||||
]
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Main
|
||||
# ============================================================================
|
||||
|
||||
if __name__ == "__main__":
|
||||
mcp.run()
|
||||
Reference in New Issue
Block a user