cli.js 1.8 KB

123456789101112131415161718192021222324252627282930313233
  1. /** External browser fixture; screenshots contain no host or network content. */
  2. import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs'
  3. import { createInterface } from 'node:readline'
  4. mkdirSync('.dsh', { recursive: true })
  5. const catalog = JSON.parse(readFileSync(new URL('./catalog.json', import.meta.url), 'utf8'))
  6. const png = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAADElEQVQImWNgZGIGAAAOAAeCcsnOAAAAAElFTkSuQmCC'
  7. const lines = createInterface({ input: process.stdin })
  8. lines.once('close', () => process.exit(0))
  9. lines.on('line', line => {
  10. const request = JSON.parse(line)
  11. if (request.id === undefined) return
  12. let result
  13. switch (request.method) {
  14. case 'server/discover':
  15. process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: request.id, error: { code: -32601, message: 'Legacy browser fixture' } }) + '\n')
  16. return
  17. case 'initialize':
  18. writeFileSync('.dsh/browser-fixture.started', 'chrome-devtools-mcp\n', { flag: 'wx' })
  19. process.once('exit', () => unlinkSync('.dsh/browser-fixture.started'))
  20. result = { protocolVersion: request.params.protocolVersion, capabilities: { tools: {} }, serverInfo: { name: 'browser-fixture', version: '1' } }
  21. break
  22. case 'tools/list':
  23. result = catalog
  24. break
  25. case 'tools/call':
  26. if (request.params.name !== 'take_screenshot') throw new Error(`Unexpected Chrome DevTools fixture tool: ${request.params.name}`)
  27. result = { content: [{ type: 'text', text: 'Chromium page' }, { type: 'image', mimeType: 'image/png', data: png }] }
  28. break
  29. default:
  30. throw new Error(`Unexpected Chrome DevTools fixture request: ${request.method}`)
  31. }
  32. process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: request.id, result }) + '\n')
  33. })