Skip to main content
Glama
georgejeffers

Gemini MCP Server

chat

Initiate or continue multi-turn conversations with Gemini AI models through session management. Send messages to start new discussions or resume previous ones using session IDs.

Instructions

Multi-turn conversation with session management. Omit sessionId to start a new session; include it to continue an existing one.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
messageYesThe message to send
sessionIdNoSession ID from a previous response to continue that conversation
modelNoGemini model to usegemini-2.5-flash
systemInstructionNoSystem instruction (only applied when starting a new session)

Implementation Reference

  • The main handler function that implements the chat tool logic, including session creation/retrieval, message sending to AI, and response formatting.
    async ({ message, sessionId, model, systemInstruction }) => { try { let session = sessionId ? getSession(sessionId) : undefined; const id = session ? sessionId! : generateSessionId(); if (!session) { const chat = ai.chats.create({ model, config: systemInstruction ? { systemInstruction } : undefined, }); session = { chat, turnCount: 0, lastActivity: Date.now() }; storeSession(id, session); } const response = await session.chat.sendMessage({ message }); session.turnCount++; session.lastActivity = Date.now(); const result = { sessionId: id, response: response.text ?? '', turnCount: session.turnCount, }; return { structuredContent: result, content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }], }; } catch (error) { return formatToolError(error); } },
  • Input/output schema definitions for the chat tool, including validation for message, sessionId, model, and systemInstruction inputs, and sessionId, response, and turnCount outputs.
    inputSchema: { message: z.string().min(1).describe('The message to send'), sessionId: z.string().optional().describe('Session ID from a previous response to continue that conversation'), model: TextModel.default('gemini-2.5-flash').describe('Gemini model to use'), systemInstruction: z.string().optional().describe('System instruction (only applied when starting a new session)'), }, outputSchema: { sessionId: z.string().describe('Session ID for continuing this conversation'), response: z.string().describe('The model response text'), turnCount: z.number().describe('Number of turns in this session'), }, annotations: {
  • src/tools/chat.ts:8-64 (registration)
    Tool registration function that registers the 'chat' tool with the MCP server, defining its metadata, schema, and handler.
    export function register(server: McpServer, ai: GoogleGenAI): void { server.registerTool( 'chat', { title: 'Chat', description: 'Multi-turn conversation with session management. Omit sessionId to start a new session; include it to continue an existing one.', inputSchema: { message: z.string().min(1).describe('The message to send'), sessionId: z.string().optional().describe('Session ID from a previous response to continue that conversation'), model: TextModel.default('gemini-2.5-flash').describe('Gemini model to use'), systemInstruction: z.string().optional().describe('System instruction (only applied when starting a new session)'), }, outputSchema: { sessionId: z.string().describe('Session ID for continuing this conversation'), response: z.string().describe('The model response text'), turnCount: z.number().describe('Number of turns in this session'), }, annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true, }, }, async ({ message, sessionId, model, systemInstruction }) => { try { let session = sessionId ? getSession(sessionId) : undefined; const id = session ? sessionId! : generateSessionId(); if (!session) { const chat = ai.chats.create({ model, config: systemInstruction ? { systemInstruction } : undefined, }); session = { chat, turnCount: 0, lastActivity: Date.now() }; storeSession(id, session); } const response = await session.chat.sendMessage({ message }); session.turnCount++; session.lastActivity = Date.now(); const result = { sessionId: id, response: response.text ?? '', turnCount: session.turnCount, }; return { structuredContent: result, content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }], }; } catch (error) { return formatToolError(error); } }, ); }
  • Helper utilities for chat session management: ChatSession interface, session storage Map, and functions for generating/retrieving/storing sessions.
    export interface ChatSession { chat: any; turnCount: number; lastActivity: number; } const sessions = new Map<string, ChatSession>(); const SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes export function createClient(apiKey: string): GoogleGenAI { return new GoogleGenAI({ apiKey }); } export function generateSessionId(): string { return crypto.randomUUID(); } export function getSession(id: string): ChatSession | undefined { const session = sessions.get(id); if (session) { session.lastActivity = Date.now(); } return session; } export function storeSession(id: string, session: ChatSession): void { sessions.set(id, session); } export function deleteSession(id: string): boolean { return sessions.delete(id); }
  • src/index.ts:26-26 (registration)
    Main server registration point where the chat tool is registered with the MCP server instance.
    registerChat(server, ai);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/georgejeffers/gemini-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server