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