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
Defining Your Schema
- TypeScript
- JSON Schema
Export a Smithery extracts this schema automatically β no additional configuration needed.
configSchema using Zod to declare what configuration your server accepts: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:
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:
- Your upstream server expects an
Authorizationheader, but you canβt useauthorizationasx-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
x-to is specified, values are forwarded using the same location as x-from.
Example: PostHog API Key
- Clients connect with header
posthog-api-key: sk-xxx - Your server receives header
Authorization: sk-xxx
Type Support
Only simple types supportx-from:
stringnumberboolean
Reserved Headers
The following headers cannot be used asx-from sources:
authorizationβ Used for Smithery OAuthcookieβ Reserved for session managementcf-*β Cloudflare infrastructure headerssmithery-*β 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
- URL
- Local
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
Schema Design
Schema Design
- 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
Security
Security
- 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
Configuration not detected?
Configuration not detected?
- Export
configSchemafrom the same file ascreateServer - Ensure schema is a valid Zod object
Type errors?
Type errors?
- Accept
{ config }in yourcreateServerfunction - Use
z.infer<typeof configSchema>for typing
Common Questions
Can users change configuration mid-session?
Can users change configuration mid-session?
No β configuration is bound at connection time. A new connection is needed for different settings.
Can all fields be optional?
Can all fields be optional?
Yes β use
.optional() or provide .default() values.Where can I see a server's configuration?
Where can I see a server's configuration?
View the API tab on any serverβs page on Smithery.
See Also
- Publish β Publish your MCP on Smithery