SwitchBot MCP Server
by genm
- src
#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'
import { log } from './utils/helpers.js'
import { EXAMPLE_TOOLS, EXAMPLE_HANDLERS } from './tools/example.js'
import { version } from './utils/version.js'
// Handle process events
process.on('uncaughtException', (error) => {
log('Uncaught exception:', error)
process.exit(1)
})
process.on('unhandledRejection', (error) => {
log('Unhandled rejection:', error)
process.exit(1)
})
// Combine all tools
const ALL_TOOLS = [...EXAMPLE_TOOLS]
const ALL_HANDLERS = { ...EXAMPLE_HANDLERS }
// Create server
const server = new Server(
{ name: 'mcp-server-template', version },
{ capabilities: { tools: {} } }
)
// Handle list tools request
server.setRequestHandler(ListToolsRequestSchema, async () => {
log('Received list tools request')
return { tools: ALL_TOOLS }
})
// Handle tool calls with simplified logic
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const toolName = request.params.name
log('Received tool call:', toolName)
try {
const handler = ALL_HANDLERS[toolName]
if (!handler) {
throw new Error(`Unknown tool: ${toolName}`)
}
return await handler(request)
} catch (error) {
log('Error handling tool call:', error)
return {
toolResult: {
content: [
{
type: 'text',
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
},
],
isError: true,
},
}
}
})
// Start server
export async function main() {
log('Starting server...')
try {
const transport = new StdioServerTransport()
log('Created transport')
await server.connect(transport)
log('Server connected and running')
} catch (error) {
log('Fatal error:', error)
process.exit(1)
}
}
main()