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