Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions packages/mcp-server-postgrest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,12 @@
"@supabase/sql-to-rest": "^0.1.8"
},
"peerDependencies": {
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/client": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"@supabase/auth-js": "^2.67.3",
"@total-typescript/tsconfig": "^1.0.4",
"@types/node": "^22.8.6",
Expand Down
3 changes: 2 additions & 1 deletion packages/mcp-server-postgrest/src/server.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { Client } from '@modelcontextprotocol/client';
import { AuthClient } from '@supabase/auth-js';
import { StreamTransport } from '@supabase/mcp-utils';
import { describe, expect, test } from 'vitest';

import { createPostgrestMcpServer } from './server.js';

// Requires local Supabase stack running
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp-server-postgrest/src/stdio.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node

import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { parseArgs } from 'node:util';
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';

import { createPostgrestMcpServer } from './server.js';

async function main() {
Expand Down
5 changes: 3 additions & 2 deletions packages/mcp-server-supabase/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,15 @@
"openapi-fetch": "^0.13.5"
},
"peerDependencies": {
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@ai-sdk/anthropic": "catalog:",
"@ai-sdk/mcp": "catalog:",
"@electric-sql/pglite": "^0.2.17",
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/client": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"@total-typescript/tsconfig": "^1.0.4",
"@types/common-tags": "^1.8.4",
"@types/node": "^22.8.6",
Expand Down
3 changes: 2 additions & 1 deletion packages/mcp-server-supabase/src/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { Client } from '@modelcontextprotocol/client';
import { StreamTransport } from '@supabase/mcp-utils';
import { describe, expect, test } from 'vitest';

import {
ACCESS_TOKEN,
API_URL,
Expand Down
14 changes: 6 additions & 8 deletions packages/mcp-server-supabase/src/server.test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import {
CallToolResultSchema,
type CallToolRequest,
} from '@modelcontextprotocol/sdk/types.js';
import { Client } from '@modelcontextprotocol/client';
import type { CallToolRequestParams } from '@modelcontextprotocol/client';
import { StreamTransport } from '@supabase/mcp-utils';
import { codeBlock, stripIndent } from 'common-tags';
import gqlmin from 'gqlmin';
import { http, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
import { globalRegistry } from 'zod/v4';

import {
ACCESS_TOKEN,
API_URL,
Expand Down Expand Up @@ -102,9 +100,9 @@ async function setup(options: SetupOptions = {}) {
*
* Wrapper around the `client.callTool` method to handle the response and errors.
*/
async function callTool(params: CallToolRequest['params']) {
async function callTool(params: CallToolRequestParams) {
const output = await client.callTool(params);
const { content } = CallToolResultSchema.parse(output);
const { content } = output;
const [textContent] = content;

if (!textContent) {
Expand Down Expand Up @@ -3671,7 +3669,7 @@ describe('tools', () => {
arguments: { schemas: ['public'] },
});

const result = CallToolResultSchema.parse(resultUntyped);
const result = resultUntyped;
const firstContent = result.content.at(0);
if (!firstContent) {
throw new Error('Expected content in tool response');
Expand Down
11 changes: 4 additions & 7 deletions packages/mcp-server-supabase/src/tools/util.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import {
CallToolResultSchema,
type CallToolRequest,
} from '@modelcontextprotocol/sdk/types.js';
import { Client } from '@modelcontextprotocol/client';
import type { CallToolRequestParams } from '@modelcontextprotocol/client';
import { createMcpServer, StreamTransport } from '@supabase/mcp-utils';
import { describe, expect, test } from 'vitest';
import { z } from 'zod/v4';
Expand Down Expand Up @@ -38,9 +35,9 @@ async function setup(tools: Record<string, ReturnType<typeof injectableTool>>) {
*
* Wrapper around the `client.callTool` method to handle the response and errors.
*/
async function callTool(params: CallToolRequest['params']) {
async function callTool(params: CallToolRequestParams) {
const output = await client.callTool(params);
const { content } = CallToolResultSchema.parse(output);
const { content } = output;
const [textContent] = content;

if (!textContent || textContent.type !== 'text') {
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp-server-supabase/src/transports/stdio.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node

import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { parseArgs } from 'node:util';
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';

import packageJson from '../../package.json' with { type: 'json' };
import { createSupabaseApiPlatform } from '../platform/api-platform.js';
import { createSupabaseMcpServer } from '../server.js';
Expand Down
12 changes: 7 additions & 5 deletions packages/mcp-server-supabase/test/stdio.integration.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { Client } from '@modelcontextprotocol/client';
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
import { describe, expect, test } from 'vitest';

import { ACCESS_TOKEN, MCP_CLIENT_NAME, MCP_CLIENT_VERSION } from './mocks.js';
import { LoggingMessageNotificationSchema } from '@modelcontextprotocol/sdk/types.js';

type SetupOptions = {
accessToken?: string;
Expand All @@ -23,7 +23,7 @@ async function setup(options: SetupOptions = {}) {
}
);

client.setNotificationHandler(LoggingMessageNotificationSchema, (message) => {
client.setNotificationHandler('notifications/message', (message) => {
const { level, data } = message.params;
if (level === 'error') {
console.error(data);
Expand Down Expand Up @@ -69,6 +69,8 @@ describe('stdio', () => {
test('missing access token fails', async () => {
const setupPromise = setup({ accessToken: null as any });

await expect(setupPromise).rejects.toThrow('MCP error -32000');
// v2 SDK change: a stdio server that exits during init surfaces a transport
// 'Connection closed' error to the client rather than v1's JSON-RPC 'MCP error -32000'.
await expect(setupPromise).rejects.toThrow('Connection closed');
});
});
5 changes: 3 additions & 2 deletions packages/mcp-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@
}
},
"peerDependencies": {
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"zod": "catalog:"
},
"devDependencies": {
"@modelcontextprotocol/sdk": "catalog:",
"@modelcontextprotocol/client": "catalog:",
"@modelcontextprotocol/server": "catalog:",
"@total-typescript/tsconfig": "^1.0.4",
"@types/node": "^22.8.6",
"prettier": "^3.3.3",
Expand Down
14 changes: 6 additions & 8 deletions packages/mcp-utils/src/server.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
import {
CallToolResultSchema,
type CallToolRequest,
} from '@modelcontextprotocol/sdk/types.js';
import { Client } from '@modelcontextprotocol/client';
import type { CallToolRequestParams } from '@modelcontextprotocol/client';
import type { Server } from '@modelcontextprotocol/server';
import { describe, expect, test, vi } from 'vitest';
import { z } from 'zod/v4';

import {
createMcpServer,
resource,
Expand Down Expand Up @@ -51,9 +49,9 @@ async function setup(options: SetupOptions) {
*
* Wrapper around the `client.callTool` method to handle the response and errors.
*/
async function callTool(params: CallToolRequest['params']) {
async function callTool(params: CallToolRequestParams) {
const output = await client.callTool(params);
const { content } = CallToolResultSchema.parse(output);
const { content } = output;
const [textContent] = content;

if (!textContent) {
Expand Down
55 changes: 20 additions & 35 deletions packages/mcp-utils/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import {
CallToolRequestSchema,
ListResourcesRequestSchema,
ListResourceTemplatesRequestSchema,
ListToolsRequestSchema,
ReadResourceRequestSchema,
type ClientCapabilities,
type Implementation,
type ListResourcesResult,
type ListResourceTemplatesResult,
type ReadResourceResult,
type ServerCapabilities,
type ListToolsResult,
type Tool as McpTool,
} from '@modelcontextprotocol/sdk/types.js';
import { z } from 'zod/v4';
import { Server } from '@modelcontextprotocol/server';
import type {
ExpandRecursively,
ExtractNotification,
ExtractParams,
ExtractRequest,
ExtractResult,
} from './types.js';
ClientCapabilities,
Implementation,
ListResourcesResult,
ListResourceTemplatesResult,
ListToolsResult,
Tool as McpTool,
ReadResourceResult,
ServerCapabilities,
} from '@modelcontextprotocol/server';
import { z } from 'zod/v4';

import type { ExtractParams } from './types.js';
import { assertValidUri, compareUris, matchUriTemplate } from './util.js';

export type Scheme = string;
Expand Down Expand Up @@ -340,7 +330,7 @@ export function createMcpServer(options: McpServerOptions) {

if (options.resources) {
server.setRequestHandler(
ListResourcesRequestSchema,
'resources/list',
async (): Promise<ListResourcesResult> => {
const allResources = await getResources();
return {
Expand All @@ -359,7 +349,7 @@ export function createMcpServer(options: McpServerOptions) {
);

server.setRequestHandler(
ListResourceTemplatesRequestSchema,
'resources/templates/list',
async (): Promise<ListResourceTemplatesResult> => {
const allResources = await getResources();
return {
Expand All @@ -378,7 +368,7 @@ export function createMcpServer(options: McpServerOptions) {
);

server.setRequestHandler(
ReadResourceRequestSchema,
'resources/read',
async (request): Promise<ReadResourceResult> => {
try {
const allResources = await getResources();
Expand Down Expand Up @@ -449,7 +439,7 @@ export function createMcpServer(options: McpServerOptions) {

if (options.tools) {
server.setRequestHandler(
ListToolsRequestSchema,
'tools/list',
async (): Promise<ListToolsResult> => {
const tools = await getTools();

Expand Down Expand Up @@ -479,7 +469,7 @@ export function createMcpServer(options: McpServerOptions) {
}
);

server.setRequestHandler(CallToolRequestSchema, async (request) => {
server.setRequestHandler('tools/call', async (request) => {
try {
const tools = await getTools();
const toolName = request.params.name;
Expand Down Expand Up @@ -527,7 +517,7 @@ export function createMcpServer(options: McpServerOptions) {

const content =
result != null
? [{ type: 'text', text: JSON.stringify(result) }]
? [{ type: 'text' as const, text: JSON.stringify(result) }]
: [];

return {
Expand All @@ -547,12 +537,7 @@ export function createMcpServer(options: McpServerOptions) {
});
}

// Expand types recursively for better intellisense
type Request = ExpandRecursively<ExtractRequest<typeof server>>;
type Notification = ExpandRecursively<ExtractNotification<typeof server>>;
type Result = ExpandRecursively<ExtractResult<typeof server>>;

return server as Server<Request, Notification, Result>;
return server;
}

function enumerateError(error: unknown) {
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp-utils/src/stream-transport.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
import type { JSONRPCMessage, Transport } from '@modelcontextprotocol/server';

import type { DuplexStream } from './types.js';

/**
Expand Down
19 changes: 0 additions & 19 deletions packages/mcp-utils/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';

/**
* A web stream that can be both read from and written to.
*/
Expand Down Expand Up @@ -32,20 +30,3 @@ export type ExtractParams<Path extends string> =
Path extends `${string}{${infer P}}${infer Rest}`
? P | ExtractParams<Rest>
: never;

/**
* Extracts the request type from an MCP server.
*/
export type ExtractRequest<S> = S extends Server<infer R, any, any> ? R : never;

/**
* Extracts the notification type from an MCP server.
*/
export type ExtractNotification<S> = S extends Server<any, infer N, any>
? N
: never;

/**
* Extracts the result type from an MCP server.
*/
export type ExtractResult<S> = S extends Server<any, any, infer R> ? R : never;
Loading
Loading