Skip to content

Commit 4cfc2e0

Browse files
committed
feat: streamable http
1 parent 7f9588f commit 4cfc2e0

File tree

11 files changed

+126
-25
lines changed

11 files changed

+126
-25
lines changed

examples/browser-mcp/test/browser-mcp-client.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "cloudflare:test";
66
import { describe, it, expect, beforeEach, afterEach } from "vitest";
77
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8-
import { WorkerSSEClientTransport } from "@nullshot/test-utils/mcp/WorkerSSEClientTransport";
8+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils/mcp/WorkerStreamableHTTPClientTransport";
99

1010
// Define response types for clarity
1111
interface ToolResponse {
@@ -84,8 +84,8 @@ describe("Browser MCP Client Integration Tests", () => {
8484

8585
// Helper function to create the transport
8686
function createTransport(ctx: ExecutionContext) {
87-
const url = new URL(`${baseUrl}/sse`);
88-
return new WorkerSSEClientTransport(url, ctx);
87+
const url = new URL(`${baseUrl}/mcp`);
88+
return new WorkerStreamableHTTPClientTransport(url, ctx);
8989
}
9090

9191
// Helper function to check if a tool call involves browser rendering
@@ -124,7 +124,7 @@ describe("Browser MCP Client Integration Tests", () => {
124124
});
125125

126126
it("should successfully connect to the browser MCP server", async () => {
127-
console.log(`Testing SSE transport connection`);
127+
console.log(`Testing StreamableHTTP transport connection`);
128128

129129
const transport = createTransport(ctx);
130130
await client.connect(transport);

examples/crud-mcp/test/todo-mcp-client.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "cloudflare:test";
66
import { describe, it, expect, beforeEach, afterEach } from "vitest";
77
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8-
import { WorkerSSEClientTransport } from "@nullshot/test-utils/mcp/WorkerSSEClientTransport";
8+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils/mcp/WorkerStreamableHTTPClientTransport";
99
import { TodoStatus, Todo } from "../src/schema";
1010

1111
// Define response type for clarity
@@ -62,8 +62,8 @@ describe("Todo MCP Client Integration Tests", () => {
6262

6363
// Helper function to create the transport
6464
function createTransport(ctx: ExecutionContext) {
65-
const url = new URL(`${baseUrl}/sse`);
66-
return new WorkerSSEClientTransport(url, ctx);
65+
const url = new URL(`${baseUrl}/mcp`);
66+
return new WorkerStreamableHTTPClientTransport(url, ctx);
6767
}
6868

6969
// Test for basic functionality
@@ -77,7 +77,7 @@ describe("Todo MCP Client Integration Tests", () => {
7777
});
7878

7979
it("should successfully connect to the todo MCP server", async () => {
80-
console.log(`Testing SSE transport connection`);
80+
console.log(`Testing StreamableHTTP transport connection`);
8181

8282
const transport = createTransport(ctx);
8383
await client.connect(transport);

examples/email-mcp/test/email-mcp-client.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "cloudflare:test";
66
import { describe, it, expect, beforeEach, afterEach } from "vitest";
77
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8-
import { WorkerSSEClientTransport } from "@nullshot/test-utils/mcp/WorkerSSEClientTransport";
8+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils/mcp/WorkerStreamableHTTPClientTransport";
99

1010
// Define response type for clarity
1111
interface ToolResponse {
@@ -60,12 +60,12 @@ describe("Email MCP Client Integration Tests", () => {
6060
});
6161

6262
function createTransport(ctx: ExecutionContext) {
63-
const url = new URL(`${baseUrl}/sse`);
64-
return new WorkerSSEClientTransport(url, ctx);
63+
const url = new URL(`${baseUrl}/mcp`);
64+
return new WorkerStreamableHTTPClientTransport(url, ctx);
6565
}
6666

6767
it("should successfully connect to the email MCP server", async () => {
68-
console.log(`Testing SSE transport connection`);
68+
console.log(`Testing StreamableHTTP transport connection`);
6969

7070
const transport = createTransport(ctx);
7171
await client.connect(transport);

examples/expense-mcp/test/expense-mcp-client.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "cloudflare:test";
66
import { describe, it, expect, beforeEach, afterEach } from "vitest";
77
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8-
import { WorkerSSEClientTransport } from "@nullshot/test-utils/mcp/WorkerSSEClientTransport";
8+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils/mcp/WorkerStreamableHTTPClientTransport";
99
import { Expense } from "../src/repository";
1010

1111
// Define response type for clarity
@@ -51,8 +51,8 @@ describe("Expense MCP Client Integration Tests", () => {
5151
});
5252

5353
function createTransport(ctx: ExecutionContext) {
54-
const url = new URL(`${baseUrl}/sse`);
55-
return new WorkerSSEClientTransport(url, ctx);
54+
const url = new URL(`${baseUrl}/mcp`);
55+
return new WorkerStreamableHTTPClientTransport(url, ctx);
5656
}
5757

5858
it("should initialize the client properly", () => {
@@ -62,7 +62,7 @@ describe("Expense MCP Client Integration Tests", () => {
6262
});
6363

6464
it("should successfully connect to the expense MCP server", async () => {
65-
console.log(`Testing SSE transport connection`);
65+
console.log(`Testing StreamableHTTP transport connection`);
6666

6767
const transport = createTransport(ctx);
6868
await client.connect(transport);

examples/vectorize-mcp/test/vectorize-mcp-client.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "cloudflare:test";
66
import { describe, it, expect, beforeEach, afterEach } from "vitest";
77
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8-
import { WorkerSSEClientTransport } from "@nullshot/test-utils/mcp/WorkerSSEClientTransport";
8+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils/mcp/WorkerStreamableHTTPClientTransport";
99
import { VectorDocument } from "../src/schema";
1010

1111
// Define response type for clarity
@@ -51,8 +51,8 @@ describe("Vectorize MCP Client Integration Tests", () => {
5151
});
5252

5353
function createTransport(ctx: ExecutionContext) {
54-
const url = new URL(`${baseUrl}/sse`);
55-
return new WorkerSSEClientTransport(url, ctx);
54+
const url = new URL(`${baseUrl}/mcp`);
55+
return new WorkerStreamableHTTPClientTransport(url, ctx);
5656
}
5757

5858
it("should initialize the client properly", () => {
@@ -62,7 +62,7 @@ describe("Vectorize MCP Client Integration Tests", () => {
6262
});
6363

6464
it("should successfully connect to the vectorize MCP server", async () => {
65-
console.log(`Testing SSE transport connection`);
65+
console.log(`Testing StreamableHTTP transport connection`);
6666

6767
const transport = createTransport(ctx);
6868
await client.connect(transport);

packages/cli/AGENTS.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# AGENTS.md
2+
3+
## Build/Run Commands
4+
- Build: `pnpm run build` (uses tsc)
5+
- Dev mode: `pnpm run dev` (tsx watch)
6+
- Run tests: `pnpm run test` (vitest)
7+
- Run single test: `pnpm run test <test-file-pattern>`
8+
- Test watch mode: `pnpm run test:watch`
9+
- Lint: `pnpm run lint` (eslint)
10+
- Lint fix: `pnpm run lint:fix`
11+
- Typecheck: `pnpm run typecheck` (tsc --noEmit)
12+
- Format: `pnpm run format` (prettier)
13+
- Format check: `pnpm run format:check`
14+
15+
## Code Style Guidelines
16+
- Use double quotes for strings
17+
- No semicolons
18+
- Use tabs for indentation (TSConfig sets this)
19+
- Strict TypeScript with all strict flags enabled
20+
- No unused locals/parameters
21+
- Exact optional property types
22+
- No implicit returns/fallthrough cases
23+
- No unchecked indexed access
24+
- Use ESNext target and modules
25+
- Import paths use `@/*` alias for src/
26+
- Declaration files and source maps generated
27+
- Resolve JSON modules enabled
28+
29+
## Naming Conventions
30+
- Files: kebab-case
31+
- Types: PascalCase
32+
- Functions/variables: camelCase
33+
- Constants: UPPER_SNAKE_CASE
34+
- Test files: *.test.ts
35+
36+
## Error Handling
37+
- Use custom error classes from utils/errors.ts
38+
- Always provide meaningful error messages
39+
- Use logger.ts for consistent logging
40+
- Handle dry-run mode in all mutating operations
41+
42+
## Testing
43+
- Use vitest with globals
44+
- Place tests alongside source files
45+
- Use .test.ts extension
46+
- Mock filesystem with memfs where needed

packages/mcp/test/mcp-client.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { env, createExecutionContext, waitOnExecutionContext } from 'cloudflare:test';
22
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
33
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4-
import { WorkerSSEClientTransport } from '../../test-utils/src/mcp/WorkerSSEClientTransport';
4+
import { WorkerStreamableHTTPClientTransport } from '../../test-utils/src/mcp/WorkerStreamableHTTPClientTransport';
55
import { WorkerWebSocketClientTransport } from '../../test-utils/src/mcp/WorkerWebSocketClientTransport';
66

77
// Define response type for clarity
@@ -25,6 +25,13 @@ describe('MCP Client Connection Tests', () => {
2525
return new WorkerSSEClientTransport(url, ctx);
2626
}
2727
},
28+
{
29+
name: 'StreamableHTTP',
30+
createTransport: (ctx: ExecutionContext) => {
31+
const url = new URL(`${baseUrl}/mcp`);
32+
return new WorkerStreamableHTTPClientTransport(url, ctx);
33+
}
34+
},
2835
{
2936
name: 'WebSocket',
3037
createTransport: (ctx: ExecutionContext) => {

packages/test-utils/README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ This package provides utilities for testing MCP applications, particularly in Cl
1414

1515
### Available Utilities
1616

17-
- `WorkerSSEClientTransport`: A client transport for Server-Sent Events (SSE) in Worker environments
17+
- `WorkerSSEClientTransport`: A client transport for Server-Sent Events (SSE) in Worker environments (deprecated)
18+
- `WorkerStreamableHTTPClientTransport`: A client transport for Streamable HTTP in Worker environments (recommended)
1819
- `WorkerWebSocketClientTransport`: A client transport for WebSocket connections in Worker environments
1920

2021
### Example
2122

2223
```typescript
23-
import { WorkerSSEClientTransport } from "@nullshot/test-utils";
24+
import { WorkerStreamableHTTPClientTransport } from "@nullshot/test-utils";
2425

2526
// Set up test client
26-
const transport = new WorkerSSEClientTransport({
27-
endpoint: "https://your-worker.example.com/sse",
27+
const transport = new WorkerStreamableHTTPClientTransport({
28+
endpoint: "https://your-worker.example.com/mcp",
2829
});
2930

3031
// Use in tests

packages/test-utils/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
"import": "./dist/mcp/WorkerSSEClientTransport.js",
1818
"default": "./dist/mcp/WorkerSSEClientTransport.js"
1919
},
20+
"./mcp/WorkerStreamableHTTPClientTransport": {
21+
"types": "./dist/mcp/WorkerStreamableHTTPClientTransport.d.ts",
22+
"import": "./dist/mcp/WorkerStreamableHTTPClientTransport.js",
23+
"default": "./dist/mcp/WorkerStreamableHTTPClientTransport.js"
24+
},
2025
"./mcp/WorkerWebSocketClientTransport": {
2126
"types": "./dist/mcp/WorkerWebSocketClientTransport.d.ts",
2227
"import": "./dist/mcp/WorkerWebSocketClientTransport.js",

packages/test-utils/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// This is a substantial change to force a version bump
55
// This comment should make the diff large enough to be recognized
66
export * from "./mcp/WorkerSSEClientTransport.js";
7+
export * from "./mcp/WorkerStreamableHTTPClientTransport.js";
78
export * from "./mcp/WorkerWebSocketClientTransport.js"; // Force version bump comment
89

910
// Export vitest utilities

0 commit comments

Comments
 (0)