@obov/mext 0.5.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/approval.d.ts +33 -0
  2. package/dist/approval.js +36 -0
  3. package/dist/approval.js.map +1 -0
  4. package/dist/audit.d.ts +123 -0
  5. package/dist/audit.js +221 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/build-cli.d.ts +1 -0
  8. package/dist/build-cli.js.map +1 -1
  9. package/dist/build.d.ts +2 -0
  10. package/dist/build.js +46 -5
  11. package/dist/build.js.map +1 -1
  12. package/dist/caller.d.ts +53 -0
  13. package/dist/caller.js +51 -0
  14. package/dist/caller.js.map +1 -0
  15. package/dist/cli/args.js +1 -2
  16. package/dist/cli/args.js.map +1 -1
  17. package/dist/cli/build.js +26 -4
  18. package/dist/cli/build.js.map +1 -1
  19. package/dist/cli/dev-audit.d.ts +25 -0
  20. package/dist/cli/dev-audit.js +84 -0
  21. package/dist/cli/dev-audit.js.map +1 -0
  22. package/dist/cli/dev-lock.d.ts +3 -1
  23. package/dist/cli/dev-lock.js +12 -5
  24. package/dist/cli/dev-lock.js.map +1 -1
  25. package/dist/cli/dev-server.d.ts +9 -0
  26. package/dist/cli/dev-server.js +27 -3
  27. package/dist/cli/dev-server.js.map +1 -1
  28. package/dist/cli/dev-tap.d.ts +20 -0
  29. package/dist/cli/dev-tap.js +70 -0
  30. package/dist/cli/dev-tap.js.map +1 -0
  31. package/dist/cli/dev.d.ts +6 -0
  32. package/dist/cli/dev.js +20 -8
  33. package/dist/cli/dev.js.map +1 -1
  34. package/dist/cli/help.js +2 -0
  35. package/dist/cli/help.js.map +1 -1
  36. package/dist/cli/inspect.d.ts +7 -0
  37. package/dist/cli/inspect.js +699 -0
  38. package/dist/cli/inspect.js.map +1 -0
  39. package/dist/cli/main.js +10 -0
  40. package/dist/cli/main.js.map +1 -1
  41. package/dist/cli/media.d.ts +19 -0
  42. package/dist/cli/media.js +77 -0
  43. package/dist/cli/media.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -1
  45. package/dist/cli/output.js +3 -2
  46. package/dist/cli/output.js.map +1 -1
  47. package/dist/cli/run.js +33 -4
  48. package/dist/cli/run.js.map +1 -1
  49. package/dist/cli/serve.d.ts +10 -0
  50. package/dist/cli/serve.js +114 -0
  51. package/dist/cli/serve.js.map +1 -0
  52. package/dist/cli/types.d.ts +9 -0
  53. package/dist/cli/types.js +77 -0
  54. package/dist/cli/types.js.map +1 -0
  55. package/dist/client/index.d.ts +11 -0
  56. package/dist/client/index.js +7 -0
  57. package/dist/client/index.js.map +1 -0
  58. package/dist/client/manifest.js +6 -2
  59. package/dist/client/manifest.js.map +1 -1
  60. package/dist/client/runner.js +40 -3
  61. package/dist/client/runner.js.map +1 -1
  62. package/dist/client/typed.d.ts +56 -0
  63. package/dist/client/typed.js +526 -0
  64. package/dist/client/typed.js.map +1 -0
  65. package/dist/client/types.d.ts +225 -0
  66. package/dist/client/types.js +2 -0
  67. package/dist/client/types.js.map +1 -0
  68. package/dist/command.d.ts +61 -5
  69. package/dist/command.js +42 -1
  70. package/dist/command.js.map +1 -1
  71. package/dist/config.d.ts +59 -10
  72. package/dist/config.js +67 -7
  73. package/dist/config.js.map +1 -1
  74. package/dist/content.d.ts +65 -0
  75. package/dist/content.js +99 -0
  76. package/dist/content.js.map +1 -0
  77. package/dist/errors.d.ts +21 -3
  78. package/dist/errors.js +13 -0
  79. package/dist/errors.js.map +1 -1
  80. package/dist/expose.d.ts +9 -0
  81. package/dist/expose.js +52 -0
  82. package/dist/expose.js.map +1 -0
  83. package/dist/index.d.ts +18 -7
  84. package/dist/index.js +8 -2
  85. package/dist/index.js.map +1 -1
  86. package/dist/inspect/agent.d.ts +104 -0
  87. package/dist/inspect/agent.js +125 -0
  88. package/dist/inspect/agent.js.map +1 -0
  89. package/dist/inspect/audit.d.ts +46 -0
  90. package/dist/inspect/audit.js +133 -0
  91. package/dist/inspect/audit.js.map +1 -0
  92. package/dist/inspect/compare.d.ts +12 -0
  93. package/dist/inspect/compare.js +31 -0
  94. package/dist/inspect/compare.js.map +1 -0
  95. package/dist/inspect/index.d.ts +17 -0
  96. package/dist/inspect/index.js +12 -0
  97. package/dist/inspect/index.js.map +1 -0
  98. package/dist/inspect/inspector.d.ts +168 -0
  99. package/dist/inspect/inspector.js +392 -0
  100. package/dist/inspect/inspector.js.map +1 -0
  101. package/dist/inspect/profiles.d.ts +95 -0
  102. package/dist/inspect/profiles.js +235 -0
  103. package/dist/inspect/profiles.js.map +1 -0
  104. package/dist/inspect/scenario.d.ts +126 -0
  105. package/dist/inspect/scenario.js +555 -0
  106. package/dist/inspect/scenario.js.map +1 -0
  107. package/dist/inspect/ui-server.d.ts +31 -0
  108. package/dist/inspect/ui-server.js +378 -0
  109. package/dist/inspect/ui-server.js.map +1 -0
  110. package/dist/inspect/ui.html +917 -0
  111. package/dist/instrumentation.d.ts +13 -2
  112. package/dist/instrumentation.js +11 -1
  113. package/dist/instrumentation.js.map +1 -1
  114. package/dist/invoke.d.ts +36 -5
  115. package/dist/invoke.js +162 -21
  116. package/dist/invoke.js.map +1 -1
  117. package/dist/manifest.d.ts +19 -3
  118. package/dist/manifest.js +5 -1
  119. package/dist/manifest.js.map +1 -1
  120. package/dist/mcp/constants.d.ts +7 -0
  121. package/dist/mcp/constants.js +7 -0
  122. package/dist/mcp/constants.js.map +1 -1
  123. package/dist/mcp/dispatch.d.ts +10 -4
  124. package/dist/mcp/dispatch.js +24 -7
  125. package/dist/mcp/dispatch.js.map +1 -1
  126. package/dist/mcp/help.d.ts +2 -0
  127. package/dist/mcp/help.js +6 -1
  128. package/dist/mcp/help.js.map +1 -1
  129. package/dist/mcp/host.d.ts +14 -0
  130. package/dist/mcp/host.js +48 -0
  131. package/dist/mcp/host.js.map +1 -0
  132. package/dist/mcp/http.d.ts +38 -7
  133. package/dist/mcp/http.js +199 -23
  134. package/dist/mcp/http.js.map +1 -1
  135. package/dist/mcp/index.d.ts +2 -1
  136. package/dist/mcp/index.js +2 -1
  137. package/dist/mcp/index.js.map +1 -1
  138. package/dist/mcp/server.d.ts +12 -1
  139. package/dist/mcp/server.js +63 -17
  140. package/dist/mcp/server.js.map +1 -1
  141. package/dist/mcp/stdio.d.ts +4 -0
  142. package/dist/mcp/stdio.js +3 -0
  143. package/dist/mcp/stdio.js.map +1 -1
  144. package/dist/mcp/tasks.d.ts +3 -1
  145. package/dist/mcp/tasks.js +7 -4
  146. package/dist/mcp/tasks.js.map +1 -1
  147. package/dist/principal.d.ts +22 -0
  148. package/dist/principal.js +29 -0
  149. package/dist/principal.js.map +1 -1
  150. package/dist/registry.d.ts +5 -0
  151. package/dist/registry.js +21 -0
  152. package/dist/registry.js.map +1 -1
  153. package/dist/remote/client.d.ts +26 -1
  154. package/dist/remote/client.js +180 -55
  155. package/dist/remote/client.js.map +1 -1
  156. package/dist/remote/index.d.ts +1 -1
  157. package/dist/remote/index.js.map +1 -1
  158. package/dist/remote/oauth.d.ts +1 -1
  159. package/dist/remote/oauth.js +1 -1
  160. package/dist/remote/oauth.js.map +1 -1
  161. package/dist/route.d.ts +40 -2
  162. package/dist/route.js +128 -8
  163. package/dist/route.js.map +1 -1
  164. package/dist/start.js +9 -4
  165. package/dist/start.js.map +1 -1
  166. package/dist/suggest.js +1 -1
  167. package/dist/suggest.js.map +1 -1
  168. package/dist/typegen.d.ts +27 -0
  169. package/dist/typegen.js +62 -0
  170. package/dist/typegen.js.map +1 -0
  171. package/dist/version-constant.d.ts +5 -0
  172. package/dist/version-constant.js +6 -0
  173. package/dist/version-constant.js.map +1 -0
  174. package/dist/version.d.ts +1 -2
  175. package/dist/version.js +1 -2
  176. package/dist/version.js.map +1 -1
  177. package/package.json +12 -2
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/remote/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { VERSION } from \"../version.ts\"\n\n/**\n * 원격 실행용 최소 MCP 클라이언트 (Streamable HTTP, 프로토콜 2026-07-28, stateless).\n * 요청마다 POST 1회: _meta envelope (버전 · clientInfo · clientCapabilities) + MCP-Protocol-Version · Mcp-Method ·\n * Mcp-Name · Mcp-Param-* 헤더. 응답 = application/json 또는 text/event-stream (progress 알림 → onNotification).\n * MRTR (InputRequiredResult) 재시도 루프는 callTool 의 onInputRequired 가 담당.\n * tasks 확장 (§12.6) 선언: tools/call 이 CreateTaskResult (resultType \"task\") 를 그대로 돌려주고, 폴링 · 답 · 취소 =\n * getTask · updateTask · cancelTask (Mcp-Name = taskId). 폴링 루프는 client/task.ts\n */\n\nexport const PROTOCOL_VERSION = \"2026-07-28\"\n\nexport const META_KEYS = {\n protocolVersion: \"io.modelcontextprotocol/protocolVersion\",\n clientInfo: \"io.modelcontextprotocol/clientInfo\",\n clientCapabilities: \"io.modelcontextprotocol/clientCapabilities\",\n} as const\n\n/** tasks 확장 ID (mcp/tasks.ts TASKS_EXTENSION 과 같은 값. 이 모듈은 서버 SDK 를 import 하지 않는다) */\nexport const TASKS_EXTENSION_ID = \"io.modelcontextprotocol/tasks\"\n\n/** 클라이언트가 처리하는 입력 요청 = elicitation form · url (sampling · roots 없음) + tasks 확장 (폴링 · 답 · 취소) */\nexport const CLIENT_CAPABILITIES = {\n elicitation: { form: {}, url: {} },\n extensions: { [TASKS_EXTENSION_ID]: {} },\n} as const\n\n/** MRTR 재시도 상한 (같은 요청의 input_required 연속 횟수) */\nexport const MAX_INPUT_ROUNDS = 8\n\nexport interface RemoteTool {\n name: string\n description?: string\n inputSchema?: Record<string, unknown>\n outputSchema?: Record<string, unknown>\n annotations?: Record<string, unknown>\n _meta?: Record<string, unknown>\n}\n\nexport interface CallToolResult {\n content?: unknown[]\n structuredContent?: unknown\n isError?: boolean\n [key: string]: unknown\n}\n\n/** InputRequiredResult (resultType: input_required) */\nexport interface InputRequired {\n inputRequests?: Record<string, InputRequestObject>\n requestState?: string\n}\n\nexport interface InputRequestObject {\n method: string\n params?: Record<string, unknown>\n}\n\n/** 입력 요청 key → 응답 (ElicitResult 등). 이번 라운드 요청에 대한 것만 */\nexport type InputResponses = Record<string, unknown>\n\nexport interface RequestOptions {\n signal?: AbortSignal\n /** 서버 → 클라이언트 알림 (notifications/progress 등) */\n onNotification?: (method: string, params: Record<string, unknown>) => void\n /** _meta.progressToken. 있으면 서버가 SSE 로 응답 */\n progressToken?: string | number\n}\n\nexport interface CallToolOptions extends RequestOptions {\n /** input_required 응답 처리 → 이번 라운드의 inputResponses. 없으면 RemoteInputRequiredError */\n onInputRequired?: (request: InputRequired, round: number) => Promise<InputResponses>\n}\n\n/** HTTP 401. challenge = WWW-Authenticate 파싱 결과, data = JSON-RPC error.data (mext 는 UNAUTHENTICATED toJSON) */\nexport class RemoteUnauthorizedError extends Error {\n readonly challenge: BearerChallenge\n readonly data: unknown\n constructor(message: string, challenge: BearerChallenge, data: unknown) {\n super(message)\n this.name = \"RemoteUnauthorizedError\"\n this.challenge = challenge\n this.data = data\n }\n}\n\n/** JSON-RPC 오류 응답 (HTTP 400 · 403 · 500 포함) */\nexport class RemoteRpcError extends Error {\n readonly code: number\n readonly data: unknown\n readonly status: number\n constructor(message: string, code: number, data: unknown, status: number) {\n super(message)\n this.name = \"RemoteRpcError\"\n this.code = code\n this.data = data\n this.status = status\n }\n}\n\n/** 연결 실패 · JSON-RPC 가 아닌 응답 */\nexport class RemoteTransportError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = \"RemoteTransportError\"\n }\n}\n\n/** onInputRequired 없이 input_required 를 받음 · 라운드 상한 초과 */\nexport class RemoteInputRequiredError extends Error {\n readonly request: InputRequired\n constructor(message: string, request: InputRequired) {\n super(message)\n this.name = \"RemoteInputRequiredError\"\n this.request = request\n }\n}\n\nexport interface RemoteClientOptions {\n /** MCP 엔드포인트 (http(s)://host/mcp) */\n url: string\n /** 요청마다 호출. 없으면 Authorization 헤더 없음 */\n token?: () => string | undefined | Promise<string | undefined>\n fetch?: typeof fetch\n clientInfo?: { name: string; version: string }\n}\n\n/** tools/list 전체 페이지 + 첫 페이지의 캐시 힌트 (2026-07-28 ttlMs · cacheScope) */\nexport interface ToolsListResult {\n tools: RemoteTool[]\n ttlMs?: number\n cacheScope?: string\n}\n\nexport interface RemoteClient {\n readonly url: string\n request(method: string, params?: Record<string, unknown>, options?: RequestOptions): Promise<Record<string, unknown>>\n listTools(options?: RequestOptions): Promise<RemoteTool[]>\n listToolsResult(options?: RequestOptions): Promise<ToolsListResult>\n callTool(tool: RemoteTool, args: Record<string, unknown>, options?: CallToolOptions): Promise<CallToolResult>\n /** tasks/get (Mcp-Name = taskId) */\n getTask(taskId: string, options?: RequestOptions): Promise<Record<string, unknown>>\n /** tasks/update { taskId, inputResponses } */\n updateTask(taskId: string, inputResponses: InputResponses, options?: RequestOptions): Promise<void>\n /** tasks/cancel { taskId } */\n cancelTask(taskId: string, options?: RequestOptions): Promise<void>\n}\n\nexport function createRemoteClient(options: RemoteClientOptions): RemoteClient {\n const doFetch = options.fetch ?? fetch\n const clientInfo = options.clientInfo ?? { name: \"mext\", version: VERSION }\n let nextId = 1\n\n const request = async (\n method: string,\n params: Record<string, unknown> = {},\n opts: RequestOptions = {},\n extraHeaders: Record<string, string> = {},\n ): Promise<Record<string, unknown>> => {\n const id = nextId++\n const meta: Record<string, unknown> = {\n ...(isRecord(params._meta) ? params._meta : {}),\n [META_KEYS.protocolVersion]: PROTOCOL_VERSION,\n [META_KEYS.clientInfo]: clientInfo,\n [META_KEYS.clientCapabilities]: CLIENT_CAPABILITIES,\n }\n if (opts.progressToken !== undefined) meta.progressToken = opts.progressToken\n const body = { jsonrpc: \"2.0\", id, method, params: { ...params, _meta: meta } }\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"MCP-Protocol-Version\": PROTOCOL_VERSION,\n \"Mcp-Method\": method,\n ...extraHeaders,\n }\n const token = await options.token?.()\n if (token) headers.Authorization = `Bearer ${token}`\n\n let res: Response\n try {\n res = await doFetch(options.url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...(opts.signal ? { signal: opts.signal } : {}),\n })\n } catch (error) {\n if (opts.signal?.aborted) throw error\n throw new RemoteTransportError(`Cannot reach ${options.url}: ${errorMessage(error)}`, { cause: error })\n }\n\n const type = res.headers.get(\"content-type\") ?? \"\"\n if (res.status === 401) {\n const payload = await readJson(res)\n const err = isRecord(payload) && isRecord(payload.error) ? payload.error : {}\n throw new RemoteUnauthorizedError(\n typeof err.message === \"string\" ? err.message : \"Authentication required.\",\n parseBearerChallenge(res.headers.get(\"www-authenticate\")),\n err.data,\n )\n }\n if (type.includes(\"text/event-stream\")) {\n return handleMessage(await readSse(res, id, opts), id, res.status)\n }\n const payload = await readJson(res)\n if (payload === undefined) {\n throw new RemoteTransportError(`${options.url} returned HTTP ${res.status} without a JSON-RPC response.`)\n }\n return handleMessage(payload, id, res.status)\n }\n\n const handleMessage = (message: unknown, id: number, status: number): Record<string, unknown> => {\n if (!isRecord(message)) throw new RemoteTransportError(`Invalid JSON-RPC response (HTTP ${status}).`)\n if (isRecord(message.error)) {\n const e = message.error\n throw new RemoteRpcError(\n typeof e.message === \"string\" ? e.message : \"JSON-RPC error\",\n typeof e.code === \"number\" ? e.code : -32_603,\n e.data,\n status,\n )\n }\n if (message.id !== id || !isRecord(message.result)) {\n throw new RemoteTransportError(`Invalid JSON-RPC response (HTTP ${status}).`)\n }\n return message.result\n }\n\n const listToolsResult = async (opts: RequestOptions = {}): Promise<ToolsListResult> => {\n const tools: RemoteTool[] = []\n const out: ToolsListResult = { tools }\n let cursor: string | undefined\n for (let page = 0; page < 100; page++) {\n const result = await request(\"tools/list\", cursor === undefined ? {} : { cursor }, opts)\n if (page === 0) {\n if (typeof result.ttlMs === \"number\" && Number.isFinite(result.ttlMs) && result.ttlMs >= 0) out.ttlMs = result.ttlMs\n if (typeof result.cacheScope === \"string\") out.cacheScope = result.cacheScope\n }\n if (Array.isArray(result.tools)) {\n for (const t of result.tools) if (isRecord(t) && typeof t.name === \"string\") tools.push(t as unknown as RemoteTool)\n }\n if (typeof result.nextCursor !== \"string\" || result.nextCursor === \"\") break\n cursor = result.nextCursor\n }\n return out\n }\n\n const callTool = async (\n tool: RemoteTool,\n args: Record<string, unknown>,\n opts: CallToolOptions = {},\n ): Promise<CallToolResult> => {\n const headers: Record<string, string> = { \"Mcp-Name\": tool.name, ...paramHeaders(tool, args) }\n let retry: { inputResponses?: InputResponses; requestState?: string } = {}\n for (let round = 0; ; round++) {\n const result = await request(\"tools/call\", { name: tool.name, arguments: args, ...retry }, opts, headers)\n if (result.resultType !== \"input_required\") return result as CallToolResult\n const required: InputRequired = {}\n if (isRecord(result.inputRequests)) required.inputRequests = result.inputRequests as InputRequired[\"inputRequests\"]\n if (typeof result.requestState === \"string\") required.requestState = result.requestState\n if (!opts.onInputRequired) throw new RemoteInputRequiredError(`${tool.name} requires input.`, required)\n if (round >= MAX_INPUT_ROUNDS) {\n throw new RemoteInputRequiredError(`${tool.name} still required input after ${MAX_INPUT_ROUNDS} rounds.`, required)\n }\n // 요청이 있으면 응답을 만든 뒤 재시도. requestState 는 그대로 되돌려 보내고, 없으면 보내지 않는다\n const responses = required.inputRequests ? await opts.onInputRequired(required, round) : undefined\n retry = {}\n if (responses !== undefined) retry.inputResponses = responses\n if (required.requestState !== undefined) retry.requestState = required.requestState\n }\n }\n\n /** tasks/* = Mcp-Name 헤더 = taskId (SDK 검증, 없으면 400) */\n const taskRequest = (method: string, taskId: string, params: Record<string, unknown>, opts: RequestOptions = {}) =>\n request(method, { taskId, ...params }, opts, { \"Mcp-Name\": taskId })\n\n return {\n url: options.url,\n request: (method, params, opts) => request(method, params, opts),\n listTools: async (opts) => (await listToolsResult(opts)).tools,\n listToolsResult,\n callTool,\n getTask: (taskId, opts) => taskRequest(\"tasks/get\", taskId, {}, opts),\n updateTask: async (taskId, inputResponses, opts) => {\n await taskRequest(\"tasks/update\", taskId, { inputResponses }, opts)\n },\n cancelTask: async (taskId, opts) => {\n await taskRequest(\"tasks/cancel\", taskId, {}, opts)\n },\n }\n}\n\n/** inputSchema 의 x-mcp-header 속성 → Mcp-Param-<Name> 헤더 (SEP-2243). 문자열 · 숫자 · boolean 값만 */\nfunction paramHeaders(tool: RemoteTool, args: Record<string, unknown>): Record<string, string> {\n const props = tool.inputSchema?.properties\n if (!isRecord(props)) return {}\n const out: Record<string, string> = {}\n for (const [key, schema] of Object.entries(props)) {\n if (!isRecord(schema) || typeof schema[\"x-mcp-header\"] !== \"string\") continue\n const value = args[key]\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n out[`Mcp-Param-${schema[\"x-mcp-header\"]}`] = String(value)\n }\n }\n return out\n}\n\n/* SSE */\n\n/** 응답 스트림에서 id 의 응답 메시지가 올 때까지 읽는다. 알림은 콜백, 응답 후 스트림을 닫는다 */\nasync function readSse(res: Response, id: number, opts: RequestOptions): Promise<unknown> {\n if (!res.body) throw new RemoteTransportError(\"Empty event stream.\")\n const reader = res.body.pipeThrough(new TextDecoderStream()).getReader()\n let buffer = \"\"\n let data: string[] = []\n const dispatch = (): unknown => {\n if (data.length === 0) return undefined\n const text = data.join(\"\\n\")\n data = []\n let message: unknown\n try {\n message = JSON.parse(text)\n } catch {\n return undefined\n }\n if (!isRecord(message)) return undefined\n if (typeof message.method === \"string\" && message.id === undefined) {\n try {\n opts.onNotification?.(message.method, isRecord(message.params) ? message.params : {})\n } catch {\n // 표시 오류는 응답에 영향 없음\n }\n return undefined\n }\n if (message.id === id && (\"result\" in message || \"error\" in message)) return message\n return undefined\n }\n try {\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += value\n let nl: number\n while ((nl = buffer.search(/\\r\\n|\\r|\\n/)) >= 0) {\n const line = buffer.slice(0, nl)\n buffer = buffer.slice(nl + (buffer.startsWith(\"\\r\\n\", nl) ? 2 : 1))\n if (line === \"\") {\n const found = dispatch()\n if (found !== undefined) return found\n continue\n }\n if (line.startsWith(\":\")) continue\n const colon = line.indexOf(\":\")\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? \"\" : line.slice(colon + 1)\n if (value.startsWith(\" \")) value = value.slice(1)\n if (field === \"data\") data.push(value)\n }\n }\n const found = dispatch()\n if (found !== undefined) return found\n } finally {\n await reader.cancel().catch(() => {})\n }\n if (opts.signal?.aborted) throw opts.signal.reason\n throw new RemoteTransportError(\"Event stream ended without a response.\")\n}\n\nasync function readJson(res: Response): Promise<unknown> {\n const text = await res.text().catch(() => \"\")\n if (text === \"\") return undefined\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n\n/* WWW-Authenticate */\n\nexport interface BearerChallenge {\n /** Bearer challenge 가 있었는지 */\n bearer: boolean\n error?: string\n scope?: string\n resourceMetadata?: string\n}\n\n/** WWW-Authenticate 의 Bearer challenge 파라미터 (RFC 6750 · RFC 9728 resource_metadata) */\nexport function parseBearerChallenge(header: string | null): BearerChallenge {\n if (!header) return { bearer: false }\n const m = /(?:^|,\\s*)Bearer\\b(.*)$/i.exec(header)\n if (!m) return { bearer: false }\n const params: Record<string, string> = {}\n const re = /([A-Za-z_][\\w-]*)\\s*=\\s*(?:\"((?:[^\"\\\\]|\\\\.)*)\"|([^\\s,]+))/g\n for (let p = re.exec(m[1]!); p !== null; p = re.exec(m[1]!)) {\n params[p[1]!.toLowerCase()] = p[2] !== undefined ? p[2].replace(/\\\\(.)/g, \"$1\") : p[3]!\n }\n const out: BearerChallenge = { bearer: true }\n if (params.error !== undefined) out.error = params.error\n if (params.scope !== undefined) out.scope = params.scope\n if (params.resource_metadata !== undefined) out.resourceMetadata = params.resource_metadata\n return out\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n const cause = (error as { cause?: unknown }).cause\n return cause instanceof Error && cause.message ? cause.message : error.message\n }\n return String(error)\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/remote/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { VERSION } from \"../version-constant.ts\"\n\n/**\n * 원격 실행용 최소 MCP 클라이언트 (Streamable HTTP, 프로토콜 2026-07-28, stateless).\n * 요청마다 POST 1회: _meta envelope (버전 · clientInfo · clientCapabilities) + MCP-Protocol-Version · Mcp-Method ·\n * Mcp-Name · Mcp-Param-* 헤더. 응답 = application/json 또는 text/event-stream (progress 알림 → onNotification).\n * MRTR (InputRequiredResult) 재시도 루프는 callTool 의 onInputRequired 가 담당.\n * tasks 확장 (§12.6) 선언: tools/call 이 CreateTaskResult (resultType \"task\") 를 그대로 돌려주고, 폴링 · 답 · 취소 =\n * getTask · updateTask · cancelTask (Mcp-Name = taskId). 폴링 루프는 client/task.ts.\n * subscriptions/listen (mext.md §12.5) = listen: 응답 SSE 를 ack 뒤에도 계속 읽는다 (타입 client subscribe)\n */\n\nexport const PROTOCOL_VERSION = \"2026-07-28\"\n\nexport const META_KEYS = {\n protocolVersion: \"io.modelcontextprotocol/protocolVersion\",\n clientInfo: \"io.modelcontextprotocol/clientInfo\",\n clientCapabilities: \"io.modelcontextprotocol/clientCapabilities\",\n} as const\n\n/** tasks 확장 ID (mcp/tasks.ts TASKS_EXTENSION 과 같은 값. 이 모듈은 서버 SDK 를 import 하지 않는다) */\nexport const TASKS_EXTENSION_ID = \"io.modelcontextprotocol/tasks\"\n\n/** 클라이언트가 처리하는 입력 요청 = elicitation form · url (sampling · roots 없음) + tasks 확장 (폴링 · 답 · 취소) */\nexport const CLIENT_CAPABILITIES = {\n elicitation: { form: {}, url: {} },\n extensions: { [TASKS_EXTENSION_ID]: {} },\n} as const\n\n/** MRTR 재시도 상한 (같은 요청의 input_required 연속 횟수) */\nexport const MAX_INPUT_ROUNDS = 8\n\nexport interface RemoteTool {\n name: string\n description?: string\n inputSchema?: Record<string, unknown>\n outputSchema?: Record<string, unknown>\n annotations?: Record<string, unknown>\n _meta?: Record<string, unknown>\n}\n\nexport interface CallToolResult {\n content?: unknown[]\n structuredContent?: unknown\n isError?: boolean\n [key: string]: unknown\n}\n\n/** InputRequiredResult (resultType: input_required) */\nexport interface InputRequired {\n inputRequests?: Record<string, InputRequestObject>\n requestState?: string\n}\n\nexport interface InputRequestObject {\n method: string\n params?: Record<string, unknown>\n}\n\n/** 입력 요청 key → 응답 (ElicitResult 등). 이번 라운드 요청에 대한 것만 */\nexport type InputResponses = Record<string, unknown>\n\nexport interface RequestOptions {\n signal?: AbortSignal\n /** 서버 → 클라이언트 알림 (notifications/progress 등) */\n onNotification?: (method: string, params: Record<string, unknown>) => void\n /** _meta.progressToken. 있으면 서버가 SSE 로 응답 */\n progressToken?: string | number\n}\n\nexport interface CallToolOptions extends RequestOptions {\n /** input_required 응답 처리 → 이번 라운드의 inputResponses. 없으면 RemoteInputRequiredError */\n onInputRequired?: (request: InputRequired, round: number) => Promise<InputResponses>\n /** tools/call 요청 params._meta 에 실을 값 (예: 확인 표시 \"dev.mext/approval\"). 재시도 라운드에도 같은 값 */\n meta?: Record<string, unknown>\n}\n\n/** HTTP 401. challenge = WWW-Authenticate 파싱 결과, data = JSON-RPC error.data (mext 는 UNAUTHENTICATED toJSON) */\nexport class RemoteUnauthorizedError extends Error {\n readonly challenge: BearerChallenge\n readonly data: unknown\n constructor(message: string, challenge: BearerChallenge, data: unknown) {\n super(message)\n this.name = \"RemoteUnauthorizedError\"\n this.challenge = challenge\n this.data = data\n }\n}\n\n/** JSON-RPC 오류 응답 (HTTP 400 · 403 · 500 포함) */\nexport class RemoteRpcError extends Error {\n readonly code: number\n readonly data: unknown\n readonly status: number\n constructor(message: string, code: number, data: unknown, status: number) {\n super(message)\n this.name = \"RemoteRpcError\"\n this.code = code\n this.data = data\n this.status = status\n }\n}\n\n/** 연결 실패 · JSON-RPC 가 아닌 응답 */\nexport class RemoteTransportError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = \"RemoteTransportError\"\n }\n}\n\n/** onInputRequired 없이 input_required 를 받음 · 라운드 상한 초과 */\nexport class RemoteInputRequiredError extends Error {\n readonly request: InputRequired\n constructor(message: string, request: InputRequired) {\n super(message)\n this.name = \"RemoteInputRequiredError\"\n this.request = request\n }\n}\n\nexport interface RemoteClientOptions {\n /** MCP 엔드포인트 (http(s)://host/mcp) */\n url: string\n /** 요청마다 호출. 없으면 Authorization 헤더 없음 */\n token?: () => string | undefined | Promise<string | undefined>\n fetch?: typeof fetch\n clientInfo?: { name: string; version: string }\n}\n\n/** tools/list 전체 페이지 + 첫 페이지의 캐시 힌트 (2026-07-28 ttlMs · cacheScope) */\nexport interface ToolsListResult {\n tools: RemoteTool[]\n ttlMs?: number\n cacheScope?: string\n}\n\n/** subscriptions/listen 스트림 종료. client = close · signal, server = 완료 result · 스트림 끝, error = 연결 오류 · JSON-RPC 오류 */\nexport type ListenEnd = { reason: \"client\" } | { reason: \"server\" } | { reason: \"error\"; error: unknown }\n\n/** ack 를 받은 subscriptions/listen 스트림 */\nexport interface RemoteListen {\n /** ack (notifications/subscriptions/acknowledged) 의 notifications. ack 없이 완료 = {} */\n readonly acknowledged: Record<string, unknown>\n /** 스트림 종료 (reject 하지 않는다) */\n readonly done: Promise<ListenEnd>\n close(): void\n}\n\nexport interface RemoteClient {\n readonly url: string\n request(method: string, params?: Record<string, unknown>, options?: RequestOptions): Promise<Record<string, unknown>>\n /**\n * subscriptions/listen. ack 까지 기다린 뒤 스트림을 계속 읽는다 (알림 = onNotification).\n * ack 전 실패 = reject (401 · JSON-RPC 오류 · 연결 실패 · ack 전 abort = signal.reason)\n */\n listen(notifications: Record<string, unknown>, options?: RequestOptions): Promise<RemoteListen>\n listTools(options?: RequestOptions): Promise<RemoteTool[]>\n listToolsResult(options?: RequestOptions): Promise<ToolsListResult>\n callTool(tool: RemoteTool, args: Record<string, unknown>, options?: CallToolOptions): Promise<CallToolResult>\n /** tasks/get (Mcp-Name = taskId) */\n getTask(taskId: string, options?: RequestOptions): Promise<Record<string, unknown>>\n /** tasks/update { taskId, inputResponses } */\n updateTask(taskId: string, inputResponses: InputResponses, options?: RequestOptions): Promise<void>\n /** tasks/cancel { taskId } */\n cancelTask(taskId: string, options?: RequestOptions): Promise<void>\n}\n\nexport function createRemoteClient(options: RemoteClientOptions): RemoteClient {\n const doFetch = options.fetch ?? fetch\n const clientInfo = options.clientInfo ?? { name: \"mext\", version: VERSION }\n let nextId = 1\n\n /** POST 1회. 401 = RemoteUnauthorizedError. 응답 본문은 호출자가 읽는다 */\n const send = async (\n method: string,\n params: Record<string, unknown>,\n opts: RequestOptions,\n extraHeaders: Record<string, string>,\n ): Promise<{ res: Response; id: number }> => {\n const id = nextId++\n const meta: Record<string, unknown> = {\n ...(isRecord(params._meta) ? params._meta : {}),\n [META_KEYS.protocolVersion]: PROTOCOL_VERSION,\n [META_KEYS.clientInfo]: clientInfo,\n [META_KEYS.clientCapabilities]: CLIENT_CAPABILITIES,\n }\n if (opts.progressToken !== undefined) meta.progressToken = opts.progressToken\n const body = { jsonrpc: \"2.0\", id, method, params: { ...params, _meta: meta } }\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"MCP-Protocol-Version\": PROTOCOL_VERSION,\n \"Mcp-Method\": method,\n ...extraHeaders,\n }\n const token = await options.token?.()\n if (token) headers.Authorization = `Bearer ${token}`\n\n let res: Response\n try {\n res = await doFetch(options.url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...(opts.signal ? { signal: opts.signal } : {}),\n })\n } catch (error) {\n if (opts.signal?.aborted) throw error\n throw new RemoteTransportError(`Cannot reach ${options.url}: ${errorMessage(error)}`, { cause: error })\n }\n\n if (res.status === 401) {\n const payload = await readJson(res)\n const err = isRecord(payload) && isRecord(payload.error) ? payload.error : {}\n throw new RemoteUnauthorizedError(\n typeof err.message === \"string\" ? err.message : \"Authentication required.\",\n parseBearerChallenge(res.headers.get(\"www-authenticate\")),\n err.data,\n )\n }\n return { res, id }\n }\n\n const request = async (\n method: string,\n params: Record<string, unknown> = {},\n opts: RequestOptions = {},\n extraHeaders: Record<string, string> = {},\n ): Promise<Record<string, unknown>> => {\n const { res, id } = await send(method, params, opts, extraHeaders)\n if (isEventStream(res)) {\n return handleMessage(await readSse(res, id, opts), id, res.status)\n }\n return handleMessage(await jsonMessage(res), id, res.status)\n }\n\n const jsonMessage = async (res: Response): Promise<unknown> => {\n const payload = await readJson(res)\n if (payload === undefined) {\n throw new RemoteTransportError(`${options.url} returned HTTP ${res.status} without a JSON-RPC response.`)\n }\n return payload\n }\n\n const listen = async (notifications: Record<string, unknown>, opts: RequestOptions = {}): Promise<RemoteListen> => {\n const { signal } = opts\n signal?.throwIfAborted()\n const { res, id } = await send(\"subscriptions/listen\", { notifications }, opts, {})\n if (!isEventStream(res)) {\n // JSON 응답 = 오류 (handleMessage 가 던진다) 또는 ack 없는 완료\n handleMessage(await jsonMessage(res), id, res.status)\n return { acknowledged: {}, done: Promise.resolve({ reason: \"server\" }), close() {} }\n }\n const stream = sseStream(res)\n let closed = false\n const close = (): void => {\n if (closed) return\n closed = true\n void stream.cancel()\n }\n signal?.addEventListener(\"abort\", close, { once: true })\n const notify = (message: Record<string, unknown>): void => {\n try {\n opts.onNotification?.(message.method as string, isRecord(message.params) ? message.params : {})\n } catch {\n // 수신자 예외는 스트림에 영향 없음\n }\n }\n\n // ack 까지. 그 전의 완료 result = ack 없는 완료, 오류 = reject\n let acknowledged: Record<string, unknown> | undefined\n try {\n while (acknowledged === undefined) {\n const message = await stream.next()\n if (message === undefined) throw new RemoteTransportError(\"Event stream ended before subscriptions/listen was acknowledged.\")\n if (message.method === \"notifications/subscriptions/acknowledged\") {\n const params = isRecord(message.params) ? message.params : {}\n acknowledged = isRecord(params.notifications) ? params.notifications : {}\n } else if (isNotification(message)) notify(message)\n else if (message.id === id) {\n handleMessage(message, id, res.status)\n signal?.removeEventListener(\"abort\", close)\n await stream.cancel()\n return { acknowledged: {}, done: Promise.resolve({ reason: \"server\" }), close() {} }\n }\n }\n } catch (error) {\n signal?.removeEventListener(\"abort\", close)\n await stream.cancel()\n if (signal?.aborted) throw signal.reason\n throw error\n }\n\n const done = (async (): Promise<ListenEnd> => {\n try {\n for (;;) {\n let message: Record<string, unknown> | undefined\n try {\n message = await stream.next()\n } catch (error) {\n return closed ? { reason: \"client\" } : { reason: \"error\", error }\n }\n if (closed) return { reason: \"client\" }\n if (message === undefined) return { reason: \"server\" }\n if (isNotification(message)) notify(message)\n else if (message.id === id) {\n try {\n handleMessage(message, id, res.status)\n return { reason: \"server\" }\n } catch (error) {\n return { reason: \"error\", error }\n }\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", close)\n await stream.cancel()\n }\n })()\n return { acknowledged, done, close }\n }\n\n const handleMessage = (message: unknown, id: number, status: number): Record<string, unknown> => {\n if (!isRecord(message)) throw new RemoteTransportError(`Invalid JSON-RPC response (HTTP ${status}).`)\n if (isRecord(message.error)) {\n const e = message.error\n throw new RemoteRpcError(\n typeof e.message === \"string\" ? e.message : \"JSON-RPC error\",\n typeof e.code === \"number\" ? e.code : -32_603,\n e.data,\n status,\n )\n }\n if (message.id !== id || !isRecord(message.result)) {\n throw new RemoteTransportError(`Invalid JSON-RPC response (HTTP ${status}).`)\n }\n return message.result\n }\n\n const listToolsResult = async (opts: RequestOptions = {}): Promise<ToolsListResult> => {\n const tools: RemoteTool[] = []\n const out: ToolsListResult = { tools }\n let cursor: string | undefined\n for (let page = 0; page < 100; page++) {\n const result = await request(\"tools/list\", cursor === undefined ? {} : { cursor }, opts)\n if (page === 0) {\n if (typeof result.ttlMs === \"number\" && Number.isFinite(result.ttlMs) && result.ttlMs >= 0) out.ttlMs = result.ttlMs\n if (typeof result.cacheScope === \"string\") out.cacheScope = result.cacheScope\n }\n if (Array.isArray(result.tools)) {\n for (const t of result.tools) if (isRecord(t) && typeof t.name === \"string\") tools.push(t as unknown as RemoteTool)\n }\n if (typeof result.nextCursor !== \"string\" || result.nextCursor === \"\") break\n cursor = result.nextCursor\n }\n return out\n }\n\n const callTool = async (\n tool: RemoteTool,\n args: Record<string, unknown>,\n opts: CallToolOptions = {},\n ): Promise<CallToolResult> => {\n const headers: Record<string, string> = { \"Mcp-Name\": tool.name, ...paramHeaders(tool, args) }\n let retry: { inputResponses?: InputResponses; requestState?: string } = {}\n const meta = opts.meta ? { _meta: opts.meta } : {}\n for (let round = 0; ; round++) {\n const result = await request(\"tools/call\", { name: tool.name, arguments: args, ...retry, ...meta }, opts, headers)\n if (result.resultType !== \"input_required\") return result as CallToolResult\n const required: InputRequired = {}\n if (isRecord(result.inputRequests)) required.inputRequests = result.inputRequests as InputRequired[\"inputRequests\"]\n if (typeof result.requestState === \"string\") required.requestState = result.requestState\n if (!opts.onInputRequired) throw new RemoteInputRequiredError(`${tool.name} requires input.`, required)\n if (round >= MAX_INPUT_ROUNDS) {\n throw new RemoteInputRequiredError(`${tool.name} still required input after ${MAX_INPUT_ROUNDS} rounds.`, required)\n }\n // 요청이 있으면 응답을 만든 뒤 재시도. requestState 는 그대로 되돌려 보내고, 없으면 보내지 않는다\n const responses = required.inputRequests ? await opts.onInputRequired(required, round) : undefined\n retry = {}\n if (responses !== undefined) retry.inputResponses = responses\n if (required.requestState !== undefined) retry.requestState = required.requestState\n }\n }\n\n /** tasks/* = Mcp-Name 헤더 = taskId (SDK 검증, 없으면 400) */\n const taskRequest = (method: string, taskId: string, params: Record<string, unknown>, opts: RequestOptions = {}) =>\n request(method, { taskId, ...params }, opts, { \"Mcp-Name\": taskId })\n\n return {\n url: options.url,\n request: (method, params, opts) => request(method, params, opts),\n listen,\n listTools: async (opts) => (await listToolsResult(opts)).tools,\n listToolsResult,\n callTool,\n getTask: (taskId, opts) => taskRequest(\"tasks/get\", taskId, {}, opts),\n updateTask: async (taskId, inputResponses, opts) => {\n await taskRequest(\"tasks/update\", taskId, { inputResponses }, opts)\n },\n cancelTask: async (taskId, opts) => {\n await taskRequest(\"tasks/cancel\", taskId, {}, opts)\n },\n }\n}\n\n/** inputSchema 의 x-mcp-header 속성 → Mcp-Param-<Name> 헤더 (SEP-2243). 문자열 · 숫자 · boolean 값만 */\nfunction paramHeaders(tool: RemoteTool, args: Record<string, unknown>): Record<string, string> {\n const props = tool.inputSchema?.properties\n if (!isRecord(props)) return {}\n const out: Record<string, string> = {}\n for (const [key, schema] of Object.entries(props)) {\n if (!isRecord(schema) || typeof schema[\"x-mcp-header\"] !== \"string\") continue\n const value = args[key]\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n out[`Mcp-Param-${schema[\"x-mcp-header\"]}`] = String(value)\n }\n }\n return out\n}\n\n/* SSE */\n\nfunction isEventStream(res: Response): boolean {\n return (res.headers.get(\"content-type\") ?? \"\").includes(\"text/event-stream\")\n}\n\nfunction isNotification(message: Record<string, unknown>): boolean {\n return typeof message.method === \"string\" && message.id === undefined\n}\n\n/** 응답 스트림에서 id 의 응답 메시지가 올 때까지 읽는다. 알림은 콜백, 응답 후 스트림을 닫는다 */\nasync function readSse(res: Response, id: number, opts: RequestOptions): Promise<unknown> {\n const stream = sseStream(res)\n try {\n for (let message = await stream.next(); message !== undefined; message = await stream.next()) {\n if (isNotification(message)) {\n try {\n opts.onNotification?.(message.method as string, isRecord(message.params) ? message.params : {})\n } catch {\n // 표시 오류는 응답에 영향 없음\n }\n continue\n }\n if (message.id === id && (\"result\" in message || \"error\" in message)) return message\n }\n } finally {\n await stream.cancel()\n }\n if (opts.signal?.aborted) throw opts.signal.reason\n throw new RemoteTransportError(\"Event stream ended without a response.\")\n}\n\ninterface SseStream {\n /** 다음 JSON 객체 메시지 (data 이벤트 1개, JSON 이 아닌 data 는 건너뛴다). 끝 = undefined */\n next(): Promise<Record<string, unknown> | undefined>\n /** 읽기 중단 (진행 중 next = undefined). 여러 번 불러도 된다 */\n cancel(): Promise<void>\n}\n\nfunction sseStream(res: Response): SseStream {\n if (!res.body) throw new RemoteTransportError(\"Empty event stream.\")\n const reader = res.body.pipeThrough(new TextDecoderStream()).getReader()\n let buffer = \"\"\n let data: string[] = []\n let ended = false\n const dispatch = (): Record<string, unknown> | undefined => {\n if (data.length === 0) return undefined\n const text = data.join(\"\\n\")\n data = []\n try {\n const message: unknown = JSON.parse(text)\n return isRecord(message) ? message : undefined\n } catch {\n return undefined\n }\n }\n /** buffer 의 완성된 줄을 처리. 이벤트 경계에서 메시지가 나오면 그 메시지 */\n const drain = (): Record<string, unknown> | undefined => {\n let nl: number\n while ((nl = buffer.search(/\\r\\n|\\r|\\n/)) >= 0) {\n const line = buffer.slice(0, nl)\n buffer = buffer.slice(nl + (buffer.startsWith(\"\\r\\n\", nl) ? 2 : 1))\n if (line === \"\") {\n const found = dispatch()\n if (found !== undefined) return found\n continue\n }\n if (line.startsWith(\":\")) continue\n const colon = line.indexOf(\":\")\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? \"\" : line.slice(colon + 1)\n if (value.startsWith(\" \")) value = value.slice(1)\n if (field === \"data\") data.push(value)\n }\n return undefined\n }\n return {\n async next() {\n for (;;) {\n const found = drain()\n if (found !== undefined) return found\n if (ended) return undefined\n const { done, value } = await reader.read()\n if (done) {\n ended = true\n return dispatch()\n }\n buffer += value\n }\n },\n async cancel() {\n ended = true\n buffer = \"\"\n data = []\n await reader.cancel().catch(() => {})\n },\n }\n}\n\nasync function readJson(res: Response): Promise<unknown> {\n const text = await res.text().catch(() => \"\")\n if (text === \"\") return undefined\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n\n/* WWW-Authenticate */\n\nexport interface BearerChallenge {\n /** Bearer challenge 가 있었는지 */\n bearer: boolean\n error?: string\n scope?: string\n resourceMetadata?: string\n}\n\n/** WWW-Authenticate 의 Bearer challenge 파라미터 (RFC 6750 · RFC 9728 resource_metadata) */\nexport function parseBearerChallenge(header: string | null): BearerChallenge {\n if (!header) return { bearer: false }\n const m = /(?:^|,\\s*)Bearer\\b(.*)$/i.exec(header)\n if (!m) return { bearer: false }\n const params: Record<string, string> = {}\n const re = /([A-Za-z_][\\w-]*)\\s*=\\s*(?:\"((?:[^\"\\\\]|\\\\.)*)\"|([^\\s,]+))/g\n for (let p = re.exec(m[1]!); p !== null; p = re.exec(m[1]!)) {\n params[p[1]!.toLowerCase()] = p[2] !== undefined ? p[2].replace(/\\\\(.)/g, \"$1\") : p[3]!\n }\n const out: BearerChallenge = { bearer: true }\n if (params.error !== undefined) out.error = params.error\n if (params.scope !== undefined) out.scope = params.scope\n if (params.resource_metadata !== undefined) out.resourceMetadata = params.resource_metadata\n return out\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) {\n const cause = (error as { cause?: unknown }).cause\n return cause instanceof Error && cause.message ? cause.message : error.message\n }\n return String(error)\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export { CLIENT_CAPABILITIES, createRemoteClient, MAX_INPUT_ROUNDS, parseBearerChallenge, PROTOCOL_VERSION, RemoteInputRequiredError, RemoteRpcError, RemoteTransportError, RemoteUnauthorizedError, } from "./client.ts";
2
- export type { BearerChallenge, CallToolOptions, CallToolResult, InputRequestObject, InputRequired, InputResponses, RemoteClient, RemoteClientOptions, RemoteTool, ToolsListResult, RequestOptions, } from "./client.ts";
2
+ export type { BearerChallenge, CallToolOptions, CallToolResult, InputRequestObject, InputRequired, InputResponses, ListenEnd, RemoteClient, RemoteListen, RemoteClientOptions, RemoteTool, ToolsListResult, RequestOptions, } from "./client.ts";
3
3
  export { browserDecision, systemBrowserOpener } from "./browser.ts";
4
4
  export type { BrowserDecision, BrowserOpener } from "./browser.ts";
5
5
  export { canonicalServerUrl, credentialStore, envFlag, envPrefix, fileStore } from "./credentials.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/remote/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAcpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAErG,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,iBAAiB,EACjB,WAAW,EACX,2BAA2B,EAC3B,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,EACL,cAAc,EACd,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAA","sourcesContent":["export {\n CLIENT_CAPABILITIES,\n createRemoteClient,\n MAX_INPUT_ROUNDS,\n parseBearerChallenge,\n PROTOCOL_VERSION,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n} from \"./client.ts\"\nexport type {\n BearerChallenge,\n CallToolOptions,\n CallToolResult,\n InputRequestObject,\n InputRequired,\n InputResponses,\n RemoteClient,\n RemoteClientOptions,\n RemoteTool,\n ToolsListResult,\n RequestOptions,\n} from \"./client.ts\"\nexport { browserDecision, systemBrowserOpener } from \"./browser.ts\"\nexport type { BrowserDecision, BrowserOpener } from \"./browser.ts\"\nexport { canonicalServerUrl, credentialStore, envFlag, envPrefix, fileStore } from \"./credentials.ts\"\nexport type { CredentialStore, CredentialStoreOptions, StoredCredentials } from \"./credentials.ts\"\nexport {\n authorizationCodeLogin,\n authorizationServerMetadataUrls,\n DEVICE_CODE_GRANT,\n deviceLogin,\n discoverAuthorizationServer,\n discoverLoginTarget,\n discoverProtectedResource,\n login,\n OAuthFlowError,\n parseRedirectUrl,\n protectedResourceMetadataUrls,\n refreshCredentials,\n revokeCredentials,\n} from \"./oauth.ts\"\nexport type {\n AuthorizationCodeLoginOptions,\n AuthorizationServerMetadata,\n DeviceAuthorization,\n DeviceLoginOptions,\n DiscoverLoginOptions,\n LoginOptions,\n LoginTarget,\n ProtectedResourceMetadata,\n RevokeResult,\n} from \"./oauth.ts\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/remote/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAgBpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEnE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAErG,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,iBAAiB,EACjB,WAAW,EACX,2BAA2B,EAC3B,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,EACL,cAAc,EACd,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAA","sourcesContent":["export {\n CLIENT_CAPABILITIES,\n createRemoteClient,\n MAX_INPUT_ROUNDS,\n parseBearerChallenge,\n PROTOCOL_VERSION,\n RemoteInputRequiredError,\n RemoteRpcError,\n RemoteTransportError,\n RemoteUnauthorizedError,\n} from \"./client.ts\"\nexport type {\n BearerChallenge,\n CallToolOptions,\n CallToolResult,\n InputRequestObject,\n InputRequired,\n InputResponses,\n ListenEnd,\n RemoteClient,\n RemoteListen,\n RemoteClientOptions,\n RemoteTool,\n ToolsListResult,\n RequestOptions,\n} from \"./client.ts\"\nexport { browserDecision, systemBrowserOpener } from \"./browser.ts\"\nexport type { BrowserDecision, BrowserOpener } from \"./browser.ts\"\nexport { canonicalServerUrl, credentialStore, envFlag, envPrefix, fileStore } from \"./credentials.ts\"\nexport type { CredentialStore, CredentialStoreOptions, StoredCredentials } from \"./credentials.ts\"\nexport {\n authorizationCodeLogin,\n authorizationServerMetadataUrls,\n DEVICE_CODE_GRANT,\n deviceLogin,\n discoverAuthorizationServer,\n discoverLoginTarget,\n discoverProtectedResource,\n login,\n OAuthFlowError,\n parseRedirectUrl,\n protectedResourceMetadataUrls,\n refreshCredentials,\n revokeCredentials,\n} from \"./oauth.ts\"\nexport type {\n AuthorizationCodeLoginOptions,\n AuthorizationServerMetadata,\n DeviceAuthorization,\n DeviceLoginOptions,\n DiscoverLoginOptions,\n LoginOptions,\n LoginTarget,\n ProtectedResourceMetadata,\n RevokeResult,\n} from \"./oauth.ts\"\n"]}
@@ -162,7 +162,7 @@ export interface DeviceLoginOptions {
162
162
  signal?: AbortSignal;
163
163
  fetch?: Fetch;
164
164
  /** polling 대기 (테스트 주입). 기본 setTimeout */
165
- sleep?(ms: number, signal?: AbortSignal): Promise<void>;
165
+ sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
166
166
  /** 사용자 코드 준비됨 (안내 출력 · 브라우저 열기) */
167
167
  onDeviceCode(device: DeviceAuthorization): void;
168
168
  }
@@ -91,7 +91,7 @@ export const DEVICE_CODE_GRANT = "urn:ietf:params:oauth:grant-type:device_code";
91
91
  */
92
92
  export async function registerClient(as, options, doFetch = fetch) {
93
93
  if (options.clientId !== undefined) {
94
- if (/^https:\/\//.test(options.clientId) && as.client_id_metadata_document_supported !== true) {
94
+ if (options.clientId.startsWith("https://") && as.client_id_metadata_document_supported !== true) {
95
95
  throw new OAuthFlowError(`${as.issuer} does not support Client ID Metadata Documents (client_id ${options.clientId}).`);
96
96
  }
97
97
  return { client_id: options.clientId, token_endpoint_auth_method: "none" };
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/remote/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\"\nimport { createServer, type Server } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport { setTimeout as delay } from \"node:timers/promises\"\nimport type { BearerChallenge } from \"./client.ts\"\nimport { canonicalServerUrl, type StoredCredentials } from \"./credentials.ts\"\n\n/**\n * MCP authorization (2026-07-28) 클라이언트 쪽: OAuth 2.1 authorization code + PKCE (S256) + loopback redirect.\n * 보호 자원 메타데이터 (RFC 9728: WWW-Authenticate resource_metadata → 경로 삽입 well-known → 루트) →\n * 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery, issuer 일치 검증) → 클라이언트 등록 (사전 등록 client_id ·\n * Client ID Metadata Document URL · RFC 7591 동적 등록) → 인가 요청 (resource = RFC 8707) → iss 검증 (RFC 9207) →\n * 토큰 교환. refresh_token 갱신.\n * headless: redirect URL 붙여넣기 (loopback 과 먼저 온 쪽) · device authorization grant (RFC 8628, 인가 서버 메타데이터에\n * device_authorization_endpoint 가 있을 때만. MCP 사양 밖). logout = token revocation (RFC 7009).\n */\n\nexport class OAuthFlowError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"OAuthFlowError\"\n }\n}\n\nexport interface ProtectedResourceMetadata {\n resource?: string\n authorization_servers: string[]\n scopes_supported?: string[]\n [key: string]: unknown\n}\n\nexport interface AuthorizationServerMetadata {\n issuer: string\n authorization_endpoint: string\n token_endpoint: string\n registration_endpoint?: string\n code_challenge_methods_supported?: string[]\n scopes_supported?: string[]\n authorization_response_iss_parameter_supported?: boolean\n client_id_metadata_document_supported?: boolean\n /** RFC 8628 */\n device_authorization_endpoint?: string\n /** RFC 7009 */\n revocation_endpoint?: string\n [key: string]: unknown\n}\n\ntype Fetch = typeof fetch\n\n/* 보호 자원 메타데이터 (RFC 9728) */\n\n/** 보호 자원 메타데이터 후보 URL: challenge 의 resource_metadata, 없으면 경로 삽입 well-known → 루트 well-known */\nexport function protectedResourceMetadataUrls(serverUrl: string, challenge?: BearerChallenge): string[] {\n if (challenge?.resourceMetadata) return [challenge.resourceMetadata]\n const u = new URL(serverUrl)\n const path = u.pathname.replace(/\\/$/, \"\")\n const urls: string[] = []\n if (path !== \"\") urls.push(`${u.origin}/.well-known/oauth-protected-resource${path}`)\n urls.push(`${u.origin}/.well-known/oauth-protected-resource`)\n return urls\n}\n\nexport async function discoverProtectedResource(\n serverUrl: string,\n challenge: BearerChallenge | undefined,\n doFetch: Fetch = fetch,\n): Promise<ProtectedResourceMetadata> {\n const canonical = canonicalServerUrl(serverUrl)\n for (const url of protectedResourceMetadataUrls(serverUrl, challenge)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n const servers = doc.authorization_servers\n if (!Array.isArray(servers) || servers.length === 0 || !servers.every((s) => typeof s === \"string\")) {\n throw new OAuthFlowError(`${url}: protected resource metadata has no authorization_servers.`)\n }\n if (typeof doc.resource === \"string\") {\n const resource = canonicalServerUrl(doc.resource)\n if (resource !== canonical && resource !== new URL(canonical).origin) {\n throw new OAuthFlowError(`${url}: resource ${doc.resource} does not match ${canonical}.`)\n }\n }\n return doc as ProtectedResourceMetadata\n }\n throw new OAuthFlowError(\n `${serverUrl} does not publish OAuth protected resource metadata (/.well-known/oauth-protected-resource). ` +\n \"Use an API key (MEXT_TOKEN) instead.\",\n )\n}\n\n/* 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery) */\n\n/** issuer → 메타데이터 후보 URL (MCP authorization-server-discovery 순서) */\nexport function authorizationServerMetadataUrls(issuer: string): string[] {\n const u = new URL(issuer)\n const path = u.pathname.replace(/\\/$/, \"\")\n if (path === \"\") {\n return [`${u.origin}/.well-known/oauth-authorization-server`, `${u.origin}/.well-known/openid-configuration`]\n }\n return [\n `${u.origin}/.well-known/oauth-authorization-server${path}`,\n `${u.origin}/.well-known/openid-configuration${path}`,\n `${u.origin}${path}/.well-known/openid-configuration`,\n ]\n}\n\nexport async function discoverAuthorizationServer(issuer: string, doFetch: Fetch = fetch): Promise<AuthorizationServerMetadata> {\n for (const url of authorizationServerMetadataUrls(issuer)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n // issuer 는 메타데이터 URL 을 만든 값과 정확히 같아야 한다 (다르면 사용 금지)\n if (doc.issuer !== issuer) throw new OAuthFlowError(`${url}: issuer ${String(doc.issuer)} does not match ${issuer}.`)\n if (typeof doc.authorization_endpoint !== \"string\" || typeof doc.token_endpoint !== \"string\") {\n throw new OAuthFlowError(`${url}: authorization_endpoint and token_endpoint are required.`)\n }\n const methods = doc.code_challenge_methods_supported\n if (!Array.isArray(methods) || !methods.includes(\"S256\")) {\n throw new OAuthFlowError(`${issuer} does not advertise PKCE S256 (code_challenge_methods_supported).`)\n }\n return doc as AuthorizationServerMetadata\n }\n throw new OAuthFlowError(`Authorization server metadata not found for ${issuer}.`)\n}\n\n/* 클라이언트 등록 */\n\nexport interface OAuthClient {\n client_id: string\n client_secret?: string\n token_endpoint_auth_method?: string\n}\n\nexport interface RegisterOptions {\n /** 사전 등록 client_id 또는 Client ID Metadata Document URL (https) */\n clientId?: string\n clientName?: string\n /** 없으면 redirect 없는 등록 (device flow) */\n redirectUri?: string\n scope?: string\n}\n\nexport const DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\"\n\n/**\n * 등록 순서: 사전 등록 client_id (https URL 이면 Client ID Metadata Document) → 동적 등록 (registration_endpoint).\n * 둘 다 없으면 오류 (--client-id 안내).\n */\nexport async function registerClient(\n as: AuthorizationServerMetadata,\n options: RegisterOptions,\n doFetch: Fetch = fetch,\n): Promise<OAuthClient> {\n if (options.clientId !== undefined) {\n if (/^https:\\/\\//.test(options.clientId) && as.client_id_metadata_document_supported !== true) {\n throw new OAuthFlowError(`${as.issuer} does not support Client ID Metadata Documents (client_id ${options.clientId}).`)\n }\n return { client_id: options.clientId, token_endpoint_auth_method: \"none\" }\n }\n if (typeof as.registration_endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} has no dynamic client registration. Pass a pre-registered client ID with --client-id.`,\n )\n }\n const body: Record<string, unknown> =\n options.redirectUri !== undefined\n ? {\n client_name: options.clientName ?? \"mext\",\n redirect_uris: [options.redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n : {\n client_name: options.clientName ?? \"mext\",\n grant_types: [DEVICE_CODE_GRANT, \"refresh_token\"],\n response_types: [],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n if (options.scope) body.scope = options.scope\n const res = await doFetch(as.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify(body),\n })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (!res.ok || typeof doc?.client_id !== \"string\") {\n throw new OAuthFlowError(`Client registration failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const client: OAuthClient = { client_id: doc.client_id }\n if (typeof doc.client_secret === \"string\") client.client_secret = doc.client_secret\n if (typeof doc.token_endpoint_auth_method === \"string\") client.token_endpoint_auth_method = doc.token_endpoint_auth_method\n return client\n}\n\n/* PKCE */\n\nexport interface Pkce {\n verifier: string\n challenge: string\n}\n\nexport function createPkce(): Pkce {\n const verifier = base64url(randomBytes(32))\n return { verifier, challenge: base64url(createHash(\"sha256\").update(verifier).digest()) }\n}\n\n/* loopback redirect */\n\nexport interface Loopback {\n redirectUri: string\n port: number\n /** 첫 callback 요청의 query. signal abort · 시간 초과 = reject */\n callback: Promise<URLSearchParams>\n close(): Promise<void>\n}\n\nexport const CALLBACK_PATH = \"/callback\"\n\n/** 127.0.0.1 의 임의 포트 (port 지정 가능) 에 callback 수신 서버 */\nexport async function startLoopback(options: { port?: number; signal?: AbortSignal; timeoutMs?: number } = {}): Promise<Loopback> {\n let settle!: { resolve: (q: URLSearchParams) => void; reject: (e: unknown) => void }\n const callback = new Promise<URLSearchParams>((resolve, reject) => (settle = { resolve, reject }))\n callback.catch(() => {})\n let done = false\n const server: Server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\")\n if (req.method !== \"GET\" || url.pathname !== CALLBACK_PATH || done) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" }).end(\"Not found\\n\")\n return\n }\n done = true\n const ok = url.searchParams.has(\"code\") && !url.searchParams.has(\"error\")\n res\n .writeHead(ok ? 200 : 400, { \"Content-Type\": \"text/html; charset=utf-8\", Connection: \"close\" })\n .end(\n ok\n ? \"<!doctype html><title>mext login</title><p>Login complete. You can close this window.</p>\\n\"\n : \"<!doctype html><title>mext login</title><p>Login failed. Return to the terminal.</p>\\n\",\n )\n settle.resolve(url.searchParams)\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(options.port ?? 0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n const port = (server.address() as AddressInfo).port\n const timer = setTimeout(\n () => settle.reject(new OAuthFlowError(\"Timed out waiting for the authorization callback.\")),\n options.timeoutMs ?? 300_000,\n )\n const onAbort = () => settle.reject(options.signal?.reason ?? new Error(\"aborted\"))\n if (options.signal?.aborted) onAbort()\n options.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const close = async () => {\n clearTimeout(timer)\n options.signal?.removeEventListener(\"abort\", onAbort)\n server.closeAllConnections()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n }\n return { redirectUri: `http://127.0.0.1:${port}${CALLBACK_PATH}`, port, callback, close }\n}\n\n/* 인가 요청 · 응답 검증 · 토큰 */\n\nexport interface AuthorizationRequest {\n url: string\n state: string\n pkce: Pkce\n}\n\nexport function authorizationRequest(\n as: AuthorizationServerMetadata,\n client: OAuthClient,\n options: { redirectUri: string; resource: string; scope?: string },\n): AuthorizationRequest {\n const pkce = createPkce()\n const state = base64url(randomBytes(16))\n const url = new URL(as.authorization_endpoint)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", client.client_id)\n url.searchParams.set(\"redirect_uri\", options.redirectUri)\n url.searchParams.set(\"code_challenge\", pkce.challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"resource\", options.resource)\n if (options.scope) url.searchParams.set(\"scope\", options.scope)\n return { url: url.href, state, pkce }\n}\n\n/** callback query → code. state · iss (RFC 9207) 검증 후 error 를 본다 (iss 불일치면 error 내용도 쓰지 않음) */\nexport function authorizationCode(\n query: URLSearchParams,\n as: AuthorizationServerMetadata,\n expectedState: string,\n): string {\n const iss = query.get(\"iss\")\n if (iss !== null && iss !== as.issuer) throw new OAuthFlowError(\"Authorization response issuer mismatch.\")\n if (iss === null && as.authorization_response_iss_parameter_supported === true) {\n throw new OAuthFlowError(\"Authorization response is missing iss.\")\n }\n if (query.get(\"state\") !== expectedState) throw new OAuthFlowError(\"Authorization response state mismatch.\")\n const error = query.get(\"error\")\n if (error !== null) {\n const description = query.get(\"error_description\")\n throw new OAuthFlowError(`Authorization failed: ${error}${description ? ` (${description})` : \"\"}.`)\n }\n const code = query.get(\"code\")\n if (code === null || code === \"\") throw new OAuthFlowError(\"Authorization response has no code.\")\n return code\n}\n\ninterface TokenContext {\n issuer: string\n token_endpoint: string\n client: OAuthClient\n resource?: string\n}\n\nexport async function exchangeCode(\n context: TokenContext,\n options: { code: string; redirectUri: string; verifier: string },\n doFetch: Fetch = fetch,\n): Promise<StoredCredentials> {\n return tokenRequest(\n context,\n { grant_type: \"authorization_code\", code: options.code, redirect_uri: options.redirectUri, code_verifier: options.verifier },\n undefined,\n doFetch,\n )\n}\n\n/** refresh_token 갱신. 새 refresh_token 이 없으면 기존 값 유지 */\nexport async function refreshCredentials(credentials: StoredCredentials, doFetch: Fetch = fetch): Promise<StoredCredentials> {\n if (!credentials.refresh_token) throw new OAuthFlowError(\"No refresh token.\")\n if (credentials.issuer === undefined || credentials.token_endpoint === undefined || credentials.client_id === undefined) {\n throw new OAuthFlowError(\"Stored credentials have no OAuth client.\")\n }\n return tokenRequest(\n {\n issuer: credentials.issuer,\n token_endpoint: credentials.token_endpoint,\n client: storedClient(credentials, credentials.client_id),\n ...(credentials.resource !== undefined ? { resource: credentials.resource } : {}),\n },\n { grant_type: \"refresh_token\", refresh_token: credentials.refresh_token },\n credentials,\n doFetch,\n )\n}\n\nfunction storedClient(credentials: StoredCredentials, clientId: string): OAuthClient {\n const client: OAuthClient = { client_id: clientId }\n if (credentials.client_secret !== undefined) client.client_secret = credentials.client_secret\n if (credentials.token_endpoint_auth_method !== undefined) client.token_endpoint_auth_method = credentials.token_endpoint_auth_method\n return client\n}\n\n/** 클라이언트 인증 (token · revocation · device authorization 공통): secret 없음 = client_id 본문, basic · post */\nfunction clientAuth(client: OAuthClient, body: URLSearchParams, headers: Record<string, string>): void {\n const method = client.token_endpoint_auth_method ?? (client.client_secret ? \"client_secret_basic\" : \"none\")\n if (client.client_secret && method === \"client_secret_basic\") {\n const pair = `${encodeURIComponent(client.client_id)}:${encodeURIComponent(client.client_secret)}`\n headers.Authorization = `Basic ${Buffer.from(pair).toString(\"base64\")}`\n } else {\n body.set(\"client_id\", client.client_id)\n if (client.client_secret && method === \"client_secret_post\") body.set(\"client_secret\", client.client_secret)\n }\n}\n\nfunction formHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/x-www-form-urlencoded\", Accept: \"application/json\" }\n}\n\nasync function tokenRequest(\n context: TokenContext,\n grant: Record<string, string>,\n previous: StoredCredentials | undefined,\n doFetch: Fetch,\n): Promise<StoredCredentials> {\n const res = await postTokenEndpoint(context, grant, doFetch)\n const doc = res.doc\n if (!res.ok || typeof doc?.access_token !== \"string\") {\n throw new OAuthFlowError(`Token request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n return credentialsFrom(context, doc as Record<string, unknown> & { access_token: string }, previous)\n}\n\nasync function postTokenEndpoint(\n context: TokenContext,\n grant: Record<string, string>,\n doFetch: Fetch,\n): Promise<{ ok: boolean; status: number; doc: Record<string, unknown> | undefined }> {\n const body = new URLSearchParams(grant)\n if (context.resource !== undefined) body.set(\"resource\", context.resource)\n const headers = formHeaders()\n clientAuth(context.client, body, headers)\n const res = await doFetch(context.token_endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n return { ok: res.ok, status: res.status, doc }\n}\n\nfunction credentialsFrom(\n context: TokenContext,\n doc: Record<string, unknown> & { access_token: string },\n previous: StoredCredentials | undefined,\n): StoredCredentials {\n const { client } = context\n const out: StoredCredentials = {\n access_token: doc.access_token,\n issuer: context.issuer,\n token_endpoint: context.token_endpoint,\n client_id: client.client_id,\n }\n if (context.resource !== undefined) out.resource = context.resource\n if (typeof doc.token_type === \"string\") out.token_type = doc.token_type\n const refresh = typeof doc.refresh_token === \"string\" ? doc.refresh_token : previous?.refresh_token\n if (refresh !== undefined) out.refresh_token = refresh\n if (typeof doc.expires_in === \"number\") out.expires_at = Date.now() + doc.expires_in * 1000\n const scope = typeof doc.scope === \"string\" ? doc.scope : previous?.scope\n if (scope !== undefined) out.scope = scope\n if (client.client_secret !== undefined) out.client_secret = client.client_secret\n if (client.token_endpoint_auth_method !== undefined) out.token_endpoint_auth_method = client.token_endpoint_auth_method\n return out\n}\n\n/** 만료 30초 전부터 만료로 본다 */\nexport function isExpired(credentials: StoredCredentials, now = Date.now()): boolean {\n return credentials.expires_at !== undefined && credentials.expires_at - 30_000 <= now\n}\n\n/* 전체 흐름 */\n\n/** login 대상: 보호 자원 메타데이터 → 인가 서버 메타데이터 · resource · scope */\nexport interface LoginTarget {\n serverUrl: string\n as: AuthorizationServerMetadata\n /** RFC 8707 resource */\n resource: string\n scope?: string\n}\n\nexport interface DiscoverLoginOptions {\n serverUrl: string\n /** 서버 401 의 WWW-Authenticate (없으면 well-known 탐색) */\n challenge?: BearerChallenge\n /** 기본: challenge 의 scope → 보호 자원 메타데이터 scopes_supported → 생략 */\n scope?: string\n fetch?: Fetch\n}\n\nexport async function discoverLoginTarget(options: DiscoverLoginOptions): Promise<LoginTarget> {\n const doFetch = options.fetch ?? fetch\n const prm = await discoverProtectedResource(options.serverUrl, options.challenge, doFetch)\n // 여러 인가 서버 중 첫 번째 (RFC 9728 7.6: 선택은 클라이언트 몫)\n const as = await discoverAuthorizationServer(prm.authorization_servers[0]!, doFetch)\n const resource = typeof prm.resource === \"string\" ? prm.resource : canonicalServerUrl(options.serverUrl)\n const scope =\n options.scope ??\n options.challenge?.scope ??\n (Array.isArray(prm.scopes_supported) && prm.scopes_supported.length > 0 ? prm.scopes_supported.join(\" \") : undefined)\n return { serverUrl: options.serverUrl, as, resource, ...(scope !== undefined ? { scope } : {}) }\n}\n\nexport interface AuthorizationCodeLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n /** loopback 포트. 기본 임의 */\n port?: number\n signal?: AbortSignal\n timeoutMs?: number\n fetch?: Fetch\n /** 인가 URL 준비됨 (브라우저 열기 · 안내 출력) */\n onAuthorizationUrl(url: string, loopback: { redirectUri: string; port: number }): void\n /**\n * 붙여넣은 redirect URL 의 query (stdin). loopback callback 과 먼저 온 쪽을 쓰고, 다른 쪽은 signal 로 중단.\n * undefined = 입력 끝 (loopback 만 대기)\n */\n readRedirect?(signal: AbortSignal): Promise<URLSearchParams | undefined>\n}\n\n/** authorization code + PKCE. redirect = loopback callback 또는 붙여넣은 URL. 둘 다 state · iss 검증 */\nexport async function authorizationCodeLogin(\n target: LoginTarget,\n options: AuthorizationCodeLoginOptions,\n): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const { as, resource, scope } = target\n const loopback = await startLoopback({\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n })\n const pasteAbort = new AbortController()\n try {\n const client = await registerClient(\n as,\n {\n redirectUri: loopback.redirectUri,\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const request = authorizationRequest(as, client, {\n redirectUri: loopback.redirectUri,\n resource,\n ...(scope !== undefined ? { scope } : {}),\n })\n options.onAuthorizationUrl(request.url, { redirectUri: loopback.redirectUri, port: loopback.port })\n const never = new Promise<never>(() => {})\n const pasted = options.readRedirect\n ? options.readRedirect(pasteAbort.signal).then((q) => q ?? never)\n : never\n const query = await Promise.race([loopback.callback, pasted])\n const code = authorizationCode(query, as, request.state)\n return await exchangeCode(\n { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource },\n { code, redirectUri: loopback.redirectUri, verifier: request.pkce.verifier },\n doFetch,\n )\n } finally {\n pasteAbort.abort()\n await loopback.close()\n }\n}\n\n/** 붙여넣은 redirect URL (또는 query 문자열) → query. code · error 가 없으면 undefined */\nexport function parseRedirectUrl(text: string): URLSearchParams | undefined {\n const trimmed = text.trim()\n if (trimmed === \"\") return undefined\n let query: URLSearchParams\n try {\n query = new URL(trimmed).searchParams\n } catch {\n if (!trimmed.includes(\"=\")) return undefined\n query = new URLSearchParams(trimmed.replace(/^[^?]*\\?/, \"\"))\n }\n return query.has(\"code\") || query.has(\"error\") ? query : undefined\n}\n\n/* device authorization grant (RFC 8628) */\n\nexport interface DeviceAuthorization {\n verification_uri: string\n verification_uri_complete?: string\n user_code: string\n /** 초 */\n expires_in: number\n /** polling 간격 (초). 기본 5 */\n interval: number\n}\n\nexport interface DeviceLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n signal?: AbortSignal\n fetch?: Fetch\n /** polling 대기 (테스트 주입). 기본 setTimeout */\n sleep?(ms: number, signal?: AbortSignal): Promise<void>\n /** 사용자 코드 준비됨 (안내 출력 · 브라우저 열기) */\n onDeviceCode(device: DeviceAuthorization): void\n}\n\nexport async function deviceLogin(target: LoginTarget, options: DeviceLoginOptions): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const sleep = options.sleep ?? ((ms: number, signal?: AbortSignal) => delay(ms, undefined, signal ? { signal } : {}))\n const { as, resource, scope } = target\n const endpoint = as.device_authorization_endpoint\n if (typeof endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} does not support the device authorization grant (no device_authorization_endpoint in its metadata).`,\n )\n }\n const client = await registerClient(\n as,\n {\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const body = new URLSearchParams({ resource })\n if (scope !== undefined) body.set(\"scope\", scope)\n const headers = formHeaders()\n clientAuth(client, body, headers)\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (\n !res.ok ||\n typeof doc?.device_code !== \"string\" ||\n typeof doc.user_code !== \"string\" ||\n typeof doc.verification_uri !== \"string\" ||\n typeof doc.expires_in !== \"number\"\n ) {\n throw new OAuthFlowError(`Device authorization request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const device: DeviceAuthorization = {\n verification_uri: doc.verification_uri,\n user_code: doc.user_code,\n expires_in: doc.expires_in,\n interval: typeof doc.interval === \"number\" && doc.interval >= 0 ? doc.interval : 5,\n }\n if (typeof doc.verification_uri_complete === \"string\") device.verification_uri_complete = doc.verification_uri_complete\n const deviceCode = doc.device_code\n options.onDeviceCode(device)\n\n const context: TokenContext = { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource }\n const deadline = Date.now() + device.expires_in * 1000\n let interval = device.interval * 1000\n const expired = () => new OAuthFlowError(\"The device code expired before authorization. Run login again.\")\n for (;;) {\n if (Date.now() >= deadline) throw expired()\n await sleep(interval, options.signal)\n const token = await postTokenEndpoint(context, { grant_type: DEVICE_CODE_GRANT, device_code: deviceCode }, doFetch)\n if (token.ok && typeof token.doc?.access_token === \"string\") {\n return credentialsFrom(context, token.doc as Record<string, unknown> & { access_token: string }, undefined)\n }\n const error = token.doc?.error\n if (error === \"authorization_pending\") continue\n if (error === \"slow_down\") {\n interval += 5000 // RFC 8628 3.5\n continue\n }\n if (error === \"expired_token\") throw expired()\n if (error === \"access_denied\") throw new OAuthFlowError(\"Authorization was denied.\")\n throw new OAuthFlowError(`Token request failed (HTTP ${token.status})${describeOAuthError(token.doc)}.`)\n }\n}\n\n/* token revocation (RFC 7009) */\n\nexport interface RevokeResult {\n /** 인가 서버에 revocation_endpoint 가 있음 */\n supported: boolean\n /** 폐기 요청이 성공한 토큰 종류 (refresh_token → access_token 순서) */\n revoked: (\"refresh_token\" | \"access_token\")[]\n /** 실패 (메타데이터 조회 · 요청). 실패해도 저장분 삭제는 호출자가 진행 */\n errors: string[]\n}\n\n/** 저장된 OAuth 토큰 폐기. refresh token 먼저 (RFC 7009 2.1: 연결된 access token 도 무효화될 수 있음), 그다음 access token */\nexport async function revokeCredentials(credentials: StoredCredentials, options: { fetch?: Fetch } = {}): Promise<RevokeResult> {\n const doFetch = options.fetch ?? fetch\n const result: RevokeResult = { supported: false, revoked: [], errors: [] }\n if (credentials.issuer === undefined || credentials.client_id === undefined) return result\n let as: AuthorizationServerMetadata\n try {\n as = await discoverAuthorizationServer(credentials.issuer, doFetch)\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error))\n return result\n }\n const endpoint = as.revocation_endpoint\n if (typeof endpoint !== \"string\") return result\n result.supported = true\n const client = storedClient(credentials, credentials.client_id)\n const tokens: [RevokeResult[\"revoked\"][number], string | undefined][] = [\n [\"refresh_token\", credentials.refresh_token],\n [\"access_token\", credentials.access_token],\n ]\n for (const [hint, token] of tokens) {\n if (token === undefined || token === \"\") continue\n const body = new URLSearchParams({ token, token_type_hint: hint })\n const headers = formHeaders()\n clientAuth(client, body, headers)\n try {\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n if (res.ok) {\n await res.body?.cancel().catch(() => {})\n result.revoked.push(hint)\n } else {\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n result.errors.push(`${hint} revocation failed (HTTP ${res.status})${describeOAuthError(doc)}`)\n }\n } catch (error) {\n result.errors.push(`${hint} revocation failed: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n return result\n}\n\n/** 이전 API: 탐색 + authorization code (loopback) */\nexport interface LoginOptions extends DiscoverLoginOptions, Omit<AuthorizationCodeLoginOptions, \"fetch\"> {}\n\nexport async function login(options: LoginOptions): Promise<StoredCredentials> {\n const target = await discoverLoginTarget(options)\n return authorizationCodeLogin(target, options)\n}\n\n/* 공통 */\n\nasync function getJson(url: string, doFetch: Fetch): Promise<Record<string, unknown> | undefined> {\n let res: Response\n try {\n res = await doFetch(url, { headers: { Accept: \"application/json\" } })\n } catch (error) {\n throw new OAuthFlowError(`Cannot reach ${url}: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {})\n return undefined\n }\n const doc = (await res.json().catch(() => undefined)) as unknown\n return typeof doc === \"object\" && doc !== null && !Array.isArray(doc) ? (doc as Record<string, unknown>) : undefined\n}\n\nfunction describeOAuthError(doc: Record<string, unknown> | undefined): string {\n if (typeof doc?.error !== \"string\") return \"\"\n return `: ${doc.error}${typeof doc.error_description === \"string\" ? ` (${doc.error_description})` : \"\"}`\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\")\n}\n"]}
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/remote/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\"\nimport { createServer, type Server } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport { setTimeout as delay } from \"node:timers/promises\"\nimport type { BearerChallenge } from \"./client.ts\"\nimport { canonicalServerUrl, type StoredCredentials } from \"./credentials.ts\"\n\n/**\n * MCP authorization (2026-07-28) 클라이언트 쪽: OAuth 2.1 authorization code + PKCE (S256) + loopback redirect.\n * 보호 자원 메타데이터 (RFC 9728: WWW-Authenticate resource_metadata → 경로 삽입 well-known → 루트) →\n * 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery, issuer 일치 검증) → 클라이언트 등록 (사전 등록 client_id ·\n * Client ID Metadata Document URL · RFC 7591 동적 등록) → 인가 요청 (resource = RFC 8707) → iss 검증 (RFC 9207) →\n * 토큰 교환. refresh_token 갱신.\n * headless: redirect URL 붙여넣기 (loopback 과 먼저 온 쪽) · device authorization grant (RFC 8628, 인가 서버 메타데이터에\n * device_authorization_endpoint 가 있을 때만. MCP 사양 밖). logout = token revocation (RFC 7009).\n */\n\nexport class OAuthFlowError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"OAuthFlowError\"\n }\n}\n\nexport interface ProtectedResourceMetadata {\n resource?: string\n authorization_servers: string[]\n scopes_supported?: string[]\n [key: string]: unknown\n}\n\nexport interface AuthorizationServerMetadata {\n issuer: string\n authorization_endpoint: string\n token_endpoint: string\n registration_endpoint?: string\n code_challenge_methods_supported?: string[]\n scopes_supported?: string[]\n authorization_response_iss_parameter_supported?: boolean\n client_id_metadata_document_supported?: boolean\n /** RFC 8628 */\n device_authorization_endpoint?: string\n /** RFC 7009 */\n revocation_endpoint?: string\n [key: string]: unknown\n}\n\ntype Fetch = typeof fetch\n\n/* 보호 자원 메타데이터 (RFC 9728) */\n\n/** 보호 자원 메타데이터 후보 URL: challenge 의 resource_metadata, 없으면 경로 삽입 well-known → 루트 well-known */\nexport function protectedResourceMetadataUrls(serverUrl: string, challenge?: BearerChallenge): string[] {\n if (challenge?.resourceMetadata) return [challenge.resourceMetadata]\n const u = new URL(serverUrl)\n const path = u.pathname.replace(/\\/$/, \"\")\n const urls: string[] = []\n if (path !== \"\") urls.push(`${u.origin}/.well-known/oauth-protected-resource${path}`)\n urls.push(`${u.origin}/.well-known/oauth-protected-resource`)\n return urls\n}\n\nexport async function discoverProtectedResource(\n serverUrl: string,\n challenge: BearerChallenge | undefined,\n doFetch: Fetch = fetch,\n): Promise<ProtectedResourceMetadata> {\n const canonical = canonicalServerUrl(serverUrl)\n for (const url of protectedResourceMetadataUrls(serverUrl, challenge)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n const servers = doc.authorization_servers\n if (!Array.isArray(servers) || servers.length === 0 || !servers.every((s) => typeof s === \"string\")) {\n throw new OAuthFlowError(`${url}: protected resource metadata has no authorization_servers.`)\n }\n if (typeof doc.resource === \"string\") {\n const resource = canonicalServerUrl(doc.resource)\n if (resource !== canonical && resource !== new URL(canonical).origin) {\n throw new OAuthFlowError(`${url}: resource ${doc.resource} does not match ${canonical}.`)\n }\n }\n return doc as ProtectedResourceMetadata\n }\n throw new OAuthFlowError(\n `${serverUrl} does not publish OAuth protected resource metadata (/.well-known/oauth-protected-resource). ` +\n \"Use an API key (MEXT_TOKEN) instead.\",\n )\n}\n\n/* 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery) */\n\n/** issuer → 메타데이터 후보 URL (MCP authorization-server-discovery 순서) */\nexport function authorizationServerMetadataUrls(issuer: string): string[] {\n const u = new URL(issuer)\n const path = u.pathname.replace(/\\/$/, \"\")\n if (path === \"\") {\n return [`${u.origin}/.well-known/oauth-authorization-server`, `${u.origin}/.well-known/openid-configuration`]\n }\n return [\n `${u.origin}/.well-known/oauth-authorization-server${path}`,\n `${u.origin}/.well-known/openid-configuration${path}`,\n `${u.origin}${path}/.well-known/openid-configuration`,\n ]\n}\n\nexport async function discoverAuthorizationServer(issuer: string, doFetch: Fetch = fetch): Promise<AuthorizationServerMetadata> {\n for (const url of authorizationServerMetadataUrls(issuer)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n // issuer 는 메타데이터 URL 을 만든 값과 정확히 같아야 한다 (다르면 사용 금지)\n if (doc.issuer !== issuer) throw new OAuthFlowError(`${url}: issuer ${String(doc.issuer)} does not match ${issuer}.`)\n if (typeof doc.authorization_endpoint !== \"string\" || typeof doc.token_endpoint !== \"string\") {\n throw new OAuthFlowError(`${url}: authorization_endpoint and token_endpoint are required.`)\n }\n const methods = doc.code_challenge_methods_supported\n if (!Array.isArray(methods) || !methods.includes(\"S256\")) {\n throw new OAuthFlowError(`${issuer} does not advertise PKCE S256 (code_challenge_methods_supported).`)\n }\n return doc as AuthorizationServerMetadata\n }\n throw new OAuthFlowError(`Authorization server metadata not found for ${issuer}.`)\n}\n\n/* 클라이언트 등록 */\n\nexport interface OAuthClient {\n client_id: string\n client_secret?: string\n token_endpoint_auth_method?: string\n}\n\nexport interface RegisterOptions {\n /** 사전 등록 client_id 또는 Client ID Metadata Document URL (https) */\n clientId?: string\n clientName?: string\n /** 없으면 redirect 없는 등록 (device flow) */\n redirectUri?: string\n scope?: string\n}\n\nexport const DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\"\n\n/**\n * 등록 순서: 사전 등록 client_id (https URL 이면 Client ID Metadata Document) → 동적 등록 (registration_endpoint).\n * 둘 다 없으면 오류 (--client-id 안내).\n */\nexport async function registerClient(\n as: AuthorizationServerMetadata,\n options: RegisterOptions,\n doFetch: Fetch = fetch,\n): Promise<OAuthClient> {\n if (options.clientId !== undefined) {\n if (options.clientId.startsWith(\"https://\") && as.client_id_metadata_document_supported !== true) {\n throw new OAuthFlowError(`${as.issuer} does not support Client ID Metadata Documents (client_id ${options.clientId}).`)\n }\n return { client_id: options.clientId, token_endpoint_auth_method: \"none\" }\n }\n if (typeof as.registration_endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} has no dynamic client registration. Pass a pre-registered client ID with --client-id.`,\n )\n }\n const body: Record<string, unknown> =\n options.redirectUri !== undefined\n ? {\n client_name: options.clientName ?? \"mext\",\n redirect_uris: [options.redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n : {\n client_name: options.clientName ?? \"mext\",\n grant_types: [DEVICE_CODE_GRANT, \"refresh_token\"],\n response_types: [],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n if (options.scope) body.scope = options.scope\n const res = await doFetch(as.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify(body),\n })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (!res.ok || typeof doc?.client_id !== \"string\") {\n throw new OAuthFlowError(`Client registration failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const client: OAuthClient = { client_id: doc.client_id }\n if (typeof doc.client_secret === \"string\") client.client_secret = doc.client_secret\n if (typeof doc.token_endpoint_auth_method === \"string\") client.token_endpoint_auth_method = doc.token_endpoint_auth_method\n return client\n}\n\n/* PKCE */\n\nexport interface Pkce {\n verifier: string\n challenge: string\n}\n\nexport function createPkce(): Pkce {\n const verifier = base64url(randomBytes(32))\n return { verifier, challenge: base64url(createHash(\"sha256\").update(verifier).digest()) }\n}\n\n/* loopback redirect */\n\nexport interface Loopback {\n redirectUri: string\n port: number\n /** 첫 callback 요청의 query. signal abort · 시간 초과 = reject */\n callback: Promise<URLSearchParams>\n close(): Promise<void>\n}\n\nexport const CALLBACK_PATH = \"/callback\"\n\n/** 127.0.0.1 의 임의 포트 (port 지정 가능) 에 callback 수신 서버 */\nexport async function startLoopback(options: { port?: number; signal?: AbortSignal; timeoutMs?: number } = {}): Promise<Loopback> {\n let settle!: { resolve: (q: URLSearchParams) => void; reject: (e: unknown) => void }\n const callback = new Promise<URLSearchParams>((resolve, reject) => (settle = { resolve, reject }))\n callback.catch(() => {})\n let done = false\n const server: Server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\")\n if (req.method !== \"GET\" || url.pathname !== CALLBACK_PATH || done) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" }).end(\"Not found\\n\")\n return\n }\n done = true\n const ok = url.searchParams.has(\"code\") && !url.searchParams.has(\"error\")\n res\n .writeHead(ok ? 200 : 400, { \"Content-Type\": \"text/html; charset=utf-8\", Connection: \"close\" })\n .end(\n ok\n ? \"<!doctype html><title>mext login</title><p>Login complete. You can close this window.</p>\\n\"\n : \"<!doctype html><title>mext login</title><p>Login failed. Return to the terminal.</p>\\n\",\n )\n settle.resolve(url.searchParams)\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(options.port ?? 0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n const port = (server.address() as AddressInfo).port\n const timer = setTimeout(\n () => settle.reject(new OAuthFlowError(\"Timed out waiting for the authorization callback.\")),\n options.timeoutMs ?? 300_000,\n )\n const onAbort = () => settle.reject(options.signal?.reason ?? new Error(\"aborted\"))\n if (options.signal?.aborted) onAbort()\n options.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const close = async () => {\n clearTimeout(timer)\n options.signal?.removeEventListener(\"abort\", onAbort)\n server.closeAllConnections()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n }\n return { redirectUri: `http://127.0.0.1:${port}${CALLBACK_PATH}`, port, callback, close }\n}\n\n/* 인가 요청 · 응답 검증 · 토큰 */\n\nexport interface AuthorizationRequest {\n url: string\n state: string\n pkce: Pkce\n}\n\nexport function authorizationRequest(\n as: AuthorizationServerMetadata,\n client: OAuthClient,\n options: { redirectUri: string; resource: string; scope?: string },\n): AuthorizationRequest {\n const pkce = createPkce()\n const state = base64url(randomBytes(16))\n const url = new URL(as.authorization_endpoint)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", client.client_id)\n url.searchParams.set(\"redirect_uri\", options.redirectUri)\n url.searchParams.set(\"code_challenge\", pkce.challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"resource\", options.resource)\n if (options.scope) url.searchParams.set(\"scope\", options.scope)\n return { url: url.href, state, pkce }\n}\n\n/** callback query → code. state · iss (RFC 9207) 검증 후 error 를 본다 (iss 불일치면 error 내용도 쓰지 않음) */\nexport function authorizationCode(\n query: URLSearchParams,\n as: AuthorizationServerMetadata,\n expectedState: string,\n): string {\n const iss = query.get(\"iss\")\n if (iss !== null && iss !== as.issuer) throw new OAuthFlowError(\"Authorization response issuer mismatch.\")\n if (iss === null && as.authorization_response_iss_parameter_supported === true) {\n throw new OAuthFlowError(\"Authorization response is missing iss.\")\n }\n if (query.get(\"state\") !== expectedState) throw new OAuthFlowError(\"Authorization response state mismatch.\")\n const error = query.get(\"error\")\n if (error !== null) {\n const description = query.get(\"error_description\")\n throw new OAuthFlowError(`Authorization failed: ${error}${description ? ` (${description})` : \"\"}.`)\n }\n const code = query.get(\"code\")\n if (code === null || code === \"\") throw new OAuthFlowError(\"Authorization response has no code.\")\n return code\n}\n\ninterface TokenContext {\n issuer: string\n token_endpoint: string\n client: OAuthClient\n resource?: string\n}\n\nexport async function exchangeCode(\n context: TokenContext,\n options: { code: string; redirectUri: string; verifier: string },\n doFetch: Fetch = fetch,\n): Promise<StoredCredentials> {\n return tokenRequest(\n context,\n { grant_type: \"authorization_code\", code: options.code, redirect_uri: options.redirectUri, code_verifier: options.verifier },\n undefined,\n doFetch,\n )\n}\n\n/** refresh_token 갱신. 새 refresh_token 이 없으면 기존 값 유지 */\nexport async function refreshCredentials(credentials: StoredCredentials, doFetch: Fetch = fetch): Promise<StoredCredentials> {\n if (!credentials.refresh_token) throw new OAuthFlowError(\"No refresh token.\")\n if (credentials.issuer === undefined || credentials.token_endpoint === undefined || credentials.client_id === undefined) {\n throw new OAuthFlowError(\"Stored credentials have no OAuth client.\")\n }\n return tokenRequest(\n {\n issuer: credentials.issuer,\n token_endpoint: credentials.token_endpoint,\n client: storedClient(credentials, credentials.client_id),\n ...(credentials.resource !== undefined ? { resource: credentials.resource } : {}),\n },\n { grant_type: \"refresh_token\", refresh_token: credentials.refresh_token },\n credentials,\n doFetch,\n )\n}\n\nfunction storedClient(credentials: StoredCredentials, clientId: string): OAuthClient {\n const client: OAuthClient = { client_id: clientId }\n if (credentials.client_secret !== undefined) client.client_secret = credentials.client_secret\n if (credentials.token_endpoint_auth_method !== undefined) client.token_endpoint_auth_method = credentials.token_endpoint_auth_method\n return client\n}\n\n/** 클라이언트 인증 (token · revocation · device authorization 공통): secret 없음 = client_id 본문, basic · post */\nfunction clientAuth(client: OAuthClient, body: URLSearchParams, headers: Record<string, string>): void {\n const method = client.token_endpoint_auth_method ?? (client.client_secret ? \"client_secret_basic\" : \"none\")\n if (client.client_secret && method === \"client_secret_basic\") {\n const pair = `${encodeURIComponent(client.client_id)}:${encodeURIComponent(client.client_secret)}`\n headers.Authorization = `Basic ${Buffer.from(pair).toString(\"base64\")}`\n } else {\n body.set(\"client_id\", client.client_id)\n if (client.client_secret && method === \"client_secret_post\") body.set(\"client_secret\", client.client_secret)\n }\n}\n\nfunction formHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/x-www-form-urlencoded\", Accept: \"application/json\" }\n}\n\nasync function tokenRequest(\n context: TokenContext,\n grant: Record<string, string>,\n previous: StoredCredentials | undefined,\n doFetch: Fetch,\n): Promise<StoredCredentials> {\n const res = await postTokenEndpoint(context, grant, doFetch)\n const doc = res.doc\n if (!res.ok || typeof doc?.access_token !== \"string\") {\n throw new OAuthFlowError(`Token request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n return credentialsFrom(context, doc as Record<string, unknown> & { access_token: string }, previous)\n}\n\nasync function postTokenEndpoint(\n context: TokenContext,\n grant: Record<string, string>,\n doFetch: Fetch,\n): Promise<{ ok: boolean; status: number; doc: Record<string, unknown> | undefined }> {\n const body = new URLSearchParams(grant)\n if (context.resource !== undefined) body.set(\"resource\", context.resource)\n const headers = formHeaders()\n clientAuth(context.client, body, headers)\n const res = await doFetch(context.token_endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n return { ok: res.ok, status: res.status, doc }\n}\n\nfunction credentialsFrom(\n context: TokenContext,\n doc: Record<string, unknown> & { access_token: string },\n previous: StoredCredentials | undefined,\n): StoredCredentials {\n const { client } = context\n const out: StoredCredentials = {\n access_token: doc.access_token,\n issuer: context.issuer,\n token_endpoint: context.token_endpoint,\n client_id: client.client_id,\n }\n if (context.resource !== undefined) out.resource = context.resource\n if (typeof doc.token_type === \"string\") out.token_type = doc.token_type\n const refresh = typeof doc.refresh_token === \"string\" ? doc.refresh_token : previous?.refresh_token\n if (refresh !== undefined) out.refresh_token = refresh\n if (typeof doc.expires_in === \"number\") out.expires_at = Date.now() + doc.expires_in * 1000\n const scope = typeof doc.scope === \"string\" ? doc.scope : previous?.scope\n if (scope !== undefined) out.scope = scope\n if (client.client_secret !== undefined) out.client_secret = client.client_secret\n if (client.token_endpoint_auth_method !== undefined) out.token_endpoint_auth_method = client.token_endpoint_auth_method\n return out\n}\n\n/** 만료 30초 전부터 만료로 본다 */\nexport function isExpired(credentials: StoredCredentials, now = Date.now()): boolean {\n return credentials.expires_at !== undefined && credentials.expires_at - 30_000 <= now\n}\n\n/* 전체 흐름 */\n\n/** login 대상: 보호 자원 메타데이터 → 인가 서버 메타데이터 · resource · scope */\nexport interface LoginTarget {\n serverUrl: string\n as: AuthorizationServerMetadata\n /** RFC 8707 resource */\n resource: string\n scope?: string\n}\n\nexport interface DiscoverLoginOptions {\n serverUrl: string\n /** 서버 401 의 WWW-Authenticate (없으면 well-known 탐색) */\n challenge?: BearerChallenge\n /** 기본: challenge 의 scope → 보호 자원 메타데이터 scopes_supported → 생략 */\n scope?: string\n fetch?: Fetch\n}\n\nexport async function discoverLoginTarget(options: DiscoverLoginOptions): Promise<LoginTarget> {\n const doFetch = options.fetch ?? fetch\n const prm = await discoverProtectedResource(options.serverUrl, options.challenge, doFetch)\n // 여러 인가 서버 중 첫 번째 (RFC 9728 7.6: 선택은 클라이언트 몫)\n const as = await discoverAuthorizationServer(prm.authorization_servers[0]!, doFetch)\n const resource = typeof prm.resource === \"string\" ? prm.resource : canonicalServerUrl(options.serverUrl)\n const scope =\n options.scope ??\n options.challenge?.scope ??\n (Array.isArray(prm.scopes_supported) && prm.scopes_supported.length > 0 ? prm.scopes_supported.join(\" \") : undefined)\n return { serverUrl: options.serverUrl, as, resource, ...(scope !== undefined ? { scope } : {}) }\n}\n\nexport interface AuthorizationCodeLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n /** loopback 포트. 기본 임의 */\n port?: number\n signal?: AbortSignal\n timeoutMs?: number\n fetch?: Fetch\n /** 인가 URL 준비됨 (브라우저 열기 · 안내 출력) */\n onAuthorizationUrl(url: string, loopback: { redirectUri: string; port: number }): void\n /**\n * 붙여넣은 redirect URL 의 query (stdin). loopback callback 과 먼저 온 쪽을 쓰고, 다른 쪽은 signal 로 중단.\n * undefined = 입력 끝 (loopback 만 대기)\n */\n readRedirect?(signal: AbortSignal): Promise<URLSearchParams | undefined>\n}\n\n/** authorization code + PKCE. redirect = loopback callback 또는 붙여넣은 URL. 둘 다 state · iss 검증 */\nexport async function authorizationCodeLogin(\n target: LoginTarget,\n options: AuthorizationCodeLoginOptions,\n): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const { as, resource, scope } = target\n const loopback = await startLoopback({\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n })\n const pasteAbort = new AbortController()\n try {\n const client = await registerClient(\n as,\n {\n redirectUri: loopback.redirectUri,\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const request = authorizationRequest(as, client, {\n redirectUri: loopback.redirectUri,\n resource,\n ...(scope !== undefined ? { scope } : {}),\n })\n options.onAuthorizationUrl(request.url, { redirectUri: loopback.redirectUri, port: loopback.port })\n const never = new Promise<never>(() => {})\n const pasted = options.readRedirect\n ? options.readRedirect(pasteAbort.signal).then((q) => q ?? never)\n : never\n const query = await Promise.race([loopback.callback, pasted])\n const code = authorizationCode(query, as, request.state)\n return await exchangeCode(\n { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource },\n { code, redirectUri: loopback.redirectUri, verifier: request.pkce.verifier },\n doFetch,\n )\n } finally {\n pasteAbort.abort()\n await loopback.close()\n }\n}\n\n/** 붙여넣은 redirect URL (또는 query 문자열) → query. code · error 가 없으면 undefined */\nexport function parseRedirectUrl(text: string): URLSearchParams | undefined {\n const trimmed = text.trim()\n if (trimmed === \"\") return undefined\n let query: URLSearchParams\n try {\n query = new URL(trimmed).searchParams\n } catch {\n if (!trimmed.includes(\"=\")) return undefined\n query = new URLSearchParams(trimmed.replace(/^[^?]*\\?/, \"\"))\n }\n return query.has(\"code\") || query.has(\"error\") ? query : undefined\n}\n\n/* device authorization grant (RFC 8628) */\n\nexport interface DeviceAuthorization {\n verification_uri: string\n verification_uri_complete?: string\n user_code: string\n /** 초 */\n expires_in: number\n /** polling 간격 (초). 기본 5 */\n interval: number\n}\n\nexport interface DeviceLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n signal?: AbortSignal\n fetch?: Fetch\n /** polling 대기 (테스트 주입). 기본 setTimeout */\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>\n /** 사용자 코드 준비됨 (안내 출력 · 브라우저 열기) */\n onDeviceCode(device: DeviceAuthorization): void\n}\n\nexport async function deviceLogin(target: LoginTarget, options: DeviceLoginOptions): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const sleep = options.sleep ?? ((ms: number, signal?: AbortSignal) => delay(ms, undefined, signal ? { signal } : {}))\n const { as, resource, scope } = target\n const endpoint = as.device_authorization_endpoint\n if (typeof endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} does not support the device authorization grant (no device_authorization_endpoint in its metadata).`,\n )\n }\n const client = await registerClient(\n as,\n {\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const body = new URLSearchParams({ resource })\n if (scope !== undefined) body.set(\"scope\", scope)\n const headers = formHeaders()\n clientAuth(client, body, headers)\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (\n !res.ok ||\n typeof doc?.device_code !== \"string\" ||\n typeof doc.user_code !== \"string\" ||\n typeof doc.verification_uri !== \"string\" ||\n typeof doc.expires_in !== \"number\"\n ) {\n throw new OAuthFlowError(`Device authorization request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const device: DeviceAuthorization = {\n verification_uri: doc.verification_uri,\n user_code: doc.user_code,\n expires_in: doc.expires_in,\n interval: typeof doc.interval === \"number\" && doc.interval >= 0 ? doc.interval : 5,\n }\n if (typeof doc.verification_uri_complete === \"string\") device.verification_uri_complete = doc.verification_uri_complete\n const deviceCode = doc.device_code\n options.onDeviceCode(device)\n\n const context: TokenContext = { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource }\n const deadline = Date.now() + device.expires_in * 1000\n let interval = device.interval * 1000\n const expired = () => new OAuthFlowError(\"The device code expired before authorization. Run login again.\")\n for (;;) {\n if (Date.now() >= deadline) throw expired()\n await sleep(interval, options.signal)\n const token = await postTokenEndpoint(context, { grant_type: DEVICE_CODE_GRANT, device_code: deviceCode }, doFetch)\n if (token.ok && typeof token.doc?.access_token === \"string\") {\n return credentialsFrom(context, token.doc as Record<string, unknown> & { access_token: string }, undefined)\n }\n const error = token.doc?.error\n if (error === \"authorization_pending\") continue\n if (error === \"slow_down\") {\n interval += 5000 // RFC 8628 3.5\n continue\n }\n if (error === \"expired_token\") throw expired()\n if (error === \"access_denied\") throw new OAuthFlowError(\"Authorization was denied.\")\n throw new OAuthFlowError(`Token request failed (HTTP ${token.status})${describeOAuthError(token.doc)}.`)\n }\n}\n\n/* token revocation (RFC 7009) */\n\nexport interface RevokeResult {\n /** 인가 서버에 revocation_endpoint 가 있음 */\n supported: boolean\n /** 폐기 요청이 성공한 토큰 종류 (refresh_token → access_token 순서) */\n revoked: (\"refresh_token\" | \"access_token\")[]\n /** 실패 (메타데이터 조회 · 요청). 실패해도 저장분 삭제는 호출자가 진행 */\n errors: string[]\n}\n\n/** 저장된 OAuth 토큰 폐기. refresh token 먼저 (RFC 7009 2.1: 연결된 access token 도 무효화될 수 있음), 그다음 access token */\nexport async function revokeCredentials(credentials: StoredCredentials, options: { fetch?: Fetch } = {}): Promise<RevokeResult> {\n const doFetch = options.fetch ?? fetch\n const result: RevokeResult = { supported: false, revoked: [], errors: [] }\n if (credentials.issuer === undefined || credentials.client_id === undefined) return result\n let as: AuthorizationServerMetadata\n try {\n as = await discoverAuthorizationServer(credentials.issuer, doFetch)\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error))\n return result\n }\n const endpoint = as.revocation_endpoint\n if (typeof endpoint !== \"string\") return result\n result.supported = true\n const client = storedClient(credentials, credentials.client_id)\n const tokens: [RevokeResult[\"revoked\"][number], string | undefined][] = [\n [\"refresh_token\", credentials.refresh_token],\n [\"access_token\", credentials.access_token],\n ]\n for (const [hint, token] of tokens) {\n if (token === undefined || token === \"\") continue\n const body = new URLSearchParams({ token, token_type_hint: hint })\n const headers = formHeaders()\n clientAuth(client, body, headers)\n try {\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n if (res.ok) {\n await res.body?.cancel().catch(() => {})\n result.revoked.push(hint)\n } else {\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n result.errors.push(`${hint} revocation failed (HTTP ${res.status})${describeOAuthError(doc)}`)\n }\n } catch (error) {\n result.errors.push(`${hint} revocation failed: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n return result\n}\n\n/** 이전 API: 탐색 + authorization code (loopback) */\nexport interface LoginOptions extends DiscoverLoginOptions, Omit<AuthorizationCodeLoginOptions, \"fetch\"> {}\n\nexport async function login(options: LoginOptions): Promise<StoredCredentials> {\n const target = await discoverLoginTarget(options)\n return authorizationCodeLogin(target, options)\n}\n\n/* 공통 */\n\nasync function getJson(url: string, doFetch: Fetch): Promise<Record<string, unknown> | undefined> {\n let res: Response\n try {\n res = await doFetch(url, { headers: { Accept: \"application/json\" } })\n } catch (error) {\n throw new OAuthFlowError(`Cannot reach ${url}: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {})\n return undefined\n }\n const doc = (await res.json().catch(() => undefined)) as unknown\n return typeof doc === \"object\" && doc !== null && !Array.isArray(doc) ? (doc as Record<string, unknown>) : undefined\n}\n\nfunction describeOAuthError(doc: Record<string, unknown> | undefined): string {\n if (typeof doc?.error !== \"string\") return \"\"\n return `: ${doc.error}${typeof doc.error_description === \"string\" ? ` (${doc.error_description})` : \"\"}`\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\")\n}\n"]}
package/dist/route.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import type { MextApp } from "./command.ts";
2
2
  import { type BuildIssue } from "./errors.ts";
3
+ import type { Principal } from "./principal.ts";
3
4
  /**
4
5
  * Routes (§12.4): MCP 엔드포인트 밖 HTTP 경로. routes/**\/*.ts 파일 경로 = URL 경로.
5
- * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음. Origin 검사 · auth 대상 아님.
6
+ * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음.
7
+ * Origin 검사 · auth = 기본 없음. 모듈의 export origin · auth 로 route 마다 켠다 (설정 routes = 모든 route 의 기본값, export 가 덮어씀).
6
8
  * Registry 와 별개 집합 (D1): 명령어 계약 (help · tools · manifestHash) 과 공유하는 것이 없다
7
9
  */
8
10
  export declare const ROUTE_METHODS: readonly ["GET", "POST", "PUT", "PATCH", "DELETE"];
@@ -15,10 +17,40 @@ export interface RouteContext {
15
17
  signal: AbortSignal;
16
18
  /** 자원 갱신 알림 (§12.5). 명령어 ctx.resourceUpdated 와 같음 (state 없음 = no-op) */
17
19
  resourceUpdated(uri: string): Promise<void>;
20
+ /** 설정 auth 가 만든 주체. 모듈이 export auth (true · "optional") 를 둔 route 만, 그 외 undefined */
21
+ principal?: Principal;
18
22
  }
19
23
  /** routes/ 모듈의 GET · POST · PUT · PATCH · DELETE export */
20
24
  export type RouteHandler = (request: Request, ctx: RouteContext) => Response | Promise<Response>;
21
- export type RouteModule = Partial<Record<RouteMethod, RouteHandler>>;
25
+ /**
26
+ * route 모듈의 선택 export.
27
+ * auth true = 설정 auth 필수 (anonymous · UNAUTHENTICATED = 401), "optional" = anonymous 허용 (UNAUTHENTICATED = 401). 없음 · false = auth 없음
28
+ * origin true = /mcp 와 같은 Origin 규칙 (server.allowedOrigins). 없음 · false = 검사 없음
29
+ * maxBodyBytes 양의 정수 = 본문 상한 (바이트), true = server.maxBodyBytes (기본 4 MiB). 없음 · false = 상한 없음. 넘으면 413
30
+ */
31
+ export interface RouteOptions {
32
+ auth?: RouteAuth;
33
+ origin?: boolean;
34
+ maxBodyBytes?: number | boolean;
35
+ }
36
+ export type RouteAuth = boolean | "optional";
37
+ export type RouteModule = Partial<Record<RouteMethod, RouteHandler>> & RouteOptions;
38
+ /**
39
+ * route 경계 판정 (mcp/http.ts 가 구현). Response = 그 응답으로 끝 (403 · 401 · 500), 그 외 = 통과
40
+ */
41
+ export interface RouteGuard {
42
+ /** export origin = true. Origin 헤더가 있고 허용 밖 = 403 */
43
+ origin(request: Request): Response | undefined;
44
+ /** export auth. 반환 Principal = ctx.principal */
45
+ authenticate(request: Request, auth: true | "optional", route: {
46
+ method: RouteMethod;
47
+ path: string;
48
+ }): Promise<Principal | Response>;
49
+ }
50
+ /** export auth · origin · maxBodyBytes 의 형식 문제. 없으면 undefined */
51
+ export declare function routeOptionsProblem(mod: Record<string, unknown>): string | undefined;
52
+ /** 적용 값: export (undefined 가 아니면, false 포함) > 설정 기본값 (routes) > 없음. 키별 독립 */
53
+ export declare function resolveRouteOptions(mod: RouteOptions, defaults: RouteOptions | undefined): RouteOptions;
22
54
  export interface ScannedRoute {
23
55
  /** URL 경로 패턴. routes/items/[id].ts → "/items/[id]", routes/index.ts → "/" */
24
56
  path: string;
@@ -62,6 +94,12 @@ export interface RouteDispatchOptions {
62
94
  log?: (line: string) => void;
63
95
  /** ctx.resourceUpdated. 기본 = no-op (uri 형식만 검사) */
64
96
  resourceUpdated?: (uri: string) => Promise<void>;
97
+ /** export origin · auth 판정 (HTTP 어댑터). 없으면 그 export 를 둔 route = 500 (구성 오류) */
98
+ guard?: RouteGuard;
99
+ /** export maxBodyBytes = true 의 상한 (server.maxBodyBytes). 기본 MAX_BODY_BYTES */
100
+ maxBodyBytes?: number;
101
+ /** 설정 routes: export 가 없는 키의 기본값 */
102
+ defaults?: RouteOptions;
65
103
  }
66
104
  /**
67
105
  * route 처리기. 맞는 route 없음 = undefined (호출자가 404).