1import { assert, describe, it } from "@effect/vitest"
2import * as McpProtocol from "effect/ai/McpProtocol"
3import * as McpSchema from "effect/ai/McpSchema"
4import * as Effect from "effect/Effect"
5import * as BaseProtocolTest from "./McpConformance/BaseProtocolTest.ts"
6import * as CompletionTest from "./McpConformance/CompletionTest.ts"
7import * as ElicitationTest from "./McpConformance/ElicitationTest.ts"
8import * as LifecycleTest from "./McpConformance/LifecycleTest.ts"
9import * as LoggingTest from "./McpConformance/LoggingTest.ts"
10import { layer as makeMcpConformanceLayer, McpConformance } from "./McpConformance/McpConformance.ts"
11import * as PromptsTest from "./McpConformance/PromptsTest.ts"
12import * as ResourcesTest from "./McpConformance/ResourcesTest.ts"
13import * as RootsTest from "./McpConformance/RootsTest.ts"
14import * as SamplingTest from "./McpConformance/SamplingTest.ts"
15import * as ToolsTest from "./McpConformance/ToolsTest.ts"
16import * as TransportsTest from "./McpConformance/TransportsTest.ts"
17import * as UtilitiesTest from "./McpConformance/UtilitiesTest.ts"
18
19const protocol = McpProtocol.v2025_11_25
20const testLayer = makeMcpConformanceLayer(protocol)
21
22LifecycleTest.suite(protocol, testLayer)
23BaseProtocolTest.suite(protocol, testLayer)
24BaseProtocolTest.statefulLegacySuite(protocol, testLayer)
25TransportsTest.suite(protocol, testLayer)
26UtilitiesTest.suite(protocol, testLayer)
27UtilitiesTest.statefulLegacySuite(protocol, testLayer)
28ToolsTest.suite(protocol, testLayer)
29ToolsTest.statefulLegacySuite(protocol, testLayer)
30ResourcesTest.suite(protocol, testLayer)
31ResourcesTest.statefulLegacySuite(protocol, testLayer)
32PromptsTest.suite(protocol, testLayer)
33PromptsTest.statefulLegacySuite(protocol, testLayer)
34CompletionTest.suite(protocol, testLayer)
35LoggingTest.suite(protocol, testLayer)
36RootsTest.suite(protocol, testLayer)
37SamplingTest.suite(protocol, testLayer)
38ElicitationTest.suite(protocol, testLayer)
39
40it.layer(testLayer)(`Mcp Conformance (${protocol.protocolVersion})`, (it) => {
41 describe("Tools", () => {
42 it.effect("does not expose experimental Tasks without an extension", () =>
43 Effect.gen(function*() {
44 const test = yield* McpConformance
45 const initialized = yield* test.initialize({ server: "features" })
46 yield* test.notifyInitialized(initialized)
47 const before = (yield* test.observations).toolInvocations
48 const response = yield* test.send(initialized, {
49 jsonrpc: "2.0",
50 id: 2,
51 method: "tasks/get",
52 params: { taskId: "task-1" }
53 })
54 const error = yield* test.decodeError(response)
55
56 assert.strictEqual(error.error.code, McpSchema.METHOD_NOT_FOUND_ERROR_CODE)
57 assert.strictEqual((yield* test.observations).toolInvocations, before)
58 }))
59 })
60})