# Config Structure (/docs/configuration/librechat_yaml/object_structure/config)

**Note:** Fields not specifically mentioned as required are optional.

## version
- **required** 

<OptionTable
  options={[
    ['version', 'String', 'Specifies the version of the configuration file.', 'version: 1.3.5' ],
  ]}
/>

## cache

<OptionTable
  options={[
    ['cache', 'Boolean', 'Toggles caching on or off. Set to `true` to enable caching (default).', 'cache: true' ],
  ]}
/>

## fileStrategy

- **Options**: "local" | "firebase" | "s3" | "azure_blob"

<OptionTable
  options={[
    ['fileStrategy', 'String', 'Determines where to save user uploaded/generated files. Defaults to `"local"` if omitted.', 'fileStrategy: "firebase"' ],
  ]}
/>

- **Notes**:
  - `"firebase"` is currently the only option that serves files through a true CDN (Content Delivery Network), which means images and avatars are delivered from edge locations globally. S3 and Azure Blob Storage are object storage backends — files are accessible but not CDN-served by default.
  - S3 serves files via **presigned URLs** (temporary signed tokens) that expire. Once expired, any image or avatar referencing that URL will appear broken in the UI. This makes S3 unsuitable as a primary strategy for visual assets. See the [related discussion](https://github.com/danny-avila/LibreChat/discussions/10280#discussioncomment-14803903) for details.
  - CloudFront (CDN for S3) is planned and in active development.
  - For best performance of images and avatars, use `"firebase"` or configure `fileStrategies` to route `avatar` and `image` to a CDN-backed strategy.
  - Please refer to the [File Storage & CDN documentation](/docs/configuration/cdn) for setup details

## fileStrategies

Allows granular control over file storage strategies for different file types.
- **Available Strategies**: "local" | "firebase" | "s3" | "azure_blob"

<OptionTable
  options={[
    ['fileStrategies', 'Object', 'Configures different storage strategies for different file types. More flexible than the single fileStrategy option.', ''],
  ]}
/>

**Sub-keys:**

<OptionTable
  options={[
    ['default', 'String', 'Fallback storage strategy when specific type is not defined. Defaults to "local".', ''],
    ['avatar', 'String', 'Storage strategy for user and agent avatar images. Recommended to use a CDN-backed strategy (`"firebase"`) for best performance.', ''],
    ['image', 'String', 'Storage strategy for images uploaded in chats. Recommended to use a CDN-backed strategy (`"firebase"`) for best performance.', ''],
    ['document', 'String', 'Storage strategy for document uploads (PDFs, text files, etc.).', ''],
  ]}
/>

- **Notes**:
  - This setting takes precedence over the single `fileStrategy` option
  - If a specific file type is not configured, it falls back to `default`, then to `fileStrategy`, and finally to `"local"`
  - Images and avatars need persistent, stable URLs to render correctly across the UI. S3 presigned URLs expire (AWS cap: 7 days for IAM users, hours for STS/role-based credentials), causing broken images in the model selector and chat UI. See the [related discussion](https://github.com/danny-avila/LibreChat/discussions/10280#discussioncomment-14803903) for full context. Use `"firebase"` (the only current CDN-backed strategy) for `avatar` and `image` to avoid this.
  - CloudFront support for S3 is in active development and will eliminate presigned URL limitations.
  - S3 and Azure Blob Storage are well-suited for `document` storage, where short-lived presigned download URLs are appropriate.
  - Please refer to the [File Storage & CDN documentation](/docs/configuration/cdn) for setup details for each storage provider

**Examples:**

```yaml filename="fileStrategies - All in one place"
# Use a single strategy for all file types
fileStrategies:
  default: "s3"
```

```yaml filename="fileStrategies - Mixed strategies"
# Route images and avatars to CDN, keep documents in object storage
fileStrategies:
  avatar: "firebase"   # CDN delivery for avatars
  image: "firebase"    # CDN delivery for generated/uploaded images
  document: "s3"       # Object storage for documents
```

```yaml filename="fileStrategies - Partial configuration"
# Only configure specific types, others use default
fileStrategies:
  default: "local"
  avatar: "firebase"   # Only avatars use Firebase CDN, everything else is local
```
## filteredTools

<OptionTable
  options={[
    ['filteredTools', 'Array of Strings', 'Filters out specific tools from both Plugins and OpenAI Assistants endpoints.', 'filteredTools: ["scholarai", "calculator"]' ],
  ]}
/>

- **Notes**:
    - If `includedTools` and `filteredTools` are both specified, only `includedTools` will be recognized.
    - Affects both `gptPlugins` and `assistants` endpoints
    - You can find the names of the tools to filter in [`api/app/clients/tools/manifest.json`](https://github.com/danny-avila/LibreChat/blob/main/api/app/clients/tools/manifest.json)
        - Use the `pluginKey` value
    - Also, any listed under the ".well-known" directory [`api/app/clients/tools/.well-known`](https://github.com/danny-avila/LibreChat/blob/main/api/app/clients/tools/.well-known)
        - Use the `name_for_model` value

## includedTools

<OptionTable
  options={[
    ['includedTools', 'Array of Strings', 'Includes specific tools from both Plugins and OpenAI Assistants endpoints.', 'includedTools: ["calculator"]' ],
  ]}
/>

- **Notes**:
    - If `includedTools` and `filteredTools` are both specified, only `includedTools` will be recognized.
    - Affects both `gptPlugins` and `assistants` endpoints
    - You can find the names of the tools to filter in [`api/app/clients/tools/manifest.json`](https://github.com/danny-avila/LibreChat/blob/main/api/app/clients/tools/manifest.json)
        - Use the `pluginKey` value
    - Also, any listed under the ".well-known" directory [`api/app/clients/tools/.well-known`](https://github.com/danny-avila/LibreChat/blob/main/api/app/clients/tools/.well-known)
        - Use the `name_for_model` value

## secureImageLinks

<OptionTable
  options={[
    ['secureImageLinks', 'Boolean', 'Whether or not to secure access to image links that are hosted locally by the app. Default: false.', 'secureImageLinks: true' ],
  ]}
/>

## imageOutputType

- **Note**: Case-sensitive. Google endpoint only supports "jpeg" and "png" output types.
- **Options**: "png" | "webp" | "jpeg"

<OptionTable
  options={[
    ['imageOutputType', 'String', 'The image output type for image responses. Defaults to "png" if omitted.', 'imageOutputType: "webp"' ],
  ]}
/>

## ocr

**Key:**
<OptionTable
  options={[
    ['ocr', 'Object', 'Configures Optical Character Recognition (OCR) settings for extracting text from images.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['apiKey', 'String', 'The API key for the OCR service.', ''],
    ['baseURL', 'String', 'The base URL for the OCR service API.', ''],
    ['strategy', 'String', 'The OCR strategy to use. Options are "mistral_ocr", "azure_mistral_ocr", "vertexai_mistral_ocr", "document_parser", or "custom_ocr".', ''],
    ['mistralModel', 'String', 'The Mistral model to use for OCR processing.', ''],
  ]}
/>

see: [OCR Config Object Structure](/docs/configuration/librechat_yaml/object_structure/ocr)

## webSearch

**Key:**
<OptionTable
  options={[
    ['webSearch', 'Object', 'Configures web search functionality, including search providers, content scrapers, and result rerankers.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['serperApiKey', 'String', 'Environment variable name for the Serper API key. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['searxngInstanceUrl', 'String', 'Environment variable name for the SearXNG instance URL. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['searxngApiKey', 'String', 'Environment variable name for the SearXNG API key. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['firecrawlApiKey', 'String', 'Environment variable name for the Firecrawl API key. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['firecrawlApiUrl', 'String', 'Environment variable name for the Firecrawl API URL. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['jinaApiKey', 'String', 'Environment variable name for the Jina API key. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['cohereApiKey', 'String', 'Environment variable name for the Cohere API key. If not set in .env, users will be prompted to provide it via UI.', ''],
    ['searchProvider', 'String', 'Specifies which search provider to use. Options: "serper", "searxng".', ''],
    ['scraperProvider', 'String', 'Specifies which scraper service to use. Options: "firecrawl", "serper".', ''],
    ['firecrawlVersion', 'String', 'Specifies Firecrawl API version (v0 or v1).', ''],
    ['rerankerType', 'String', 'Specifies which reranker service to use. Options: "jina", "cohere".', ''],
    ['scraperTimeout', 'Number', 'Timeout in milliseconds for scraper requests.', ''],
    ['safeSearch', 'Boolean', 'Enables safe search mode to filter out inappropriate content.', ''],
  ]}
/>

see: [Web Search Object Structure](/docs/configuration/librechat_yaml/object_structure/web_search)

## fileConfig

**Key:**
<OptionTable
  options={[
    ['fileConfig', 'Object', 'Configures file handling settings for the application, including size limits and MIME type restrictions.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['endpoints', 'Record/Object', 'Specifies file handling configurations for individual endpoints, allowing customization per endpoint basis.', ''],
    ['serverFileSizeLimit', 'Number', 'The maximum file size (in MB) that the server will accept. Applies globally across all endpoints unless overridden by endpoint-specific settings.', ''],
    ['avatarSizeLimit', 'Number', 'Maximum size (in MB) for user avatar images.', ''],
    ['clientImageResize', 'Object', 'Configures client-side image resizing to optimize file uploads and prevent upload errors due to large image sizes.', ''],
    ['ocr', 'Object', 'Settings for Optical Character Recognition (OCR) file processing.', ''],
    ['text', 'Object', 'Settings for direct text file parsing.', ''],
    ['stt', 'Object', 'Settings for Speech-to-Text (STT) audio file processing.', ''],
    ['fileTokenLimit', 'Number', 'Maximum number of tokens from text files to include in prompts before truncation.', 'fileTokenLimit: 100000'],
  ]}
/>

## clientImageResize

**Key:**
<OptionTable
  options={[
    ['clientImageResize', 'Object', 'Configures client-side image resizing to optimize file uploads and prevent upload errors due to large image sizes.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['enabled', 'Boolean', 'Enables or disables client-side image resizing functionality. Default: false.', 'enabled: true'],
    ['maxWidth', 'Number', 'Maximum width in pixels for resized images. Images wider than this will be resized. Default: 1920.', 'maxWidth: 1024'],
    ['maxHeight', 'Number', 'Maximum height in pixels for resized images. Images taller than this will be resized. Default: 1080.', 'maxHeight: 768'],
    ['quality', 'Number', 'JPEG compression quality (0.1 to 1.0). Higher values mean better quality but larger file sizes. Default: 0.8.', 'quality: 0.9'],
    ['compressFormat', 'String', 'Output format for compressed images. Options: "jpeg", "webp". Default: "jpeg".', 'compressFormat: "webp"'],
  ]}
/>

**Description:**

The `clientImageResize` configuration enables automatic client-side image resizing before upload. This feature helps:

- **Prevent upload failures** due to large image files exceeding server limits
- **Reduce bandwidth usage** by compressing images before transmission  
- **Improve upload performance** with smaller file sizes
- **Maintain image quality** while optimizing file size

When enabled, images that exceed the specified `maxWidth` or `maxHeight` dimensions are automatically resized on the client side before being uploaded to the server. The resizing maintains the original aspect ratio while ensuring the image fits within the specified bounds.

**Example:**
```yaml filename="clientImageResize"
fileConfig:
  clientImageResize:
    enabled: true
    maxWidth: 1920
    maxHeight: 1080
    quality: 0.8
    compressFormat: "jpeg"
```

**Notes:**

- Only applies to image files (JPEG, PNG, WebP, etc.)
- Resizing occurs automatically when images exceed the specified dimensions
- Original aspect ratio is preserved during resizing
- The feature works with all supported image upload endpoints
- Quality setting only applies to JPEG and WebP formats
- Setting quality too low (< 0.5) may result in noticeable image degradation

see: [File Config Object Structure](/docs/configuration/librechat_yaml/object_structure/file_config)

## rateLimits

**Key:**
<OptionTable
  options={[
    ['rateLimits', 'Object', 'Defines rate limiting policies to prevent abuse by limiting the number of requests.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['fileUploads', 'Object', 'Configures rate limits specifically for file upload operations.', ''],
    ['conversationsImport', 'Object', 'Configures rate limits specifically for conversation import operations.', ''],
    ['stt', 'Object', 'Configures rate limits specifically for speech-to-text (stt) requests', ''],
    ['tts', 'Object', 'Configures rate limits specifically for text-to-speech (tts) requests', ''],
  ]}
/>

**fileUploads Subkeys:**
<OptionTable
  options={[
    ['ipMax', 'Number', 'Maximum number of uploads allowed per IP address per window.', ''],
    ['ipWindowInMinutes', 'Number', 'Time window in minutes for the IP-based upload limit.', ''],
    ['userMax', 'Number', 'Maximum number of uploads allowed per user per window.', ''],
    ['userWindowInMinutes', 'Number', 'Time window in minutes for the user-based upload limit.', ''],
  ]}
/>

**conversationsImport Subkeys:**
<OptionTable
  options={[
    ['ipMax', 'Number', 'Maximum number of imports allowed per IP address per window.', ''],
    ['ipWindowInMinutes', 'Number', 'Time window in minutes for the IP-based imports limit.', ''],
    ['userMax', 'Number', 'Maximum number of imports per user per window.', ''],
    ['userWindowInMinutes', 'Number', 'Time window in minutes for the user-based imports limit.', ''],
  ]}
/>

**tts Subkeys:**
<OptionTable
  options={[
    ['ipMax', 'Number', 'Maximum number of requests allowed per IP address per window.', ''],
    ['ipWindowInMinutes', 'Number', 'Time window in minutes for the IP-based requests limit.', ''],
    ['userMax', 'Number', 'Maximum number of requests per user per window.', ''],
    ['userWindowInMinutes', 'Number', 'Time window in minutes for the user-based requests limit.', ''],
  ]}
/>

**stt Subkeys:**
<OptionTable
  options={[
    ['ipMax', 'Number', 'Maximum number of requests allowed per IP address per window.', ''],
    ['ipWindowInMinutes', 'Number', 'Time window in minutes for the IP-based requests limit.', ''],
    ['userMax', 'Number', 'Maximum number of requests per user per window.', ''],
    ['userWindowInMinutes', 'Number', 'Time window in minutes for the user-based requests limit.', ''],
  ]}
/>

    - **Example**:
    ```yaml filename="rateLimits"
    rateLimits:
      fileUploads:
        ipMax: 100
        ipWindowInMinutes: 60
        userMax: 50
        userWindowInMinutes: 60
      conversationsImport:
        ipMax: 100
        ipWindowInMinutes: 60
        userMax: 50
        userWindowInMinutes: 60
      stt:
        ipMax: 100
        ipWindowInMinutes: 1
        userMax: 50
        userWindowInMinutes: 1
      tts:
        ipMax: 100
        ipWindowInMinutes: 1
        userMax: 50
        userWindowInMinutes: 1
    ```

## registration

**Key:**
<OptionTable
  options={[
    ['registration', 'Object', 'Configures registration-related settings for the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['socialLogins', '', 'Social login configurations.', ''],
    ['allowedDomains', '', 'Specifies allowed domains for registration.', ''],
  ]}
/>

see also: 
- [socialLogins](/docs/configuration/librechat_yaml/object_structure/registration#sociallogins),
- [alloweddomains](/docs/configuration/librechat_yaml/object_structure/registration#alloweddomains),
- [Registration Object Structure](/docs/configuration/librechat_yaml/object_structure/registration)

## memory

**Key:**
<OptionTable
  options={[
    ['memory', 'Object', 'Configures conversation memory and personalization features for the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['disabled', 'Boolean', 'Disables memory functionality when set to true.', ''],
    ['validKeys', 'Array of Strings', 'Specifies which keys are valid for memory storage.', ''],
    ['tokenLimit', 'Number', 'Sets the maximum number of tokens for memory storage and processing.', ''],
    ['charLimit', 'Number', 'Sets the maximum number of characters for memory storage. Default: 10000.', ''],
    ['personalize', 'Boolean', 'Enables or disables personalization features.', ''],
    ['messageWindowSize', 'Number', 'Specifies the number of recent messages to include in memory context.', ''],
    ['agent', 'Object | Union', 'Configures the agent responsible for memory processing.', ''],
  ]}
/>

see: [Memory Object Structure](/docs/configuration/librechat_yaml/object_structure/memory)

## actions

**Key:**
<OptionTable
  options={[
    ['actions', 'Object', 'Configures actions-related settings, used by Agents and Assistants', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['allowedDomains', '', 'Specifies allowed domains for actions.', ''],
  ]}
/>

see also: 
- [alloweddomains](/docs/configuration/librechat_yaml/object_structure/actions#alloweddomains),
- [Actions Object Structure](/docs/configuration/librechat_yaml/object_structure/actions)

## interface

**Key:**
<OptionTable
  options={[
    ['interface', 'Object', 'Configures user interface elements within the application, allowing for customization of visibility and behavior of various components.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['endpointsMenu', 'Boolean', 'Controls the visibility of the endpoints menu dropdown in the UI.', ''],
    ['privacyPolicy', 'Object', 'Contains settings related to the privacy policy link provided.', ''],
    ['termsOfService', 'Object', 'Contains settings related to the terms of service link provided.', ''],
    ['modelSelect', 'Boolean', 'Determines whether the model selection feature is available.', ''],
    ['parameters', 'Boolean', 'Toggles the visibility of parameter configuration options AKA conversation settings.', ''],
    ['sidePanel', 'Boolean', 'Controls the visibility of the right-most side panel.', ''],
    ['presets', 'Boolean', 'Enables or disables the presets menu', ''],
    ['prompts', 'Boolean or Object', 'Enables or disables all prompt-related features for all users', ''],
    ['bookmarks', 'Boolean', 'Enables or disables all bookmarks-related features for all users', ''],
    ['memories', 'Boolean', 'Enables or disables the memories feature for all users', ''],
    ['multiConvo', 'Boolean', 'Enables or disables all "multi convo", AKA multiple response streaming, related features for all users', ''],
    ['agents', 'Boolean or Object', 'Enables or disables all agents features for all users', ''],
    ['temporaryChat', 'Boolean', 'Enables or disables the temporary chat feature', ''],
    ['temporaryChatRetention', 'Number', 'Configures the retention period for temporary chats in hours. Min: 1, Max: 8760. Default: 720 (30 days).', ''],
    ['mcpServers', 'Object', 'Contains settings related to MCP server selection and access control.', ''],
    ['customWelcome', 'String', 'Custom welcome message displayed in the chat interface.', ''],
    ['runCode', 'Boolean', 'Enables or disables the "Run Code" button for Markdown Code Blocks', ''],
    ['webSearch', 'Boolean', 'Enables or disables the web search button in the chat interface', ''],
    ['fileSearch', 'Boolean', 'Enables or disables the file search button in the chat interface', ''],
    ['fileCitations', 'Boolean', 'Globally enables or disables file citations for all users', ''],
    ['peoplePicker', 'Object', 'Configures which principal types are available controls in the people picker interface', ''],
    ['marketplace', 'Object', 'Enables or disables access to the Agent Marketplace', ''],
  ]}
/>
  
see: [Interface Object Structure](/docs/configuration/librechat_yaml/object_structure/interface)

## modelSpecs

**Key:**
<OptionTable
  options={[
    ['modelSpecs', 'Object', 'Configures model specifications, allowing for detailed setup and customization of AI models and their behaviors within the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['enforce', 'Boolean', 'Determines whether the model specifications should strictly override other configuration settings.', ''],
    ['prioritize', 'Boolean', 'Specifies if model specifications should take priority over the default configuration when both are applicable.', ''],
    ['list', 'Array of Objects', 'Contains a list of individual model specifications detailing various configurations and behaviors.', ''],
  ]}
/>

see: [Model Specs Object Structure](/docs/configuration/librechat_yaml/object_structure/model_specs)

## endpoints

**Key:**
<OptionTable
  options={[
    ['endpoints', 'Object', 'Defines custom API endpoints for the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['custom', 'Array of Objects', 'Each object in the array represents a unique endpoint configuration.', ''],
    ['azureOpenAI', 'Object', 'Azure OpenAI endpoint-specific configuration', ''],
    ['assistants', 'Object', 'Assistants endpoint-specific configuration.', ''],
    ['azureAssistants', 'Object', 'Azure Assistants endpoint-specific configuration.', ''],
    ['agents', 'Object', 'Agents endpoint-specific configuration.', ''],
    ['all', 'Object', 'Global endpoint settings that apply to all endpoints. See Shared Endpoint Settings.', ''],
  ]}
/>

> **Note:** All endpoints support [Shared Endpoint Settings](/docs/configuration/librechat_yaml/object_structure/shared_endpoint_settings) which include `streamRate`, `titleModel`, `titleMethod`, `titlePrompt`, `titlePromptTemplate`, and `titleEndpoint`. These can be configured individually per endpoint or globally using the `all` key.

## mcpSettings

**Key:**
<OptionTable
  options={[
    ['mcpSettings', 'Object', 'Defines global settings for Model Context Protocol (MCP) servers', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['allowedDomains', 'Array of Strings', 'A list specifying allowed domains for MCP server connections. Required for internal/local addresses.', ''],
  ]}
/>

- **Notes**:
  - This is a security feature to protect against abuse / misuse of internal addresses via MCP servers
  - By default, LibreChat restricts MCP servers from connecting to internal, local, or private network addresses
  - MCP servers using local IP addresses or domains must be **explicitly** allowed
  - As with all yaml configuration changes, a LibreChat restart is required to take effect
  - Supports domains, wildcard subdomains (`*.example.com`), docker domains, and IP addresses

**Example:**

```yaml filename="mcpSettings"
mcpSettings:
  allowedDomains:
    - "example.com"           # Specific domain
    - "*.example.com"         # All subdomains
    - "mcp-server"            # Local Docker domain
    - "172.24.1.165"          # Internal network IP
```

see: [MCP Settings Object Structure](/docs/configuration/librechat_yaml/object_structure/mcp_settings)

## mcpServers

**Key:**
<OptionTable
  options={[
    ['mcpServers', 'Object', 'Defines the configuration for Model Context Protocol (MCP) servers, allowing dynamic integration of MCP servers within the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['<serverName>', 'Object', 'Each key under `mcpServers` represents an individual MCP server configuration, identified by a unique name.', ''],
  ]}
/>

- **Notes**:
  - Initialization happens at startup, and the app must be restarted for changes to take effect.
  - The `<serverName>` is a unique identifier for each MCP server configuration.
  - Each MCP server can be configured using one of four connection types:
    - `stdio`
    - `websocket`
    - `sse`
    - `streamable-http`
  - The `type` field specifies the connection type to the MCP server.
  - If `type` is omitted, it defaults based on the presence and format of `url` or `command`:
    - If `url` is specified and starts with `http` or `https`, `type` defaults to `sse`.
    - If `url` is specified and starts with `ws` or `wss`, `type` defaults to `websocket`.
    - If `command` is specified, `type` defaults to `stdio`.
  - Additional configuration options include:
    - `timeout`: Timeout in milliseconds for MCP server requests. Determines how long to wait for a response for tool requests.
    - `initTimeout`: Timeout in milliseconds for MCP server initialization. Determines how long to wait for the server to initialize.
    - `serverInstructions`: Controls whether server instructions are included in agent context. Can be `true` (use server-provided), `false` (disabled), or a custom string (overrides server-provided).
    - `customUserVars`: (Optional) Defines custom variables (e.g., API keys, URLs) that individual users can set for an MCP server. These per-user values, provided through the UI, can then be referenced in the server's `headers` or `env` configurations using `{{VARIABLE_NAME}}` syntax. This allows for per-user authentication or customization for MCP tools.
  - see: [MCP Servers Object Structure](/docs/configuration/librechat_yaml/object_structure/mcp_servers)

**Example:**

```yaml filename="mcpServers"
mcpServers:
  everything:
    # type: sse # type can optionally be omitted
    url: http://localhost:3001/sse
    timeout: 30000
    initTimeout: 10000
    serverInstructions: true  # Use server-provided instructions
  puppeteer:
    type: stdio
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-puppeteer"
    timeout: 30000
    initTimeout: 10000
    serverInstructions: "Do not access any local files or local/internal IP addresses"
  filesystem:
    # type: stdio
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-filesystem"
      - /home/user/LibreChat/
    iconPath: /home/user/LibreChat/client/public/assets/logo.svg
  mcp-obsidian:
    command: npx
    args:
      - -y
      - "mcp-obsidian"
      - /path/to/obsidian/vault
  streamable-http-example:
    type: streamable-http
    url: https://example.com/mcp
    headers:
      Authorization: "Bearer ${API_TOKEN}"
    timeout: 30000
  per-user-crendentials-example:
    type: sse
    url: "https//some.mcp/sse"
    headers:
      X-Custom-Auth-Token: "{{USER_API_KEY}}" # Placeholder for the user-provided API key, defined in `customUserVars` below.
    customUserVars:
      USER_API_KEY:
        title: "Service API Key"
        description: "Your personal API key for this service. You can get it <a href='https://example.com/api-keys' target='_blank'>here</a>."
    serverInstructions: true
```

see: [MCP Servers Object Structure](/docs/configuration/librechat_yaml/object_structure/mcp_servers)

## speech

**Key:**
<OptionTable
  options={[
    ['speech', 'Object', 'Configures Text-to-Speech (TTS) and Speech-to-Text (STT) providers for the application.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['tts', 'Object', 'Text-to-Speech provider configurations (OpenAI, Azure OpenAI, ElevenLabs, LocalAI).', ''],
    ['stt', 'Object', 'Speech-to-Text provider configurations (OpenAI, Azure OpenAI).', ''],
    ['speechTab', 'Object', 'Default UI settings for speech features.', ''],
  ]}
/>

see: [Speech Object Structure](/docs/configuration/librechat_yaml/object_structure/speech)

## turnstile

**Key:**
<OptionTable
  options={[
    ['turnstile', 'Object', 'Configures Cloudflare Turnstile for bot protection on registration and login forms.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['siteKey', 'String', 'Your Cloudflare Turnstile site key (required).', ''],
    ['options', 'Object', 'Additional Turnstile widget options (optional).', ''],
  ]}
/>

see: [Turnstile Object Structure](/docs/configuration/librechat_yaml/object_structure/turnstile)

## transactions

**Key:**
<OptionTable
  options={[
    ['transactions', 'Object', 'Controls transaction logging and visibility features.', ''],
  ]}
/>

**Subkeys:**
<OptionTable
  options={[
    ['enabled', 'Boolean', 'Enables or disables transaction logging. Default: true.', ''],
  ]}
/>

see: [Transactions Object Structure](/docs/configuration/librechat_yaml/object_structure/transactions)

## Additional links
- [AWS Bedrock Object Structure](/docs/configuration/librechat_yaml/object_structure/aws_bedrock)
- [Custom Endpoint Object Structure](/docs/configuration/librechat_yaml/object_structure/custom_endpoint)
- [Azure OpenAI Endpoint Object Structure](/docs/configuration/librechat_yaml/object_structure/azure_openai)
- [Assistants Endpoint Object Structure](/docs/configuration/librechat_yaml/object_structure/assistants_endpoint)
- [Agents](/docs/configuration/librechat_yaml/object_structure/agents)
- [OCR Config Object Structure](/docs/configuration/librechat_yaml/object_structure/ocr)
- [Speech Object Structure](/docs/configuration/librechat_yaml/object_structure/speech)
- [Turnstile Object Structure](/docs/configuration/librechat_yaml/object_structure/turnstile)
- [Transactions Object Structure](/docs/configuration/librechat_yaml/object_structure/transactions)
- [Balance Object Structure](/docs/configuration/librechat_yaml/object_structure/balance)
- [Web Search Object Structure](/docs/configuration/librechat_yaml/object_structure/web_search)
- [Memory Object Structure](/docs/configuration/librechat_yaml/object_structure/memory)
