Skip to content

Commit 7689c21

Browse files
committed
Address PR #1680 review feedback: parseJSONRPCMessage, migration docs, export fixes
- Add parseJSONRPCMessage() to public API as alternative to raw JSONRPCMessageSchema - Fix migration docs to reference @modelcontextprotocol/client or /server instead of /core - Add InMemoryTransport removal migration entry - Export CrossAppAccessProvider and related types from client package (from SEP-990 merge)
1 parent 25e73e6 commit 7689c21

5 files changed

Lines changed: 57 additions & 23 deletions

File tree

docs/migration-SKILL.md

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,16 @@ Replace all `@modelcontextprotocol/sdk/...` imports using this table.
6161

6262
| v1 import path | v2 package |
6363
| ------------------------------------------------- | ---------------------------- |
64-
| `@modelcontextprotocol/sdk/types.js` | `@modelcontextprotocol/core` |
65-
| `@modelcontextprotocol/sdk/shared/protocol.js` | `@modelcontextprotocol/core` |
66-
| `@modelcontextprotocol/sdk/shared/transport.js` | `@modelcontextprotocol/core` |
67-
| `@modelcontextprotocol/sdk/shared/stdio.js` | `@modelcontextprotocol/core` |
68-
| `@modelcontextprotocol/sdk/shared/uriTemplate.js` | `@modelcontextprotocol/core` |
69-
| `@modelcontextprotocol/sdk/shared/auth.js` | `@modelcontextprotocol/core` |
64+
| `@modelcontextprotocol/sdk/types.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
65+
| `@modelcontextprotocol/sdk/shared/protocol.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
66+
| `@modelcontextprotocol/sdk/shared/transport.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
67+
| `@modelcontextprotocol/sdk/shared/uriTemplate.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
68+
| `@modelcontextprotocol/sdk/shared/auth.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
7069

7170
Notes:
7271

73-
- `@modelcontextprotocol/client` and `@modelcontextprotocol/server` both re-export everything from `@modelcontextprotocol/core`, so you can import types from whichever package you already depend on.
72+
- `@modelcontextprotocol/client` and `@modelcontextprotocol/server` both re-export shared types from `@modelcontextprotocol/core`, so import from whichever package you already depend on. Do not import from `@modelcontextprotocol/core` directly — it is an internal package.
7473
- When multiple v1 imports map to the same v2 package, consolidate them into a single import statement.
75-
- If code imports from `sdk/client/...`, install `@modelcontextprotocol/client`. If from `sdk/server/...`, install `@modelcontextprotocol/server`. If from `sdk/types.js` or `sdk/shared/...` only, install `@modelcontextprotocol/core`.
7674

7775
## 4. Renamed Symbols
7876

@@ -91,7 +89,7 @@ Notes:
9189
| `ResourceReference` | `ResourceTemplateReference` |
9290
| `ResourceReferenceSchema` | `ResourceTemplateReferenceSchema` |
9391
| `IsomorphicHeaders` | REMOVED (use Web Standard `Headers`) |
94-
| `AuthInfo` (from `server/auth/types.js`) | `AuthInfo` (now in `@modelcontextprotocol/core`) |
92+
| `AuthInfo` (from `server/auth/types.js`) | `AuthInfo` (now re-exported by `@modelcontextprotocol/client` and `@modelcontextprotocol/server`) |
9593
| `McpError` | `ProtocolError` |
9694
| `ErrorCode` | `ProtocolErrorCode` |
9795
| `ErrorCode.RequestTimeout` | `SdkErrorCode.RequestTimeout` |
@@ -144,7 +142,7 @@ Update error handling:
144142
if (error instanceof McpError && error.code === ErrorCode.RequestTimeout) { ... }
145143

146144
// v2
147-
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/core';
145+
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/client';
148146
if (error instanceof SdkError && error.code === SdkErrorCode.RequestTimeout) { ... }
149147
```
150148

@@ -158,7 +156,7 @@ if (error instanceof StreamableHTTPError) {
158156
}
159157

160158
// v2
161-
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/core';
159+
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/client';
162160
if (error instanceof SdkError && error.code === SdkErrorCode.ClientHttpFailedToOpenStream) {
163161
const status = (error.data as { status?: number })?.status;
164162
}
@@ -195,11 +193,11 @@ Update OAuth error handling:
195193

196194
```typescript
197195
// v1
198-
import { InvalidClientError, InvalidGrantError } from '@modelcontextprotocol/core';
196+
import { InvalidClientError, InvalidGrantError } from '@modelcontextprotocol/client';
199197
if (error instanceof InvalidClientError) { ... }
200198

201199
// v2
202-
import { OAuthError, OAuthErrorCode } from '@modelcontextprotocol/core';
200+
import { OAuthError, OAuthErrorCode } from '@modelcontextprotocol/client';
203201
if (error instanceof OAuthError && error.code === OAuthErrorCode.InvalidClient) { ... }
204202
```
205203

docs/migration.md

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,12 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
5252
```typescript
5353
import { Client, StreamableHTTPClientTransport, StdioClientTransport } from '@modelcontextprotocol/client';
5454
import { McpServer, StdioServerTransport, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
55-
import { CallToolResultSchema } from '@modelcontextprotocol/core';
5655

5756
// Node.js HTTP server transport is in the @modelcontextprotocol/node package
5857
import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
5958
```
6059

61-
Note: `@modelcontextprotocol/client` and `@modelcontextprotocol/server` both re-export everything from `@modelcontextprotocol/core`, so you can import types from whichever package you already depend on.
60+
Note: `@modelcontextprotocol/client` and `@modelcontextprotocol/server` both re-export shared types from `@modelcontextprotocol/core`, so you can import types and error classes from whichever package you already depend on. Do not import from `@modelcontextprotocol/core` directly — it is an internal package.
6261

6362
### Dropped Node.js 18 and CommonJS
6463

@@ -419,6 +418,22 @@ const client = new Client(
419418
);
420419
```
421420

421+
### `InMemoryTransport` removed from public API
422+
423+
`InMemoryTransport` has been removed from the public API surface. It was previously used for in-process client-server connections and testing.
424+
425+
For **testing**, import it directly from the internal core package:
426+
427+
```typescript
428+
// v1
429+
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
430+
431+
// v2 (testing only — @modelcontextprotocol/core is internal, not for production use)
432+
import { InMemoryTransport } from '@modelcontextprotocol/core';
433+
```
434+
435+
For **production in-process connections**, use `StreamableHTTPClientTransport` with a local server URL, or connect client and server via paired streams.
436+
422437
### Removed type aliases and deprecated exports
423438

424439
The following deprecated type aliases have been removed from `@modelcontextprotocol/core`:
@@ -434,7 +449,7 @@ The following deprecated type aliases have been removed from `@modelcontextproto
434449
| `IsomorphicHeaders` | Use Web Standard `Headers` |
435450
| `AuthInfo` (from `server/auth/types.js`) | `AuthInfo` (now in `@modelcontextprotocol/core`) |
436451

437-
All other types and schemas exported from `@modelcontextprotocol/sdk/types.js` retain their original names in `@modelcontextprotocol/core`.
452+
All other types and schemas exported from `@modelcontextprotocol/sdk/types.js` retain their original names — import them from `@modelcontextprotocol/client` or `@modelcontextprotocol/server`.
438453

439454
**Before (v1):**
440455

@@ -445,7 +460,7 @@ import { JSONRPCError, ResourceReference, isJSONRPCError } from '@modelcontextpr
445460
**After (v2):**
446461

447462
```typescript
448-
import { JSONRPCErrorResponse, ResourceTemplateReference, isJSONRPCErrorResponse } from '@modelcontextprotocol/core';
463+
import { JSONRPCErrorResponse, ResourceTemplateReference, isJSONRPCErrorResponse } from '@modelcontextprotocol/server';
449464
```
450465

451466
### Request handler context types
@@ -561,7 +576,7 @@ try {
561576
**After (v2):**
562577

563578
```typescript
564-
import { ProtocolError, ProtocolErrorCode, SdkError, SdkErrorCode } from '@modelcontextprotocol/core';
579+
import { ProtocolError, ProtocolErrorCode, SdkError, SdkErrorCode } from '@modelcontextprotocol/client';
565580

566581
try {
567582
await client.callTool({ name: 'test', arguments: {} });
@@ -618,7 +633,7 @@ try {
618633
**After (v2):**
619634

620635
```typescript
621-
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/core';
636+
import { SdkError, SdkErrorCode } from '@modelcontextprotocol/client';
622637

623638
try {
624639
await transport.send(message);
@@ -687,7 +702,7 @@ The `OAUTH_ERRORS` constant has also been removed.
687702
**Before (v1):**
688703

689704
```typescript
690-
import { InvalidClientError, InvalidGrantError, ServerError } from '@modelcontextprotocol/core';
705+
import { InvalidClientError, InvalidGrantError, ServerError } from '@modelcontextprotocol/client';
691706

692707
try {
693708
await refreshToken();
@@ -705,7 +720,7 @@ try {
705720
**After (v2):**
706721

707722
```typescript
708-
import { OAuthError, OAuthErrorCode } from '@modelcontextprotocol/core';
723+
import { OAuthError, OAuthErrorCode } from '@modelcontextprotocol/client';
709724

710725
try {
711726
await refreshToken();

packages/client/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,17 @@ export {
3636
UnauthorizedError
3737
} from './client/auth.js';
3838
export type {
39+
AssertionCallback,
3940
ClientCredentialsProviderOptions,
41+
CrossAppAccessContext,
42+
CrossAppAccessProviderOptions,
4043
PrivateKeyJwtProviderOptions,
4144
StaticPrivateKeyJwtProviderOptions
4245
} from './client/authExtensions.js';
4346
export {
4447
ClientCredentialsProvider,
4548
createPrivateKeyJwtAuth,
49+
CrossAppAccessProvider,
4650
PrivateKeyJwtProvider,
4751
StaticPrivateKeyJwtProvider
4852
} from './client/authExtensions.js';

packages/core/src/exports/public/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export { ProtocolErrorCode } from '../../types/enums.js';
9797
// Error classes
9898
export { ProtocolError, UrlElicitationRequiredError } from '../../types/errors.js';
9999

100-
// Type guards
100+
// Type guards and message parsing
101101
export {
102102
assertCompleteRequestPrompt,
103103
assertCompleteRequestResourceTemplate,
@@ -107,7 +107,8 @@ export {
107107
isJSONRPCNotification,
108108
isJSONRPCRequest,
109109
isJSONRPCResultResponse,
110-
isTaskAugmentedRequestParams
110+
isTaskAugmentedRequestParams,
111+
parseJSONRPCMessage
111112
} from '../../types/guards.js';
112113

113114
// Experimental task types and classes

packages/core/src/types/guards.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
InitializedNotificationSchema,
33
InitializeRequestSchema,
44
JSONRPCErrorResponseSchema,
5+
JSONRPCMessageSchema,
56
JSONRPCNotificationSchema,
67
JSONRPCRequestSchema,
78
JSONRPCResultResponseSchema,
@@ -14,12 +15,27 @@ import type {
1415
InitializedNotification,
1516
InitializeRequest,
1617
JSONRPCErrorResponse,
18+
JSONRPCMessage,
1719
JSONRPCNotification,
1820
JSONRPCRequest,
1921
JSONRPCResultResponse,
2022
TaskAugmentedRequestParams
2123
} from './types.js';
2224

25+
/**
26+
* Validates and parses an unknown value as a JSON-RPC message.
27+
*
28+
* Use this to validate incoming messages in custom transport implementations.
29+
* Throws if the value does not conform to the JSON-RPC message schema.
30+
*
31+
* @param value - The value to validate (typically a parsed JSON object).
32+
* @returns The validated {@linkcode JSONRPCMessage}.
33+
* @throws If validation fails.
34+
*/
35+
export function parseJSONRPCMessage(value: unknown): JSONRPCMessage {
36+
return JSONRPCMessageSchema.parse(value);
37+
}
38+
2339
export const isJSONRPCRequest = (value: unknown): value is JSONRPCRequest => JSONRPCRequestSchema.safeParse(value).success;
2440

2541
export const isJSONRPCNotification = (value: unknown): value is JSONRPCNotification => JSONRPCNotificationSchema.safeParse(value).success;

0 commit comments

Comments
 (0)