# How to Deploy MCP Server to Fly.io

Deploying an MCP server to Fly.io positions your agent tools close to users worldwide. Fly.io Machines launch in seconds across multiple+ regions, with persistent volumes for state and secrets for secure configs. This guide walks through Dockerizing your MCP server, deploying with flyctl, adding volumes, and scaling for production loads.

Source: https://fast.io/resources/deploy-mcp-server-flyio/
Last reviewed: 2026-02-19

## What Is an MCP Server and Why Fly.io?

An MCP server implements the Model Context Protocol, exposing tools for AI agents via Streamable HTTP or SSE. Fastio's hosted MCP server offers a consolidated MCP toolset for workspaces, but running your own lets you customize tools, integrate private data, or proxy to services like Fastio.

Fly.io suits MCP deployments because Machines start sub-second, scale horizontally, and run in multiple+ regions for low-latency agent calls. Volumes persist agent state across restarts, and secrets handle API keys securely. Developers report multiple-multiple% faster tool responses versus centralized servers.

Production MCP servers need persistence for sessions and low-latency routing. Fly.io handles this natively without VPCs or load balancers.

Helpful references: [Fastio Workspaces](/product/workspaces/), [Fastio Collaboration](/product/collaboration/), and [Fastio AI](/product/ai/).

## What to check before scaling deploy-mcp-server-flyio

Install flyctl from fly.io. Run these commands:

```
curl -L https://fly.io/install.sh | sh
flyctl auth signup  # or login if existing account
```

Dockerize your MCP server. Example Dockerfile for a Node.js MCP:

```
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
```

Tag and push: `docker build -t your-registry/mcp-server . && docker push your-registry/mcp-server`

## Create Fly App and Initial Deploy

Launch the app:

```
flyctl launch --name my-mcp-server --image your-registry/mcp-server:latest
```

Edit fly.toml:

```
app = "my-mcp-server"
primary_region = "iad"

[[services]]
  internal_port = 8080
  protocol = "tcp"

[[services.ports]]
    port = 443
    handlers = ["http"]

[[services.http_checks]]
    interval = "10s"
    grace_period = "5s"
    method = "GET"
    path = "/health"
```

Deploy: `flyctl deploy`

## Add Persistent Volumes for MCP State

MCP servers store agent sessions and state. Attach Fly Volumes:

```
flyctl volumes create mcp-data --region iad --size 10
flyctl machine update <machine-id> --attach-volume mcp-data --volume-path /data
```

Update Dockerfile to use /data for persistence. Restart Machine: `flyctl machine restart <machine-id>`

Volumes replicate across multiple AZs by default, surviving Machine restarts. Scale to multiple GB+ for large agent fleets.

## Configure Secrets on Fly.io

Store API keys and configs as secrets:

```
flyctl secrets set FASTIO_API_KEY=yourkey DATABASE_URL=postgres://...
```

Secrets inject as env vars on Machine boot. Access in code: `process.env.FASTIO_API_KEY`.

List: `flyctl secrets list`. Unset: `flyctl secrets unset KEY`.

Secrets encrypt at rest, decrypt only on host at boot.

## Scaling and Monitoring MCP Servers

Scale Machines: `flyctl scale count 3 --region iad`

Multi-region: `flyctl regions add ord sin`

Autoscaling: Add to fly.toml:

```
[http_service]
  auto_stop_machines = true
  auto_start_machines = true
  min_machines_running = 1
```

Monitor: `flyctl logs`, `flyctl metrics`. Set alerts via API.

For high-load MCP, use Machines API directly for dynamic scaling based on agent traffic.

## Frequently asked questions

### How do Fly.io volumes work with MCP servers?

Fly Volumes provide block storage attached to Machines. Create with flyctl volumes create, attach via flyctl machine update --attach-volume. Persists MCP session data across deploys. Replicates in multiple AZs, sizes from multiple-multiple GB+.

### How to handle MCP secrets on Fly.io?

Use flyctl secrets set KEY=VALUE. Secrets become env vars on boot, encrypted at rest. Ideal for Fastio API keys or DB creds. List with fly secrets list, stage changes with --stage before deploy.

### Can I deploy MCP server multi-region on Fly?

Yes, flyctl regions add <region>. Traffic routes via Anycast to nearest. Use Machines API for region-specific scaling.

### What's the cost to deploy MCP on Fly.io?

Hobby: free up to limits. Paid: ~published pricing per shared-cpu-multiple Machine + volume GB-hours. Check fly.io/pricing.

### How to integrate Fastio MCP tools?

Proxy your MCP to Fastio API or connect directly to https://mcp.fast.io/mcp. Consolidated toolset for workspaces, authenticated via API key.

## About Fast.io

Fast.io provides shared workspaces where people and AI agents work on the same files, with built-in semantic search and citation-backed chat over what they hold. Agents reach it through a remote MCP server at https://mcp.fast.io/mcp, a REST API at https://api.fast.io/current/, and a command line client published on npm as @vividengine/fastio-cli.
