create-mcp-craft
Version:
Create MCP TypeScript servers with Bun and Hono - the fastest way to scaffold Model Context Protocol servers
80 lines (68 loc) • 2 kB
text/typescript
import type { ResourcesSubscribeRequest } from '@/types/requests.js'
import type { McpResponse } from '@/types/mcp.js'
import { logger } from '@/utils/logger.js'
const subscriptions = new Set<string>()
export async function handleResourcesSubscribe(
request: ResourcesSubscribeRequest
): Promise<McpResponse> {
const { uri } = request.params
logger.info(`📄 Resource subscribe request: ${uri}`)
try {
// Check if resource exists (basic validation)
const validUriPatterns = [
/^config:\/\/.+/,
/^greeting:\/\/.+/,
/^logs:\/\/.+/,
/^status:\/\/.+/,
]
const isValidUri = validUriPatterns.some(pattern => pattern.test(uri))
if (!isValidUri) {
logger.error(`❌ Invalid resource URI for subscription: ${uri}`)
return {
jsonrpc: '2.0',
id: request.id,
error: {
code: -32601,
message: `Invalid resource URI: ${uri}`,
},
}
}
if (subscriptions.has(uri)) {
logger.warning(`⚠️ Already subscribed to: ${uri}`)
return {
jsonrpc: '2.0',
id: request.id,
result: {
message: `Already subscribed to ${uri}`,
},
}
}
subscriptions.add(uri)
// In a real implementation, you would:
// 1. Set up file watchers or periodic checks
// 2. Send notifications when the resource changes
// 3. Manage subscription lifecycle
const response: McpResponse = {
jsonrpc: '2.0',
id: request.id,
result: {
message: `Subscribed to ${uri}`,
},
}
logger.info(`✅ Subscribed to resource: ${uri}`)
return response
} catch (error) {
logger.error(`❌ Resource subscribe error for ${uri}:`, error)
return {
jsonrpc: '2.0',
id: request.id,
error: {
code: -32603,
message: `Failed to subscribe to resource: ${uri}`,
},
}
}
}
export function getActiveSubscriptions(): string[] {
return Array.from(subscriptions)
}