Skip to content

Commit eebdb13

Browse files
authored
deps!: migrate MCP adapter to @modelcontextprotocol/sdk v2 (#156)
1 parent e7a67e2 commit eebdb13

16 files changed

Lines changed: 136 additions & 62 deletions

File tree

‎docs/adapters/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ outline: deep
66

77
An adapter takes a `DevframeDefinition` and deploys it into a specific runtime — a standalone CLI, a Vite plugin, a static snapshot, an embedded host, or an MCP server. Each adapter ships at its own entry point (`devframe/adapters/<name>`); the bundler pulls in only the ones you use.
88

9-
Every adapter factory has the shape `createXxx(devframeDef, options?)`. Some adapters draw on an optional peer dependency, installed only when you opt into that adapter: `cac` pulls in [`cac`](https://github.com/cacjs/cac), and `mcp` pulls in [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk).
9+
Every adapter factory has the shape `createXxx(devframeDef, options?)`. Some adapters draw on an optional peer dependency, installed only when you opt into that adapter: `cac` pulls in [`cac`](https://github.com/cacjs/cac), and `mcp` pulls in [`@modelcontextprotocol/server`](https://github.com/modelcontextprotocol/typescript-sdk).
1010

1111
## Comparison
1212

‎docs/adapters/mcp.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import devframe from './devframe'
1616
await createMcpServer(devframe, { transport: 'stdio' })
1717
```
1818

19-
`@modelcontextprotocol/sdk` is a peer dependency — install it when shipping MCP support. `createMcpServer` speaks the `stdio` transport, spawned per session by the client.
19+
`@modelcontextprotocol/server` is a peer dependency — install it when shipping MCP support. `createMcpServer` speaks the `stdio` transport, spawned per session by the client.
2020

2121
## Route-based server
2222

‎docs/errors/DF0017.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ The agent-native surface is experimental and may change without a major version
1616

1717
The MCP server failed while initializing. Common reasons:
1818

19-
- `@modelcontextprotocol/sdk` is not installed. This is a peer dependency — add it to your devtool's dependencies.
19+
- `@modelcontextprotocol/server` is not installed. This is a peer dependency — add it to your devtool's dependencies.
2020
- The stdio transport threw during `connect()` (e.g. stdin/stdout is not available).
2121
- The route-based MCP server (`cli.mcp`) could not load its transport module — usually the missing SDK peer dependency.
2222

2323
## Fix
2424

25-
- **Missing SDK**: `pnpm add @modelcontextprotocol/sdk` (or npm/yarn equivalent) in the package that imports `devframe/adapters/mcp` or enables `cli.mcp`.
25+
- **Missing SDK**: `pnpm add @modelcontextprotocol/server` (or npm/yarn equivalent) in the package that imports `devframe/adapters/mcp` or enables `cli.mcp`.
2626
- **Transport init failure**: check the underlying error (attached as `cause`) for specifics.
2727

2828
## Source

‎docs/guide/agent-native.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ const devframe = defineDevframe({ /* … */ })
9999
await createMcpServer(devframe, { transport: 'stdio' })
100100
```
101101

102-
`@modelcontextprotocol/sdk` is a peer dependency — add it to your package when you want to ship an MCP-enabled devframe.
102+
`@modelcontextprotocol/server` is a peer dependency — add it to your package when you want to ship an MCP-enabled devframe.
103103

104104
## Connecting Claude Desktop
105105

‎docs/guide/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Devframe keeps its surface focused on one tool, so the same definition stays por
4040
pnpm add devframe
4141
```
4242

43-
`devframe` ships ESM-only and has no Vite dependency. Adapters with optional peers (the MCP adapter needs `@modelcontextprotocol/sdk`) surface the requirement at import time.
43+
`devframe` ships ESM-only and has no Vite dependency. Adapters with optional peers (the MCP adapter needs `@modelcontextprotocol/server`) surface the requirement at import time.
4444

4545
## Hello, Devframe
4646

‎packages/devframe/package.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@
7070
"prepack": "pnpm build && mkdir -p ./skills && cp -r ../../skills/devframe ./skills/devframe"
7171
},
7272
"peerDependencies": {
73-
"@modelcontextprotocol/sdk": "^1.0.0",
73+
"@modelcontextprotocol/server": "^2.0.0",
7474
"cac": "^7.0.0"
7575
},
7676
"peerDependenciesMeta": {
77-
"@modelcontextprotocol/sdk": {
77+
"@modelcontextprotocol/server": {
7878
"optional": true
7979
},
8080
"cac": {
@@ -94,7 +94,8 @@
9494
"valibot": "catalog:deps"
9595
},
9696
"devDependencies": {
97-
"@modelcontextprotocol/sdk": "catalog:deps",
97+
"@modelcontextprotocol/client": "catalog:deps",
98+
"@modelcontextprotocol/server": "catalog:deps",
9899
"cac": "catalog:deps",
99100
"get-port-please": "catalog:deps",
100101
"immer": "catalog:deps",

‎packages/devframe/src/adapters/mcp/__tests__/mcp-http.test.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { StartedServer } from '../../../node/server'
22
import type { DevframeDefinition } from '../../../types/devframe'
3-
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
4-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
3+
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client'
54
import { afterEach, describe, expect, it } from 'vitest'
65
import { createDevServer } from '../../dev'
76

‎packages/devframe/src/adapters/mcp/__tests__/mcp-server.test.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { DevframeHost } from '../../../types/host'
2-
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
3-
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'
2+
import { Client, InMemoryTransport } from '@modelcontextprotocol/client'
43
import { createHostContext } from 'devframe/node'
54
import { describe, expect, it } from 'vitest'
65
import { buildMcpServerFromContext } from '../build-server'

‎packages/devframe/src/adapters/mcp/build-server.ts‎

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1+
import type { Tool } from '@modelcontextprotocol/server'
12
import type { RpcFunctionDefinitionAnyWithContext } from 'devframe/rpc'
23
import type { AgentTool, DevframeDefinition, DevframeHost, DevframeNodeContext } from 'devframe/types'
34
import type { GenericSchema } from 'valibot'
45
import { homedir } from 'node:os'
56
import process from 'node:process'
6-
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
7-
import {
8-
CallToolRequestSchema,
9-
ListResourcesRequestSchema,
10-
ListToolsRequestSchema,
11-
ReadResourceRequestSchema,
12-
} from '@modelcontextprotocol/sdk/types.js'
7+
import { Server } from '@modelcontextprotocol/server'
138
import { createHostContext } from 'devframe/node'
149
import { join } from 'pathe'
1510
import { diagnostics } from '../../node/diagnostics'
@@ -152,12 +147,12 @@ export async function createMcpServer(
152147
}
153148

154149
function registerToolHandlers(server: Server, ctx: DevframeNodeContext): void {
155-
server.setRequestHandler(ListToolsRequestSchema, async () => {
150+
server.setRequestHandler('tools/list', async () => {
156151
const tools = ctx.agent.list().tools.map(tool => projectTool(tool, ctx))
157152
return { tools }
158153
})
159154

160-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
155+
server.setRequestHandler('tools/call', async (request) => {
161156
const { name, arguments: args } = request.params
162157
try {
163158
const tool = ctx.agent.getTool(name)
@@ -194,7 +189,7 @@ function registerResourceHandlers(
194189
ctx: DevframeNodeContext,
195190
exposeSharedState: boolean | ((key: string) => boolean),
196191
): void {
197-
server.setRequestHandler(ListResourcesRequestSchema, async () => {
192+
server.setRequestHandler('resources/list', async () => {
198193
const resources = ctx.agent.list().resources.map(resource => ({
199194
uri: resource.uri,
200195
name: resource.name,
@@ -219,7 +214,7 @@ function registerResourceHandlers(
219214
return { resources }
220215
})
221216

222-
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
217+
server.setRequestHandler('resources/read', async (request) => {
223218
const { uri } = request.params
224219
const parsed = parseResourceUri(uri)
225220

@@ -253,7 +248,7 @@ function registerResourceHandlers(
253248
})
254249
}
255250

256-
function projectTool(tool: AgentTool, ctx: DevframeNodeContext): Record<string, unknown> {
251+
function projectTool(tool: AgentTool, ctx: DevframeNodeContext): Tool {
257252
const inputSchema = tool.inputSchema ?? computeInputSchema(tool, ctx)
258253
const outputSchema = tool.outputSchema ?? computeOutputSchema(tool, ctx)
259254
return {
@@ -267,7 +262,7 @@ function projectTool(tool: AgentTool, ctx: DevframeNodeContext): Record<string,
267262
readOnlyHint: tool.safety === 'read',
268263
destructiveHint: tool.safety === 'destructive',
269264
},
270-
}
265+
} as Tool
271266
}
272267

273268
function computeInputSchema(tool: AgentTool, ctx: DevframeNodeContext): unknown {

‎packages/devframe/src/adapters/mcp/http.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import type { DevframeNodeContext } from 'devframe/types'
22
import type { H3, H3Event } from 'h3'
33
import { randomUUID } from 'node:crypto'
4-
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js'
5-
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'
4+
import { isInitializeRequest, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server'
65
import { isAllowedOrigin } from 'devframe/rpc/transports/ws-server'
76
import { defineHandler } from 'h3'
87
import { buildMcpServerFromContext } from './build-server'

0 commit comments

Comments
 (0)