Use fastmcp.json for portable, declarative project configuration
New in version 2.12.0FastMCP supports declarative configuration through fastmcp.json files. This is the canonical and preferred way to configure FastMCP projects, providing a single source of truth for server settings, dependencies, and deployment options that replaces complex command-line arguments.The fastmcp.json file is designed to be a portable description of your server configuration that can be shared across environments and teams. When running from a fastmcp.json file, you can override any configuration values using CLI arguments.
The fastmcp.json configuration file allows you to define all aspects of your FastMCP server in a structured, shareable format. Instead of remembering command-line arguments or writing shell scripts, you declare your server’s configuration once and use it everywhere.When you have a fastmcp.json file, running your server becomes as simple as:
Copy
# Run the server using the configurationfastmcp run fastmcp.json# Or if fastmcp.json exists in the current directoryfastmcp run
This configuration approach ensures reproducible deployments across different environments, from local development to production servers. It works seamlessly with Claude Desktop, VS Code extensions, and any MCP-compatible client.
The fastmcp.json configuration answers three fundamental questions about your server:
Source = WHERE does your server code live?
Environment = WHAT environment setup does it require?
Deployment = HOW should the server run?
This conceptual model helps you understand the purpose of each configuration section and organize your settings effectively. The configuration file maps directly to these three concerns:
Copy
{ "$schema": "https://gofastmcp.com/public/schemas/fastmcp.json/v1.json", "source": { // WHERE: Location of your server code "type": "filesystem", // Optional, defaults to "filesystem" "path": "server.py", "entrypoint": "mcp" }, "environment": { // WHAT: Environment setup and dependencies "type": "uv", // Optional, defaults to "uv" "python": ">=3.10", "dependencies": ["pandas", "numpy"] }, "deployment": { // HOW: Runtime configuration "transport": "stdio", "log_level": "INFO" }}
Only the source field is required. The environment and deployment sections are optional and provide additional configuration when needed.
The source configuration determines WHERE your server code lives. It tells FastMCP how to find and load your server, whether it’s a local Python file, a remote repository, or hosted in the cloud. This section is required and forms the foundation of your configuration.
The source type identifier that determines which implementation to use. Currently supports "filesystem" for local files. Future releases will add support for "git" and "cloud" source types.
Show FileSystemSource
When type is "filesystem" (or omitted), the source points to a local Python file containing your FastMCP server:
The environment configuration determines WHAT environment setup your server requires. It controls the build-time setup of your Python environment, ensuring your server runs with the exact Python version and dependencies it requires. This section creates isolated, reproducible environments across different systems.FastMCP uses an extensible environment system with a base Environment class that can be implemented by different environment providers. Currently, FastMCP supports the UVEnvironment for Python environment management using uv’s powerful dependency resolver.
The environment type identifier that determines which implementation to use. Currently supports "uv" for Python environments managed by uv. If omitted, defaults to "uv".
Show UVEnvironment
When type is "uv" (or omitted), the environment uses uv to manage Python dependencies:
List of paths to packages to install in editable/development mode. Useful for local development when you want changes to be reflected immediately. Supports multiple packages for monorepo setups or shared libraries.
Note: When any UVEnvironment field is specified, FastMCP automatically creates an isolated environment using uv before running your server.
When environment configuration is provided, FastMCP:
Detects the environment type (defaults to "uv" if not specified)
Creates an isolated environment using the appropriate provider
Installs the specified dependencies
Runs your server in this clean environment
This build-time setup ensures your server always has the dependencies it needs, without polluting your system Python or conflicting with other projects.
Future Environment TypesSimilar to source types, future releases may support additional environment types for different runtime requirements, such as Docker containers or language-specific environments beyond Python.
The deployment configuration controls HOW your server runs. It defines the runtime behavior including network settings, environment variables, and execution context. These settings determine how your server operates when it executes, from transport protocols to logging levels.Environment variables are included in this section because they’re runtime configuration that affects how your server behaves when it executes, not how its environment is built. The deployment configuration is applied every time your server starts, controlling its operational characteristics.
The env field in deployment configuration supports runtime interpolation of environment variables using ${VAR_NAME} syntax. This enables dynamic configuration based on your deployment environment:
When the server starts, FastMCP replaces ${ENVIRONMENT}, ${DB_USER}, etc. with values from your system’s environment variables. If a variable doesn’t exist, the placeholder is preserved as-is.Example: If your system has ENVIRONMENT=production and DB_HOST=db.example.com:
Copy
// Configuration{ "deployment": { "env": { "API_URL": "https://api.${ENVIRONMENT}.example.com", "DB_HOST": "${DB_HOST}" } }}// Result at runtime{ "API_URL": "https://api.production.example.com", "DB_HOST": "db.example.com"}
This feature is particularly useful for:
Deploying the same configuration across development, staging, and production
Keeping sensitive values out of configuration files
Building dynamic URLs and connection strings
Creating environment-specific prefixes or suffixes
FastMCP automatically detects and uses a file specifically named fastmcp.json in the current directory, making server execution simple and consistent. Files with FastMCP configuration format but different names are not auto-detected and must be specified explicitly:
Copy
# Auto-detect fastmcp.json in current directorycd my-projectfastmcp run # No arguments needed!# Or specify a configuration file explicitlyfastmcp run prod.fastmcp.json# Skip environment setup when already in a uv environmentfastmcp run fastmcp.json --skip-env# Skip source preparation when source is already preparedfastmcp run fastmcp.json --skip-source# Skip both environment and source preparationfastmcp run fastmcp.json --skip-env --skip-source
You can use fastmcp project prepare to create a persistent uv project with all dependencies pre-installed:
Copy
# Create a persistent environmentfastmcp project prepare fastmcp.json --output-dir ./env# Use the pre-built environment to run the serverfastmcp run fastmcp.json --project ./env
This pattern separates environment setup (slow) from server execution (fast), useful for deployment scenarios.
By default, FastMCP creates an isolated environment with uv based on your configuration. When you already have a suitable Python environment, use the --skip-env flag to skip environment creation:
Copy
fastmcp run fastmcp.json --skip-env
When you already have an environment:
You’re in an activated virtual environment with all dependencies installed
You’re inside a Docker container with pre-installed dependencies
You’re in a CI/CD pipeline that pre-builds the environment
You’re using a system-wide installation with all required packages
You’re in a uv-managed environment (prevents infinite recursion)
This flag tells FastMCP: “I already have everything installed, just run the server.”
When working with source types that require preparation (future support for git repositories or cloud sources), use the --skip-source flag when you already have the source code available:
Copy
fastmcp run fastmcp.json --skip-source
When you already have the source:
You’ve previously cloned a git repository and don’t need to re-fetch
You have a cached copy of a cloud-hosted server
You’re in a CI/CD pipeline where source checkout is a separate step
You’re iterating locally on already-downloaded code
This flag tells FastMCP: “I already have the source code, skip any download/clone steps.”Note: For filesystem sources (local Python files), this flag has no effect since they don’t require preparation.The configuration file works with all FastMCP commands:
run - Start the server in production mode
dev - Launch with the Inspector UI for development
inspect - View server capabilities and configuration
install - Install to Claude Desktop, Cursor, or other MCP clients
When no file argument is provided, FastMCP searches the current directory for fastmcp.json. This means you can simply navigate to your project directory and run fastmcp run to start your server with all its configured settings.
Command-line arguments take precedence over configuration file values, allowing ad-hoc adjustments without modifying the file:
Copy
# Config specifies port 3000, CLI overrides to 8080fastmcp run fastmcp.json --port 8080# Config specifies stdio, CLI overrides to HTTPfastmcp run fastmcp.json --transport http# Add extra dependencies not in configfastmcp run fastmcp.json --with requests --with httpx
This precedence order enables:
Quick testing of different settings
Environment-specific overrides in deployment scripts
This configuration explicitly specifies the server entrypoint (mcp), making it clear which server instance or factory function to use. Uses all defaults: STDIO transport, no special dependencies, standard logging.
A configuration optimized for local development:
Copy
{ "$schema": "https://gofastmcp.com/public/schemas/fastmcp.json/v1.json", // WHERE does the server live? "source": { "path": "src/server.py", "entrypoint": "app" }, // WHAT dependencies does it need? "environment": { "type": "uv", "python": "3.12", "dependencies": ["fastmcp[dev]"], "editable": "." }, // HOW should it run? "deployment": { "transport": "http", "host": "127.0.0.1", "port": 8000, "log_level": "DEBUG", "env": { "DEBUG": "true", "ENV": "development" } }}
A production-ready configuration with full dependency management:
Copy
{ "$schema": "https://gofastmcp.com/public/schemas/fastmcp.json/v1.json", // WHERE does the server live? "source": { "path": "app/main.py", "entrypoint": "mcp_server" }, // WHAT dependencies does it need? "environment": { "python": "3.11", "requirements": "requirements/production.txt", "project": "." }, // HOW should it run? "deployment": { "transport": "http", "host": "0.0.0.0", "port": 3000, "path": "/api/mcp/", "log_level": "INFO", "env": { "ENV": "production", "API_BASE_URL": "https://api.example.com", "DATABASE_URL": "postgresql://user:pass@db.example.com/prod" }, "cwd": "/app", "args": ["--workers", "4"] }}
Configuration for a data analysis server with scientific packages:
If you’re currently using command-line arguments or shell scripts, migrating to fastmcp.json simplifies your workflow. Here’s how common CLI patterns map to configuration:CLI Command:
Copy
uv run --with pandas --with requests \ fastmcp run server.py \ --transport http \ --port 8000 \ --log-level INFO
fastmcp run # Automatically finds and uses fastmcp.json
The configuration file approach provides better documentation, easier sharing, and consistent execution across different environments while maintaining the flexibility to override settings when needed.