| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import { describe, expect } from "bun:test"
- import { Server } from "@modelcontextprotocol/sdk/server/index.js"
- import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js"
- import { ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"
- import { LayerNode } from "@kirincode-ai/core/effect/layer-node"
- import { Effect } from "effect"
- import { testEffect } from "../lib/effect"
- import { MCP } from "../../src/mcp/index"
- const it = testEffect(LayerNode.compile(MCP.node))
- const serve = Effect.acquireRelease(
- Effect.promise(async () => {
- const requests: Headers[] = []
- const protocol = new Server({ name: "headers", version: "1.0.0" }, { capabilities: { tools: {} } })
- protocol.setRequestHandler(ListToolsRequestSchema, () => Promise.resolve({ tools: [] }))
- const transport = new WebStandardStreamableHTTPServerTransport({
- sessionIdGenerator: () => crypto.randomUUID(),
- enableJsonResponse: true,
- })
- await protocol.connect(transport)
- const http = Bun.serve({
- port: 0,
- fetch(request) {
- requests.push(new Headers(request.headers))
- return transport.handleRequest(request)
- },
- })
- return {
- requests,
- url: http.url.toString(),
- close: async () => {
- await http.stop(true)
- await protocol.close()
- },
- }
- }),
- (server) => Effect.promise(server.close),
- )
- describe("mcp.headers", () => {
- it.instance("headers are passed to transports when oauth is enabled (default)", () =>
- Effect.gen(function* () {
- const server = yield* serve
- const mcp = yield* MCP.Service
- const result = yield* mcp.add("test-server", {
- type: "remote",
- url: server.url,
- headers: {
- Authorization: "Bearer test-token",
- "X-Custom-Header": "custom-value",
- },
- })
- expect(result.status).toMatchObject({ "test-server": { status: "connected" } })
- expect(server.requests.length).toBeGreaterThan(0)
- for (const headers of server.requests) {
- expect(headers.get("authorization")).toBe("Bearer test-token")
- expect(headers.get("x-custom-header")).toBe("custom-value")
- }
- }),
- )
- it.instance("headers are passed to transports when oauth is explicitly disabled", () =>
- Effect.gen(function* () {
- const server = yield* serve
- const mcp = yield* MCP.Service
- const result = yield* mcp.add("test-server-no-oauth", {
- type: "remote",
- url: server.url,
- oauth: false,
- headers: {
- Authorization: "Bearer test-token",
- },
- })
- expect(result.status).toMatchObject({ "test-server-no-oauth": { status: "connected" } })
- expect(server.requests.length).toBeGreaterThan(0)
- for (const headers of server.requests) {
- expect(headers.get("authorization")).toBe("Bearer test-token")
- }
- }),
- )
- it.instance("no requestInit when headers are not provided", () =>
- Effect.gen(function* () {
- const server = yield* serve
- const mcp = yield* MCP.Service
- const result = yield* mcp.add("test-server-no-headers", {
- type: "remote",
- url: server.url,
- })
- expect(result.status).toMatchObject({ "test-server-no-headers": { status: "connected" } })
- expect(server.requests.length).toBeGreaterThan(0)
- for (const headers of server.requests) {
- expect(headers.has("authorization")).toBe(false)
- expect(headers.has("x-custom-header")).toBe(false)
- }
- }),
- )
- })
|