Python port of the official Netlify MCP server: manage Netlify projects, deploys, teams, extensions, and env vars from an MCP-compatible agent.
Project description
netlify-mcp (Python)
A Python port of the official Netlify MCP server, built to behave identically to the TypeScript original for the local stdio use case: same tool names, same input schemas, same response text.
This port targets the local stdio server only. Two things in the original are intentionally out of scope:
- The remote proxy deploy mode (
--proxy-path/ JWE flow), used when the MCP server runs behind Netlify's hosted remote endpoint. - The full remote OAuth/OIDC hosting server.
Everything else is ported: the user, team, project, deploy, and extension domain tool groups, the netlify-coding-rules context tool, and the Claude Design "Send to Netlify" import tools (import-claude-design-from-url, get-design-import-job-status).
Requirements
- Python 3.12+
- A Netlify account, authenticated via one of:
netlify login(using the Netlify CLI) — this server reads the sameconfig.jsonthe CLI writes.- The
NETLIFY_PERSONAL_ACCESS_TOKENenvironment variable, which overrides the CLI-managed token when set.
Install and run
uv sync
uv run netlify-mcp
Or, for one tool per operation instead of the grouped read/write selector tools:
uv run netlify-mcp --verbose
MCP client configuration
{
"mcpServers": {
"netlify": {
"command": "uv",
"args": ["run", "--directory", "/path/to/python-netlify-mcp", "netlify-mcp"]
}
}
}
Tools
By default, each domain exposes two selector tools: netlify-<domain>-services-reader (read-only operations) and netlify-<domain>-services-updater (write operations). Each selector takes a selectSchema of {operation, params} covering every operation listed below for that domain. Pass --verbose to instead register one tool per operation, named netlify-<domain>-<operation>.
user
| Operation | Read-only | Description |
|---|---|---|
get-user |
Yes | Get the current authenticated Netlify user's account details. |
team
| Operation | Read-only | Description |
|---|---|---|
get-teams |
Yes | List the Netlify teams (accounts) the user belongs to. |
get-team |
Yes | Get details for a specific Netlify team. |
project
| Operation | Read-only | Description |
|---|---|---|
get-project |
Yes | Get details for a specific Netlify project. |
get-projects |
Yes | List Netlify projects, optionally filtered by team or name. |
get-forms-for-project |
Yes | List (or fetch one) Netlify Forms form(s) configured for a project. |
update-visitor-access-controls |
No | Configure SSO or password-based visitor access control for a project. |
update-forms |
No | Enable or disable Netlify Forms processing for a project. |
manage-form-submissions |
No | Get or delete form submissions for a project. |
update-project-name |
No | Rename a Netlify project. |
manage-env-vars |
No | Get, create/update, or delete environment variables for a project. |
create-new-project |
No | Create a new Netlify project. |
deploy
| Operation | Read-only | Description |
|---|---|---|
get-deploy |
Yes | Get a deploy by id. |
get-deploy-for-site |
Yes | Get a specific deploy for a given project. |
deploy-site |
No | Zip up a local directory and deploy it to a Netlify project. |
extension
| Operation | Read-only | Description |
|---|---|---|
get-extensions |
Yes | List extensions available to any Netlify team. |
get-full-extension-details |
Yes | Get full details for a specific extension on a team. |
change-extension-installation |
No | Install or uninstall an extension for a team (and optionally a site). |
initialize-database |
No | Return setup instructions for the @netlify/database package. |
Standalone tools
These are registered individually, not as part of a domain's reader/updater selector, and are unaffected by --verbose.
| Tool | Read-only | Description |
|---|---|---|
netlify-coding-rules |
Yes | Context tool that must be called before writing any serverless or Netlify SDK/library code. |
import-claude-design-from-url |
No | Deploy a Claude Design export to Netlify as a new project ("Send to Netlify"). |
get-design-import-job-status |
Yes | Check the status of an in-progress Claude Design import deploy job. |
Configuration
Environment variables (see .env.example):
| Variable | Description |
|---|---|
NETLIFY_PERSONAL_ACCESS_TOKEN |
Optional. Skips the CLI-managed token lookup when set. |
LOG_LEVEL |
Logging level (default INFO). |
Development
uv sync --group dev
uv run pytest
uv run ruff check .
uv run mypy src
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netlify_mcp-1.0.0.tar.gz.
File metadata
- Download URL: netlify_mcp-1.0.0.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2013d7a6624d21fa6f8531c94770a013423f8790c9290be54ac0d3beaf9f11b
|
|
| MD5 |
2dd512ac1808bb617a6478c7cdd3036f
|
|
| BLAKE2b-256 |
40c1bb1646855cc40e982550cc4c06259a68ed2b128e671cd4a13c2ab3bef927
|
Provenance
The following attestation bundles were made for netlify_mcp-1.0.0.tar.gz:
Publisher:
pypi-publish.yml on locomotive-agency/netlify-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netlify_mcp-1.0.0.tar.gz -
Subject digest:
d2013d7a6624d21fa6f8531c94770a013423f8790c9290be54ac0d3beaf9f11b - Sigstore transparency entry: 2190152113
- Sigstore integration time:
-
Permalink:
locomotive-agency/netlify-mcp@7498a4d9f5b13bce58a58aded091c52103073df7 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/locomotive-agency
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@7498a4d9f5b13bce58a58aded091c52103073df7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file netlify_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: netlify_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 52.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24ce309b01937c40bef80f1ca14337996d6ad01883ad47aa81b0f130a2bd03f5
|
|
| MD5 |
502b04e38d6dedfb94f8268c04954cc8
|
|
| BLAKE2b-256 |
c4bb1ea9147415fd77d5a8c15451da37f7e630cf1003c5ea8058ea7f0692238a
|
Provenance
The following attestation bundles were made for netlify_mcp-1.0.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on locomotive-agency/netlify-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netlify_mcp-1.0.0-py3-none-any.whl -
Subject digest:
24ce309b01937c40bef80f1ca14337996d6ad01883ad47aa81b0f130a2bd03f5 - Sigstore transparency entry: 2190152131
- Sigstore integration time:
-
Permalink:
locomotive-agency/netlify-mcp@7498a4d9f5b13bce58a58aded091c52103073df7 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/locomotive-agency
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@7498a4d9f5b13bce58a58aded091c52103073df7 -
Trigger Event:
release
-
Statement type: