stdio-client.ts•3.96 kB
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import {
  ListPromptsRequest,
  ListPromptsResultSchema,
  Progress,
} from '@modelcontextprotocol/sdk/types.js';
async function main(): Promise<void> {
  // Create a new client with streamable HTTP transport
  const client = new Client({
    name: 'example-client',
    version: '1.0.0',
  });
  const transport = new StdioClientTransport({
    command: 'ts-node-dev',
    args: ['--respawn', 'playground/servers/stdio.ts'],
  });
  // Connect the client using the transport and initialize the server
  await client.connect(transport);
  console.log('Connected to MCP server stdio');
  // List and call tools
  await listTools(client);
  await callGreetingTools(client);
  await listPrompts(client);
}
async function listTools(client: Client): Promise<void> {
  try {
    const toolsResult = await client.listTools();
    console.log('Available tools: ', toolsResult.tools);
    if (toolsResult.tools.length === 0) {
      console.log('No tools available from the server');
    }
  } catch (error) {
    console.log(`Tools not supported by this server (${error})`);
    return;
  }
}
async function listPrompts(client: Client): Promise<void> {
  try {
    const promptsRequest: ListPromptsRequest = {
      method: 'prompts/list',
      params: {},
    };
    const promptsResult = await client.request(
      promptsRequest,
      ListPromptsResultSchema,
    );
    console.log('Available prompts: ', promptsResult.prompts);
  } catch (error) {
    console.log(`Prompts not supported by this server (${error})`);
    return;
  }
}
async function callGreetingTools(client: Client): Promise<void> {
  // greet-world: no parameters
  try {
    const resultWorld: any = await client.callTool(
      { name: 'greet-world', arguments: {} },
      undefined,
      {
        onprogress: (p: Progress) => {
          if (typeof p?.progress === 'number')
            console.log(
              `[greet-world] progress: ${p.progress}/${p.total ?? 100}`,
            );
        },
      },
    );
    console.log(
      '[greet-world] result:',
      resultWorld?.content?.[0]?.text ?? resultWorld,
    );
  } catch (error) {
    console.log(`[greet-world] error: ${error}`);
  }
  // greet-user: requires name and language
  try {
    const resultUser: any = await client.callTool(
      { name: 'greet-user', arguments: { name: 'MCP User', language: 'en' } },
      undefined,
      {
        onprogress: (p: Progress) => {
          if (typeof p?.progress === 'number')
            console.log(
              `[greet-user] progress: ${p.progress}/${p.total ?? 100}`,
            );
        },
      },
    );
    console.log(
      '[greet-user] result:',
      resultUser?.content?.[0]?.text ?? resultUser,
    );
  } catch (error) {
    console.log(`[greet-user] error: ${error}`);
  }
  // greet-user-structured: returns structuredContent plus content
  try {
    const resultStructured: any = await client.callTool(
      {
        name: 'greet-user-structured',
        arguments: { name: 'MCP User', language: 'es' },
      },
      undefined,
      {
        onprogress: (p: Progress) => {
          if (typeof p?.progress === 'number')
            console.log(
              `[greet-user-structured] progress: ${p.progress}/${p.total ?? 100}`,
            );
        },
      },
    );
    if (resultStructured?.structuredContent) {
      console.log(
        '[greet-user-structured] structuredContent:',
        resultStructured.structuredContent,
      );
    }
    console.log(
      '[greet-user-structured] content:',
      resultStructured?.content?.[0]?.text ?? resultStructured,
    );
  } catch (error) {
    console.log(`[greet-user-structured] error: ${error}`);
  }
}
main().catch((error: unknown) => {
  console.error('Error running MCP client:', error);
  process.exit(1);
});