Skip to content

User Configuration

Many MCP servers need configuration like API keys. The user_config field in your manifest lets you declare what users need to provide.

In your manifest.json:

{
"name": "@yourorg/my-api-server",
"version": "1.0.0",
"user_config": {
"api_key": {
"type": "string",
"title": "API Key",
"description": "Your API key from example.com/dashboard",
"sensitive": true,
"required": true
},
"base_url": {
"type": "string",
"title": "API Base URL",
"description": "Override the default API endpoint",
"default": "https://api.example.com"
}
},
"server": {
"type": "python",
"mcp_config": {
"command": "python",
"args": ["-m", "my_server"],
"env": {
"API_KEY": "${user_config.api_key}",
"API_BASE_URL": "${user_config.base_url}"
}
}
}
}
FieldTypeDescription
typestringstring, number, boolean
titlestringHuman-readable label
descriptionstringHelp text for users
sensitivebooleanMask in output (default: false)
requiredbooleanMust be provided (default: false)
defaultanyDefault value if not provided

When mpak bundle run executes, it resolves ${user_config.*} placeholders in this order:

  1. Process environment - Already set by parent (e.g., Claude Desktop)
  2. Stored config - Set via mpak config set
  3. Default value - From manifest
  4. Interactive prompt - If TTY and required
Terminal window
# Store configuration
mpak config set @yourorg/my-api-server api_key=sk-xxx
# Run uses stored config automatically
mpak bundle run @yourorg/my-api-server

Option 2: Claude Desktop (environment variables)

Section titled “Option 2: Claude Desktop (environment variables)”
{
"mcpServers": {
"my-api": {
"command": "mpak",
"args": ["bundle", "run", "@yourorg/my-api-server"],
"env": {
"API_KEY": "sk-xxx"
}
}
}
}

The flow from user config to environment variable:

manifest.user_config.api_key → mpak config set ... api_key=xxx → env API_KEY
^^^^^^^ ^^^^^^^ ^^^^^^^
user_config key config key env var

Users provide the user_config key name. Your manifest maps it to an environment variable.

In your README, list what users need to configure:

## Configuration
This server requires an API key from [example.com](https://example.com/dashboard).
### Claude Desktop
\`\`\`json
{
"mcpServers": {
"my-api": {
"command": "mpak",
"args": ["bundle", "run", "@yourorg/my-api-server"],
"env": {
"API_KEY": "your-api-key"
}
}
}
}
\`\`\`
### CLI
\`\`\`bash
mpak config set @yourorg/my-api-server api_key=your-api-key
mpak bundle run @yourorg/my-api-server
\`\`\`

Always set sensitive: true for API keys, passwords, and tokens:

{
"user_config": {
"api_key": {
"type": "string",
"sensitive": true
}
}
}

This masks the value in mpak config get output.

For optional configuration, provide defaults:

{
"user_config": {
"timeout": {
"type": "number",
"title": "Request Timeout",
"description": "Timeout in seconds",
"default": 30
}
}
}