Skip to main content

Overview

Most MCP servers need user-provided values like API keys, preferences, or settings. How these values reach your server depends on how it’s deployed: When you define a configuration schema, Smithery automatically:
  • Generates an OAuth UI form for remote servers
  • Passes values to your server in the appropriate format
  • Validates inputs and applies defaults
Configuration schemas are limited to 20 fields and 1KB total size. Keep schemas focused on essential settings.

Defining Your Schema

Export a configSchema using Zod to declare what configuration your server accepts:
Smithery extracts this schema automatically β€” no additional configuration needed.

Config Transport (x-from and x-to)

The x-from and x-to extensions control how config values flow through the gateway:

x-from β€” Where Smithery reads config

Specifies where Smithery looks for the value when a user connects:
Default: If no x-from is specified, defaults to { query: "<propertyName>" }.

x-to β€” Where Smithery sends config to upstream

Specifies how Smithery forwards the value to your upstream server. Use this when your server expects a different header name than what clients provide:
This is useful when:
  • Your upstream server expects an Authorization header, but you can’t use authorization as x-from (it’s reserved for Smithery OAuth)
  • You want to rename headers for compatibility with existing APIs
  • You need to map user-friendly parameter names to technical header names
Default: If no x-to is specified, values are forwarded using the same location as x-from.

Example: PostHog API Key

With this config:
  • Clients connect with header posthog-api-key: sk-xxx
  • Your server receives header Authorization: sk-xxx

Type Support

Only simple types support x-from:
  • string
  • number
  • boolean
Nested objects and arrays are not supported β€” only flat schemas are allowed.

Reserved Headers

The following headers cannot be used as x-from sources:
  • authorization β€” Used for Smithery OAuth
  • cookie β€” Reserved for session management
  • cf-* β€” Cloudflare infrastructure headers
  • smithery-* β€” Internal service headers
These restrictions only apply to x-from. You can use any header name (including Authorization) in x-to to forward values to your upstream server.

How Configuration Reaches Your Server

For URL-published servers, Smithery Gateway passes through all query parameters and headers to your upstream server.
Your server receives headers and query params directly β€” Smithery proxies them as-is.

Type Coercion

Since query parameters, headers, and CLI arguments are strings, Smithery automatically coerces values:

Best Practices

  • Use clear descriptions β€” These become form labels and help text
  • Set sensible defaults β€” Minimize required fields
  • Use enums for fixed options β€” Creates dropdown menus in the UI
  • Keep required fields minimal β€” Only require what’s essential
  • Use headers for secrets β€” Configure "x-from": { header: "x-api-key" } for API keys
  • Never log sensitive values β€” Treat keys and tokens as secrets
  • Validate server-side β€” Don’t rely solely on client validation

Troubleshooting

  • Export configSchema from the same file as createServer
  • Ensure schema is a valid Zod object
  • Accept { config } in your createServer function
  • Use z.infer<typeof configSchema> for typing

Common Questions

No β€” configuration is bound at connection time. A new connection is needed for different settings.
Yes β€” use .optional() or provide .default() values.
View the API tab on any server’s page on Smithery.

See Also

  • Publish β€” Publish your MCP on Smithery