A stdio MCP server reads JSON-RPC from stdin and writes each answer to stdout. Desktop hosts start that process locally.
serveMCPStdio connects your createMCPServer server to stdin and stdout. You keep the same tools.
// server.ts
import { toolDefinition } from '@tanstack/ai'
import { createMCPServer } from '@tanstack/ai-mcp/server'
import { serveMCPStdio } from '@tanstack/ai-mcp/server/stdio'
import { z } from 'zod'
const getWeather = toolDefinition({
name: 'get_weather',
description: 'Get the weather for a city',
inputSchema: z.object({
city: z.string(),
}),
}).server(async ({ city }) => {
return `Sunny in ${city}`
})
const server = createMCPServer({
name: 'weather',
version: '1.0.0',
tools: [getWeather],
})
const stdio = serveMCPStdio(server)
console.error('The weather server is ready')The host starts the process and can call get_weather. The server writes the answer on stdout.
stdout carries only protocol messages. If you write anything else there, the host cannot parse the messages.
serveMCPStdio returns an object with close().
serveMCPStdio uses sessions: 'memory' when you do not set sessions. A stdio process serves one client, so the server can ask a spec 2025 client for input or a sample. See MCP Server Sessions.