Skip to main content
Glama

chat_completion

Send chat completion requests to AI models through a unified gateway interface. Configure parameters like model selection, message history, and response controls to generate AI-powered text outputs.

Instructions

Send a chat completion request to the configured AI API provider (ANTHROPIC). Supports parameters like model, messages, temperature, max_tokens, stream, etc. Returns the raw response from the API without format conversion.

Custom AI model for enterprise use

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modelNoModel to use for completion (default: claude-3-sonnet-20240229)
messagesYesArray of message objects with role and content
temperatureNoControls randomness in the response (default: 0.7)
max_tokensNoMaximum number of tokens to generate (default: 4096)
streamNoWhether to stream the response
top_pNoControls diversity via nucleus sampling
frequency_penaltyNoPenalizes new tokens based on their frequency
presence_penaltyNoPenalizes new tokens based on whether they appear in the text
stopNoUp to 4 sequences where the API will stop generating further tokens
response_formatNoFormat of the response (OpenAI only). Supports json_object and json_schema types.

Implementation Reference

  • The main execution logic for the 'chat_completion' tool. Processes input parameters, applies configuration defaults, validates inputs, prepares API-specific request data and headers, sends HTTP POST to the AI provider's endpoint, and formats the response as MCP content. Handles errors appropriately.
    private async handleChatCompletion(params: ChatCompletionParams): Promise<any> {
      try {
        // Apply defaults from configuration
        const completionParams = {
          ...params,
          model: params.model || this.config.defaultModel,
          temperature: params.temperature ?? this.config.defaultTemperature,
          max_tokens: params.max_tokens ?? this.config.defaultMaxTokens,
        };
    
        // Validate required parameters
        if (!completionParams.messages || completionParams.messages.length === 0) {
          throw new McpError(
            ErrorCode.InvalidParams,
            'messages parameter is required and cannot be empty'
          );
        }
    
        // Prepare request based on API format
        const requestData = this.prepareRequestData(completionParams);
        const headers = this.prepareHeaders();
    
        // Construct URL based on API format
        let url = this.config.apiEndpoint;
        if (this.config.apiFormat === 'openai' && !url.endsWith('/chat/completions')) {
          url = url.endsWith('/') ? url + 'chat/completions' : url + '/chat/completions';
        }
    
        // Make the API request
        const response = await this.httpClient.post(url, requestData, { headers });
    
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(response.data, null, 2),
            },
          ],
        };
      } catch (error) {
        if (axios.isAxiosError(error)) {
          const errorMessage = error.response?.data?.error?.message || error.message;
          const statusCode = error.response?.status || 500;
          
          throw new McpError(
            ErrorCode.InternalError,
            `API request failed (${statusCode}): ${errorMessage}`
          );
        }
    
        throw new McpError(
          ErrorCode.InternalError,
          `Unexpected error: ${error instanceof Error ? error.message : 'Unknown error'}`
        );
      }
    }
  • src/index.ts:267-276 (registration)
    Registers the CallToolRequestHandler which checks if the tool name is 'chat_completion' and dispatches to the handleChatCompletion method if matched.
    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
      if (request.params.name !== 'chat_completion') {
        throw new McpError(
          ErrorCode.MethodNotFound,
          `Unknown tool: ${request.params.name}`
        );
      }
    
      return await this.handleChatCompletion(request.params.arguments as unknown as ChatCompletionParams);
    });
  • src/index.ts:154-262 (registration)
    Registers the 'chat_completion' tool in the ListTools response, including name, detailed description, and comprehensive inputSchema defining all supported parameters with types, descriptions, defaults hints, and validation rules.
    tools: [
      {
        name: 'chat_completion',
        description: `Send a chat completion request to the configured AI API provider (${this.config.apiFormat.toUpperCase()}). ` +
                    `Supports parameters like model, messages, temperature, max_tokens, stream, etc. ` +
                    `Returns the raw response from the API without format conversion.${customDescriptionInfo}`,
        inputSchema: {
          type: 'object',
          properties: {
            model: {
              type: 'string',
              description: `Model to use for completion${this.config.defaultModel ? ` (default: ${this.config.defaultModel})` : ''}`,
            },
            messages: {
              type: 'array',
              description: 'Array of message objects with role and content',
              items: {
                type: 'object',
                properties: {
                  role: {
                    type: 'string',
                    enum: ['system', 'user', 'assistant'],
                  },
                  content: {
                    type: 'string',
                  },
                },
                required: ['role', 'content'],
              },
            },
            temperature: {
              type: 'number',
              description: `Controls randomness in the response${this.config.defaultTemperature ? ` (default: ${this.config.defaultTemperature})` : ''}`,
              minimum: 0,
              maximum: 2,
            },
            max_tokens: {
              type: 'number',
              description: `Maximum number of tokens to generate${this.config.defaultMaxTokens ? ` (default: ${this.config.defaultMaxTokens})` : ''}`,
              minimum: 1,
            },
            stream: {
              type: 'boolean',
              description: 'Whether to stream the response',
              default: false,
            },
            top_p: {
              type: 'number',
              description: 'Controls diversity via nucleus sampling',
              minimum: 0,
              maximum: 1,
            },
            frequency_penalty: {
              type: 'number',
              description: 'Penalizes new tokens based on their frequency',
              minimum: -2,
              maximum: 2,
            },
            presence_penalty: {
              type: 'number',
              description: 'Penalizes new tokens based on whether they appear in the text',
              minimum: -2,
              maximum: 2,
            },
            stop: {
              oneOf: [
                { type: 'string' },
                {
                  type: 'array',
                  items: { type: 'string' },
                },
              ],
              description: 'Up to 4 sequences where the API will stop generating further tokens',
            },
            response_format: {
              type: 'object',
              description: 'Format of the response (OpenAI only). Supports json_object and json_schema types.',
              properties: {
                type: {
                  type: 'string',
                  enum: ['text', 'json_object', 'json_schema'],
                  description: 'The type of response format',
                },
                json_schema: {
                  type: 'object',
                  description: 'JSON schema definition (required when type is json_schema)',
                  properties: {
                    name: {
                      type: 'string',
                      description: 'Name of the schema',
                    },
                    schema: {
                      type: 'object',
                      description: 'JSON schema object',
                    },
                    strict: {
                      type: 'boolean',
                      description: 'Whether to use strict validation',
                    },
                  },
                  required: ['name', 'schema'],
                },
              },
              required: ['type'],
            },
          },
          required: ['messages'],
        },
      },
  • TypeScript interface defining the structure of ChatCompletionParams used throughout the implementation for type safety.
    interface ChatCompletionParams {
      model?: string;
      messages: Array<{
        role: 'system' | 'user' | 'assistant';
        content: string;
      }>;
      temperature?: number;
      max_tokens?: number;
      stream?: boolean;
      top_p?: number;
      frequency_penalty?: number;
      presence_penalty?: number;
      stop?: string | string[];
      response_format?: {
        type: 'text' | 'json_object' | 'json_schema';
        json_schema?: {
          name: string;
          schema: Record<string, any>;
          strict?: boolean;
        };
      };
    }
  • Helper function that transforms ChatCompletionParams into API-specific request payload for either OpenAI or Anthropic formats, handling differences like system message placement and parameter mapping.
    private prepareRequestData(params: ChatCompletionParams): any {
      if (this.config.apiFormat === 'anthropic') {
        // Convert to Anthropic format
        const systemMessage = params.messages.find(m => m.role === 'system');
        const nonSystemMessages = params.messages.filter(m => m.role !== 'system');
    
        const anthropicData: any = {
          model: params.model,
          messages: nonSystemMessages,
          max_tokens: params.max_tokens || 1024,
        };
    
        if (systemMessage) {
          anthropicData.system = systemMessage.content;
        }
    
        if (params.temperature !== undefined) {
          anthropicData.temperature = params.temperature;
        }
    
        if (params.top_p !== undefined) {
          anthropicData.top_p = params.top_p;
        }
    
        if (params.stream !== undefined) {
          anthropicData.stream = params.stream;
        }
    
        if (params.stop) {
          anthropicData.stop_sequences = Array.isArray(params.stop) ? params.stop : [params.stop];
        }
    
        return anthropicData;
      } else {
        // OpenAI format (default)
        const openaiData: any = {
          model: params.model,
          messages: params.messages,
        };
    
        if (params.temperature !== undefined) {
          openaiData.temperature = params.temperature;
        }
    
        if (params.max_tokens !== undefined) {
          openaiData.max_tokens = params.max_tokens;
        }
    
        if (params.stream !== undefined) {
          openaiData.stream = params.stream;
        }
    
        if (params.top_p !== undefined) {
          openaiData.top_p = params.top_p;
        }
    
        if (params.frequency_penalty !== undefined) {
          openaiData.frequency_penalty = params.frequency_penalty;
        }
    
        if (params.presence_penalty !== undefined) {
          openaiData.presence_penalty = params.presence_penalty;
        }
    
        if (params.stop !== undefined) {
          openaiData.stop = params.stop;
        }
    
        if (params.response_format !== undefined) {
          openaiData.response_format = params.response_format;
        }
    
        return openaiData;
      }
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

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/kinhunt/mcp-ai-gateway'

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