create-mcp-craft
Version:
Create MCP TypeScript servers with Bun and Hono - the fastest way to scaffold Model Context Protocol servers
122 lines (111 loc) • 3.71 kB
text/typescript
import type {
ResourcesReadRequest,
ResourcesReadResponse,
} from '@/types/requests.js'
import { logger } from '@/utils/logger.js'
export async function handleResourcesRead(
request: ResourcesReadRequest
): Promise<ResourcesReadResponse> {
const { uri } = request.params
logger.info(`📄 Resource read request: ${uri}`)
try {
let content: string
let mimeType: string
switch (true) {
case uri === 'config://app':
const config = {
name: 'MCP TypeScript Template',
version: '1.0.0',
environment: process.env.NODE_ENV || 'development',
features: ['tools', 'resources', 'prompts'],
transports: ['stdio', 'http+sse'],
timestamp: new Date().toISOString(),
}
content = JSON.stringify(config, null, 2)
mimeType = 'application/json'
break
case uri === 'greeting://demo':
const greetings = [
'Hello! Welcome to the MCP TypeScript Template.',
"Greetings! Hope you're having a great day.",
'Hi there! Ready to explore MCP capabilities?',
'Hey! Thanks for checking out this template.',
]
content = greetings[Math.floor(Math.random() * greetings.length)]
mimeType = 'text/plain'
break
case uri.startsWith('greeting://'):
const name = uri.replace('greeting://', '')
const personalizedGreetings = [
`Hello, ${name}! Welcome to the MCP TypeScript Template.`,
`Greetings, ${name}! Hope you're having a great day.`,
`Hi there, ${name}! Ready to explore MCP capabilities?`,
`Hey ${name}! Thanks for checking out this template.`,
]
content =
personalizedGreetings[
Math.floor(Math.random() * personalizedGreetings.length)
]
mimeType = 'text/plain'
break
case uri === 'logs://server':
const logs = [
`[${new Date().toISOString()}] [INFO] Server started successfully`,
`[${new Date(Date.now() - 1000).toISOString()}] [INFO] MCP connection established`,
`[${new Date(Date.now() - 2000).toISOString()}] [DEBUG] Capabilities negotiated`,
`[${new Date(Date.now() - 3000).toISOString()}] [INFO] Tools registered`,
`[${new Date(Date.now() - 4000).toISOString()}] [INFO] Resources registered`,
]
content = logs.join('\n')
mimeType = 'text/plain'
break
case uri === 'status://system':
const status = {
status: 'healthy',
uptime: process.uptime(),
memory: process.memoryUsage(),
version: process.version,
platform: process.platform,
timestamp: new Date().toISOString(),
}
content = JSON.stringify(status, null, 2)
mimeType = 'application/json'
break
default:
logger.error(`❌ Unknown resource: ${uri}`)
return {
jsonrpc: '2.0',
id: request.id,
error: {
code: -32601,
message: `Unknown resource: ${uri}`,
},
}
}
const response: ResourcesReadResponse = {
jsonrpc: '2.0',
id: request.id,
result: {
contents: [
{
uri,
text: content,
mimeType,
},
],
},
}
logger.info(`✅ Resource read response sent for: ${uri}`)
return response
} catch (error) {
logger.error(`❌ Resource read error for ${uri}:`, error)
return {
jsonrpc: '2.0',
id: request.id,
error: {
code: -32603,
message: `Failed to read resource: ${uri}`,
},
}
}
}