GitHub - webmachinelearning/webmcp: ๐Ÿค– WebMCP
Service

GitHub - webmachinelearning/webmcp: ๐Ÿค– WebMCP

webmachinelearning
2026.08.02
ยทGitHubยทby Mineru
#AI Agent#Client-side Tools#JavaScript#TypeScript#Web Application

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • 1WebMCP์€ ์›น ํŽ˜์ด์ง€ ๋‚ด์˜ JavaScript ํ•จ์ˆ˜๋‚˜ HTML ํผ์„ AI ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ ๋…ธ์ถœํ•˜์—ฌ, ์—์ด์ „ํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜ํ…์ธ ์™€ ๋” ์ง์ ‘์ ์ด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
  • 2์ด ๊ธฐ์ˆ ์€ ๋ณต์žกํ•œ UI๋ฅผ ์ง์ ‘ ํƒ์ƒ‰ํ•˜๋Š” ๋Œ€์‹  ๊ตฌ์กฐํ™”๋œ API๋ฅผ ํ†ตํ•ด AI์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ํ˜‘์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๊ธฐ์กด์˜ ๋ณต์žกํ•œ ์„œ๋ฒ„ ์ธก Backend Integration ๋ฐฉ์‹์ด ๊ฐ€์ง„ ์ปจํ…์ŠคํŠธ ์†์‹ค ๋ฐ UI ๋‹จ์ ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • 3๋ณด์•ˆ๊ณผ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Permissions Policy์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ํ‘œ์ค€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ธ๊ฐ„์ด ์ œ์–ด๊ถŒ์„ ์œ ์ง€ํ•˜๋Š” Human-in-the-loop ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ์˜ ์›น ๊ธฐ๋ฐ˜ ์ž‘์—… ์ˆ˜ํ–‰ ๋Šฅ๋ ฅ์„ ์ตœ์ ํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

WebMCP๋Š” AI ์—์ด์ „ํŠธ๊ฐ€ ์›น ์ฝ˜ํ…์ธ ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ํด๋ผ์ด์–ธํŠธ ์ธก ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ 'Backend integration'(์˜ˆ: Model Context Protocol, OpenAPI)์ด ์„œ๋ฒ„ ๋Œ€ ์„œ๋ฒ„ ํ†ต์‹ ์— ์˜์กดํ•˜์—ฌ UI์™€ ์ƒํƒœ ๋™๊ธฐํ™”์˜ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, WebMCP๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ง์ ‘ ์›น ํŽ˜์ด์ง€์˜ ๊ธฐ๋Šฅ๊ณผ DOM์„ AI ์—์ด์ „ํŠธ์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ๊ธฐ์ˆ ์  ๊ตฌ์กฐ

  1. Imperative Tool Registration (document.modelContext):
์›น ๊ฐœ๋ฐœ์ž๋Š” document.modelContext.registerTool() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํ•จ์ˆ˜๋ฅผ 'tool'๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํˆด์€ name, description, ๊ทธ๋ฆฌ๊ณ  JSON Schema ํ˜•์‹์˜ inputSchema๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํˆด ํ˜ธ์ถœ ๊ณผ์ •: Registration (ํŽ˜์ด์ง€๊ฐ€ ํˆด ๋“ฑ๋ก) โ†’ Discovery (์—์ด์ „ํŠธ๊ฐ€ ์Šคํ‚ค๋งˆ ํƒ์ƒ‰) โ†’ Invocation (์—์ด์ „ํŠธ๊ฐ€ ์ธ์ž์™€ ํ•จ๊ป˜ ํˆด ํ˜ธ์ถœ) โ†’ Execution (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ค‘์žฌํ•˜์—ฌ JS ์ฝœ๋ฐฑ ์‹คํ–‰) โ†’ Response (๊ฒฐ๊ณผ๋ฅผ ์—์ด์ „ํŠธ๋กœ ๋ฐ˜ํ™˜).
  1. Declarative API:
ํ‘œ์ค€ HTML <form><form> ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํˆด ์ •์˜๋ฅผ ์ž๋™ ํ•ฉ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ JS ์ž‘์„ฑ ์—†์ด๋„ ๊ธฐ์กด์˜ ์›น ํผ์„ AI๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ถŒํ•œ ๋ฐ ๋ณด์•ˆ ๋ชจ๋ธ:
    • Permissions Policy: allow="tools"allow="tools" ์†์„ฑ์„ ํ†ตํ•ด ํŠน์ • iframe์— ํˆด ๋…ธ์ถœ ๊ถŒํ•œ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
    • exposedTo: ํŠน์ • ์˜ค๋ฆฌ์ง„(origin)์—๋งŒ ํˆด์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด, ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ์—๊ฒŒ๋งŒ ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  1. ๊ธฐ์กด ์ž๋™ํ™” ๊ธฐ๋ฒ•๊ณผ์˜ ์ฐจ์ด:
๊ธฐ์กด์˜ DOM scraping์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋„๊ตฌ(Simulated user input)๊ฐ€ ๊ฐ€์ง„ ๋А๋ฆฌ๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค. WebMCP๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ์ง์ ‘ ์—์ด์ „ํŠธ์—๊ฒŒ ๊ตฌ์กฐํ™”๋œ API๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๋” ์ •๊ตํ•˜๊ณ  ์ง์ ‘์ ์ธ ์ธํ„ฐ๋ž™์…˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ํŠน์ง•

  • JavaScript ์žฌ์‚ฌ์šฉ: ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ ์ธก ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ์žฌํ™œ์šฉํ•˜์—ฌ ์—์ด์ „ํŠธ ์ „์šฉ ํˆด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Human-in-the-loop: ์‚ฌ์šฉ์ž, ์—์ด์ „ํŠธ, ๊ทธ๋ฆฌ๊ณ  ์›น UI๊ฐ€ ๊ณต์œ ๋œ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํ˜‘๋ ฅํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Service Workers ์—ฐ๋™ (์˜ˆ์ •): ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ ค ์žˆ์ง€ ์•Š์•„๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํˆด์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ณ„ํš ์ค‘์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ์ˆ ์€ ์›น ํŽ˜์ด์ง€๋ฅผ ์ผ์ข…์˜ 'in-page MCP server'๋กœ ์ „ํ™˜ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ AI ์—์ด์ „ํŠธ์™€ ํ•จ๊ป˜ ์›น ์ธํ„ฐํŽ˜์ด์Šค์ƒ์—์„œ ์ƒ์‚ฐ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.