Remove MCP transport type assertion

This commit is contained in:
elpresidank 2026-06-04 05:50:30 -05:00
parent 3378b79fbc
commit 21620cbf8d
2 changed files with 57 additions and 1 deletions

View file

@ -465,6 +465,22 @@ Notes:
- `bun run --cwd ts/packages/flow test -- src/__tests__/text-completion-common.test.ts` - `bun run --cwd ts/packages/flow test -- src/__tests__/text-completion-common.test.ts`
- `cd ts && bun run check:tsgo` - `cd ts && bun run check:tsgo`
### 2026-06-04: MCP Tool Transport Adapter Slice
- Status: migrated and package-verified.
- Completed:
- `ts/packages/flow/src/agent/mcp-tool/service.ts` no longer uses an
`as unknown as Parameters<Client["connect"]>[0]` assertion when connecting
the MCP SDK client.
- The concrete `StreamableHTTPClientTransport` is wrapped in a small
`Transport` adapter that forwards callbacks, send, close, and protocol
version updates while avoiding the SDK's exact-optional `sessionId` type
mismatch.
- The transport release path still closes the concrete SDK transport.
- Verification:
- `bun run --cwd ts/packages/flow test`
- `cd ts && bun run check:tsgo`
### 2026-06-02: RAG And Agent Requestor Bridge Slice ### 2026-06-02: RAG And Agent Requestor Bridge Slice
- Status: migrated, root-verified, committed, and pushed. - Status: migrated, root-verified, committed, and pushed.

View file

@ -12,6 +12,7 @@
import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
import { NodeRuntime } from "@effect/platform-node"; import { NodeRuntime } from "@effect/platform-node";
import { import {
@ -100,6 +101,44 @@ const closeTransport = (
), ),
); );
const transportAdapter = (transport: StreamableHTTPClientTransport): Transport => {
const clientTransport: Transport = {
start: () => {
const onclose = clientTransport.onclose;
if (onclose === undefined) {
delete transport.onclose;
} else {
transport.onclose = onclose;
}
const onerror = clientTransport.onerror;
if (onerror === undefined) {
delete transport.onerror;
} else {
transport.onerror = onerror;
}
const onmessage = clientTransport.onmessage;
if (onmessage === undefined) {
delete transport.onmessage;
} else {
transport.onmessage = (message) => onmessage(message);
}
return transport.start();
},
send: (message, options) =>
transport.send(message, {
...(options?.resumptionToken === undefined ? {} : { resumptionToken: options.resumptionToken }),
...(options?.onresumptiontoken === undefined ? {} : { onresumptiontoken: options.onresumptiontoken }),
}),
close: () => transport.close(),
setProtocolVersion: (version) => transport.setProtocolVersion(version),
};
return clientTransport;
};
const loadMcpServices = Effect.fn("McpToolRuntime.loadMcpServices")(function* ( const loadMcpServices = Effect.fn("McpToolRuntime.loadMcpServices")(function* (
config: Record<string, unknown>, config: Record<string, unknown>,
version: number, version: number,
@ -165,11 +204,12 @@ const invokeConfiguredTool = Effect.fn("McpToolRuntime.invokeTool")(function* (
url, url,
{ requestInit: { headers } }, { requestInit: { headers } },
); );
const clientTransport = transportAdapter(transport);
const client = new Client({ name: "trustgraph-mcp-client", version: "1.0.0" }); const client = new Client({ name: "trustgraph-mcp-client", version: "1.0.0" });
const result = yield* Effect.acquireUseRelease( const result = yield* Effect.acquireUseRelease(
Effect.tryPromise({ Effect.tryPromise({
try: () => client.connect(transport as unknown as Parameters<Client["connect"]>[0]), try: () => client.connect(clientTransport),
catch: (cause) => mcpToolError("connect", cause, name), catch: (cause) => mcpToolError("connect", cause, name),
}).pipe(Effect.as(client)), }).pipe(Effect.as(client)),
(connectedClient) => (connectedClient) =>