Netlify MCP Server
OfficialEnables creating, managing, and deploying Netlify projects, modifying access controls, installing or uninstalling Netlify extensions, fetching user and team information, managing form submissions, and handling environment variables and secrets.
Supports Warp as an MCP client for interacting with the Netlify API and CLI through natural language prompts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Netlify MCP Serverdeploy my latest commit to production"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Netlify MCP Server
Netlify MCP Server follows the Model Context Protocol (MCP) to enable code agents to use the Netlify API and CLI—so they can create new projects, build, deploy, and manage your Netlify resources using natural language prompts.
Overview
The Model Context Protocol is an emerging standard protocol for connecting code agents with MCP servers, allowing them to manage resources and perform tasks using natural language. The Netlify MCP Server acts as a bridge, providing API access, CLI tools, prompts, and more for your agents.
You can connect to the Netlify MCP Server using a variety of MCP clients, including:
Windsurf
Cursor
Claude
Copilot (VSCode)
Cline
Warp
LM Studio
Related MCP server: Kleap
Use Cases
With Netlify MCP Server, your AI agents can:
Create, manage, and deploy Netlify projects
Modify access controls for enhanced project security
Install or uninstall Netlify extensions
Fetch user and team information
Enable and manage form submissions
Create and manage environment variables and secrets
and more...
Prerequisites
Node.js 22 or higher Check with
node --versionA Netlify account
An MCP client (e.g., Windsurf, Cursor, Claude, Copilot)
Tip: Install the Netlify CLI globally for the best experience:
npm install -g netlify-cli
MCP Configuration
For the production MCP server, use the following configuration:
Editors with one-click install:
use the following link in your browser if link fails to render or open:
goose://extension?cmd=npx&arg=-y&arg=%40netlify%2Fmcp&id=netlify&name=Netlify&description=Build%2C%20deploy%2C%20and%20manage%20sites%20with%20Netlify's%20official%20MCP%20server.
Configuration for MCP config files:
{
"mcpServers": {
"netlify": {
"command": "npx",
"args": [
"-y",
"@netlify/mcp"
]
}
}
}For local development, see Set up local MCP configuration.
Troubleshooting
Node Version
Use Node.js 22 or higher for best results.
If you use
nvm, run:nvm install 22 nvm use 22
Netlify authentication troubleshooting
If you run into authentication issues, you can temporarily add a Netlify Personal Access Token (PAT) to your MCP configuration:
{
"mcpServers": {
"netlify-mcp": {
"command": "npx",
"args": ["-y", "@netlify/mcp"],
"env": {
"NETLIFY_PERSONAL_ACCESS_TOKEN": "YOUR-PAT-VALUE"
}
}
}
}Do not commit your PAT to your repository! Once resolved, remove your PAT from the config.
Generating a New Personal Access Token (PAT)
In the Netlify dashboard, select your user icon.
Go to User settings > OAuth > New access token.
Copy your token and add it (temporarily) to your MCP config as above.
Restart or refresh your MCP client.
Resources
Available Tools
9 toolsnetlify-coding-rulesBRead-onlyIdempotent
ALWAYS call when writing serverless or Netlify code. required step before creating or editing any type of functions, Netlify sdk/library usage, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| reference | No | Optional. Path of one of the skill's reference files (for example "references/migrations.md"), as listed at the end of the main response for that creationType. Omit to get the main skill guidance. | |
| creationType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context by stating this is a mandatory pre-step before writing/editing code. It does not describe the response shape or that the main response surfaces reference files, which is only inferable from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the imperative 'ALWAYS call', with no filler. The trailing 'etc.' slightly weakens precision, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should say what the agent receives (guidance text and, per the schema note, a list of reference file paths). It conveys the trigger and mandatory nature well but omits output expectations and gives no help choosing among the ambiguous enum values, leaving real gaps for a tool whose only required parameter is that enum.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the required 'creationType' enum has 21 values and no schema description, and the description says nothing about how to pick one. The enum contains near-duplicate options ('serverless' vs 'netlify-functions', 'blobs' vs 'netlify-blobs', 'db' vs 'netlify-database') that the description does not disambiguate. The 'reference' parameter is documented in the schema, but the description adds no parameter meaning of its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear this returns Netlify/serverless coding guidance ('coding rules' per the name) and frames it as a prerequisite step. It is a specific purpose but never explicitly says what is returned (rules text, reference files), leaving the resource implied rather than stated. Sibling tools are all unrelated reader/updater services, so differentiation is less of a concern here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong, explicit trigger conditions: 'ALWAYS call when writing serverless or Netlify code' and 'required step before creating or editing any type of functions, Netlify sdk/library usage'. It gives when-to-use clearly but offers no when-not guidance and does not discuss alternatives (none exist among the siblings, so this is a minor gap).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-deploy-services-readerCRead-onlyIdempotent
Select and run one of the following Netlify read operations (read-only) get-deploy, get-deploy-for-site
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the description's '(read-only)' adds nothing new. It discloses no behavioral traits beyond the annotations, such as auth requirements, scoping, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the operation list front-loaded and no wasted clauses. The missing punctuation before the operation names slightly hurts readability but not efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should ideally hint at what a deploy read returns, and it does not. For a two-branch multiplexer it identifies the branches adequately but leaves return-value and parameter selection context to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% on a nested anyOf schema, so the description carries the parameter burden. Naming the two operations maps loosely to the 'operation' const values, but the required deployId and siteId parameters are never mentioned, leaving the agent to read the schema for the important detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (select and run a Netlify read operation) and names the two concrete operations, get-deploy and get-deploy-for-site. It is distinguishable from the sibling updater/reader tools by scope, though it never explains what either operation actually retrieves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says to pick one of the two operations but gives no criteria for choosing between get-deploy and get-deploy-for-site, which is the central decision this tool forces. Usage is implied only by the operation names, with no when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-deploy-services-updaterCDestructive
Select and run one of the following Netlify write operations deploy-site
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description restates only 'write operations' and adds no behavioral context such as what a deploy overwrites, auth requirements, or side effects on the live site.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and front-loaded, so there is no padding, but the single sentence is awkwardly truncated and reads as an incomplete template ('one of the following ... deploy-site'). Brevity here reflects under-specification rather than tight writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent deploy tool with a required nested object parameter and no output schema, the description is far too thin. It leaves the agent to infer the entire invocation contract (site linkage, deploy directory semantics, effects) from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema description coverage is 0% at the top level, and the description mentions no parameters at all. The nested siteId/deployDirectory fields do carry their own descriptions, but the tool description adds nothing to clarify the operation/params envelope an agent must construct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a Netlify write operation and names 'deploy-site', so the resource and action are inferable. But the phrasing is garbled ('Select and run one of the following Netlify write operations deploy-site') and it does not cleanly distinguish itself from the many sibling reader/updater tools of the same shape.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says 'select and run' but only one operation (deploy-site) exists, so there is effectively no selection guidance. Nothing states when to use this deployer versus the deploy reader or the other updater tools, and no prerequisites (linking a site, permissions) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-extension-services-readerCRead-onlyIdempotent
Select and run one of the following Netlify read operations (read-only) get-extensions, get-full-extension-details, initialize-database
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, and the description's '(read-only)' merely repeats that. It adds no behavioral context such as authentication needs, rate limits, side effects of 'initialize-database', or what each operation touches, which is exactly what would be valuable here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no padding, which is appropriately sized for a dispatcher. It is slightly garbled by embedding the operation list inline and could have been structured as a short list, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a compound tool with a nested union schema and no output schema, the description should at minimum explain what each operation returns or requires. It omits per-operation semantics entirely, leaving the agent to reverse-engineer intent from const values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single top-level parameter hides a discriminated union. The description only echoes the three operation consts that the schema already defines and says nothing about inputs like teamId or extensionSlug, so it adds almost no meaning beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a dispatcher that runs one of three named Netlify read operations, which is more specific than a tautology. However, it never explains what any of the three operations actually does (especially 'initialize-database', which reads like a mutating action), so an agent cannot distinguish their purposes or differentiate this tool from the sibling extension-services-updater beyond the word 'read'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the tool is for read operations but gives no guidance on when to pick get-extensions vs get-full-extension-details vs initialize-database, nor any condition under which the updater sibling should be chosen instead. The agent is left to infer selection entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-extension-services-updaterCDestructiveIdempotent
Select and run one of the following Netlify write operations change-extension-installation
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds no behavioral context beyond repeating that it is a write operation—it does not describe what gets destroyed, authentication needs, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence, but it is poorly structured and front-loads boilerplate ('Select and run one of the following') while giving no useful detail. The phrase 'one of the following' is misleading when only a single operation is listed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write tool with a nested selectSchema object and no output schema, the description is far too thin. It omits what the operation does, required parameters, and any return or side-effect information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema description coverage is 0%, and the description mentions no parameters at all. Required nested fields (extensionSlug, shouldBeInstalled, teamId) are undocumented, so the description fails to compensate for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it is a Netlify write operation to 'change-extension-installation', which gives a specific verb and resource. However, it is phrased with boilerplate ('Select and run one of the following') and never clarifies that it installs or uninstalls an extension, leaving the exact effect ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as netlify-extension-services-reader or other updater tools. The description only names the operation, not the context or conditions for invoking it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-project-services-readerCRead-onlyIdempotent
Select and run one of the following Netlify read operations (read-only) get-project, get-projects, get-forms-for-project
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description's only behavioral content - '(read-only)' - merely repeats readOnlyHint=true and adds nothing about response shape, pagination, or auth requirements. No contradiction, but no value added.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste; the operation list is placed where an agent needs it. It is arguably too terse given the schema complexity, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-way dispatch tool with a nested anyOf schema, 0% param coverage, and no output schema, the description is far too thin. It neither explains the operations' semantics nor the parameters, so an agent cannot confidently construct a call from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented params like siteId, teamSlug, formId, and projectNameSearchValue. Instead it only names the operations and provides no parameter meaning, leaving the nested anyOf schema to speak for itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource - it is a dispatcher that selects and runs one of three named Netlify project read operations - and the '(read-only)' phrasing distinguishes it from the netlify-project-services-updater sibling. It stops short of saying what each individual operation returns, so an agent still has to infer the meaning of get-forms-for-project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to pick get-project versus get-projects versus get-forms-for-project, nor any mention of the updater sibling as the write alternative. The user is left to infer selection purely from the operation names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-project-services-updaterCDestructive
Select and run one of the following Netlify write operations update-visitor-access-controls, update-forms, manage-form-submissions, update-project-name, manage-env-vars, create-new-project
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, idempotentHint=false and readOnlyHint=false, so the safety profile is covered. The description adds nothing beyond 'write operations' — it does not say what gets destroyed (e.g., delete-submission), what auth is required, or any rate/scope constraints, so it is largely redundant with the annotations rather than additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, and the operation list is necessary to expose the discriminator. The comma-spliced enumeration reads awkwardly and could have been formatted, but there is no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mega-tool wrapping six destructive write operations behind a complex nested union with no output schema, the description is thin: it omits what each operation does, the wrapper fields, and any safety guidance. The annotations carry the destructive signal, but the agent still lacks enough context to select and configure an operation confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single top-level parameter 'selectSchema' is a large anyOf union with 0% description coverage, and the description never explains the {operation, params, aiAgentName, llmModelName} wrapper. Listing the operation names does map to the discriminator const values, but the params structure, defaults, and nested fields are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('run one of the following Netlify write operations') and enumerates the six supported operations, which lets an agent map intent to a discriminator value. It implicitly contrasts with the sibling readers via 'write operations' but never names netlify-project-services-reader explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The operation list functions as a weak selection guide, telling the agent which writes are available. However there is no when-to-use versus the reader sibling, no prerequisites (API token/auth), and no warning about which operations are destructive/irreversible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-team-services-readerCRead-onlyIdempotent
Select and run one of the following Netlify read operations (read-only) get-teams, get-team, get-team-env-vars
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, and the description merely restates 'read-only' without adding new behavioral context. It discloses nothing about what the operations return, pagination, or how the optional envVarKey affects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficiently front-loaded sentence naming the operation set, with no filler. It is appropriately sized for a thin multiplexer wrapper, though it is arguably too terse to guide use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a nested anyOf parameter wrapper, the description should clarify what each operation returns and which parameters belong to which variant. It omits all of that, leaving the agent to reverse-engineer operation behavior from schema consts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no meaning for any parameter. It never mentions required teamId, optional envVarKey, or the aiAgentName/llmModelName fields. While the schema's anyOf variants structurally imply required fields, the prose contributes nothing beyond what is already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (Netlify team services) and enumerates the three read operations it multiplexes (get-teams, get-team, get-team-env-vars). The name and text distinguish it from user/deploy/project readers, so an agent can tell roughly what it covers, though it never explains how the three sub-operations differ in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says the tool runs one of three read operations but gives no guidance on when to choose each operation, what prerequisites apply, or when to prefer a sibling reader. The agent must infer everything about operation selection from the operation names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-user-services-readerCRead-onlyIdempotent
Select and run one of the following Netlify read operations (read-only) get-user
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the description's '(read-only)' merely repeats structured data. It adds no behavioral context such as auth requirements, rate limits, or what the operation returns, leaving the annotation-covered surface as the only source of truth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste, which is appropriate for a thin wrapper. However, the 'one of the following' construction implies a list that never materializes, making the front-loaded information slightly less crisp than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a nested parameter object, 0% schema coverage, and no output schema, the description should explain the wrapper fields and expected result. It instead supplies only the operation name, leaving an agent to infer how to populate 'params' and the metadata fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema is a nested object with 'selectSchema.operation', 'params', 'aiAgentName' and 'llmModelName' keys. The description names the operation value ('get-user') but says nothing about the wrapper fields or what params the operation accepts, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('read operations' on 'user' services) and names the single operation 'get-user', which lets an agent distinguish it from the deploy/team/project/extension siblings. The phrasing 'one of the following' is slightly muddled since only one operation is listed, but the intent is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many sibling readers, nor any prerequisites or exclusions. The only usage signal is the parenthetical '(read-only)', which is a safety note rather than routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.0.3- Changed
netlify-coding-rules2 fields changed- changed
Input schema / properties / creationType / enumPrevious value: -[ - "serverless", - "edge-functions", - "blobs", - "image-cdn", - "forms", - "db" -]New value: +[ + "netlify-access-control", + "netlify-agent-runner", + "netlify-ai-gateway", + "netlify-blobs", + "netlify-caching", + "netlify-config", + "netlify-database", + "netlify-deploy", + "netlify-edge-functions", + "netlify-forms", + "netlify-frameworks", + "netlify-functions", + "netlify-identity", + "netlify-image-cdn", + "netlify-mcp-servers", + "serverless", + "edge-functions", + "blobs", + "image-cdn", + "forms", + "db" +] - added
Input schema / properties / referenceAdded value: +{ + "description": "Optional. Path of one of the skill's reference files (for example \"references/migrations.md\"), as listed at the end of the main response for that creationType. Omit to get the main skill guidance.", + "type": "string" +}
- Changed
netlify-extension-services-reader1 field changed- changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-extensions", - "type": "string" - }, - "params": { - "properties": {}, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-full-extension-details", - "type": "string" - }, - "params": { - "properties": { - "extensionSlug": { - "type": "string" - }, - "teamId": { - "description": "Team id of the current project team. If unsure, ask what Netlify team", - "type": "string" - } - }, - "required": [ - "extensionSlug", - "teamId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-extensions", + "type": "string" + }, + "params": { + "properties": {}, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-full-extension-details", + "type": "string" + }, + "params": { + "properties": { + "extensionSlug": { + "type": "string" + }, + "teamId": { + "description": "Team id of the current project team. If unsure, ask what Netlify team", + "type": "string" + } + }, + "required": [ + "extensionSlug", + "teamId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "initialize-database", + "type": "string" + }, + "params": { + "properties": {}, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-extension-services-updater4 fields changed- removed
Input schema / properties / selectSchema / anyOfRemoved value: -[ - { - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "change-extension-installation", - "type": "string" - }, - "params": { - "properties": { - "extensionSlug": { - "type": "string" - }, - "shouldBeInstalled": { - "type": "boolean" - }, - "siteId": { - "description": "Site id of the current project site. If unsure, ask what Netlify site", - "type": "string" - }, - "teamId": { - "description": "Team id of the current project team. If unsure, ask what Netlify team", - "type": "string" - } - }, - "required": [ - "extensionSlug", - "shouldBeInstalled", - "teamId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "initialize-database", - "type": "string" - }, - "params": { - "properties": {}, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -] - added
Input schema / properties / selectSchema / propertiesAdded value: +{ + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "change-extension-installation", + "type": "string" + }, + "params": { + "properties": { + "extensionSlug": { + "type": "string" + }, + "shouldBeInstalled": { + "type": "boolean" + }, + "siteId": { + "description": "Site id of the current project site. If unsure, ask what Netlify site", + "type": "string" + }, + "teamId": { + "description": "Team id of the current project team. If unsure, ask what Netlify team", + "type": "string" + } + }, + "required": [ + "extensionSlug", + "shouldBeInstalled", + "teamId" + ], + "type": "object" + } +} - added
Input schema / properties / selectSchema / requiredAdded value: +[ + "operation" +] - added
Input schema / properties / selectSchema / typeAdded value: +"object"
9 tool updates
v1.0.1- Changed
netlify-coding-rules2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
netlify-deploy-services-reader3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-deploy", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "deployId": { - "type": "string" - } - }, - "required": [ - "deployId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-deploy-for-site", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "deployId": { - "type": "string" - }, - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId", - "deployId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-deploy", + "type": "string" + }, + "params": { + "properties": { + "deployId": { + "type": "string" + } + }, + "required": [ + "deployId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-deploy-for-site", + "type": "string" + }, + "params": { + "properties": { + "deployId": { + "type": "string" + }, + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId", + "deployId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-deploy-services-updater4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / selectSchema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / selectSchema / properties / params / additionalPropertiesRemoved value: -false
- Changed
netlify-extension-services-reader3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-extensions", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": {}, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-full-extension-details", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "extensionSlug": { - "type": "string" - }, - "teamId": { - "description": "Team id of the current project team. If unsure, ask what Netlify team", - "type": "string" - } - }, - "required": [ - "extensionSlug", - "teamId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-extensions", + "type": "string" + }, + "params": { + "properties": {}, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-full-extension-details", + "type": "string" + }, + "params": { + "properties": { + "extensionSlug": { + "type": "string" + }, + "teamId": { + "description": "Team id of the current project team. If unsure, ask what Netlify team", + "type": "string" + } + }, + "required": [ + "extensionSlug", + "teamId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-extension-services-updater3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "change-extension-installation", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "extensionSlug": { - "type": "string" - }, - "shouldBeInstalled": { - "type": "boolean" - }, - "siteId": { - "description": "Site id of the current project site. If unsure, ask what Netlify site", - "type": "string" - }, - "teamId": { - "description": "Team id of the current project team. If unsure, ask what Netlify team", - "type": "string" - } - }, - "required": [ - "extensionSlug", - "shouldBeInstalled", - "teamId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "initialize-database", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": {}, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "change-extension-installation", + "type": "string" + }, + "params": { + "properties": { + "extensionSlug": { + "type": "string" + }, + "shouldBeInstalled": { + "type": "boolean" + }, + "siteId": { + "description": "Site id of the current project site. If unsure, ask what Netlify site", + "type": "string" + }, + "teamId": { + "description": "Team id of the current project team. If unsure, ask what Netlify team", + "type": "string" + } + }, + "required": [ + "extensionSlug", + "shouldBeInstalled", + "teamId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "initialize-database", + "type": "string" + }, + "params": { + "properties": {}, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-project-services-reader3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-project", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-projects", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "projectNameSearchValue": { - "description": "Search for a project by partial name match", - "type": "string" - }, - "teamSlug": { - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-forms-for-project", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "formId": { - "type": "string" - }, - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-project", + "type": "string" + }, + "params": { + "properties": { + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-projects", + "type": "string" + }, + "params": { + "properties": { + "projectNameSearchValue": { + "description": "Search for a project by partial name match", + "type": "string" + }, + "teamSlug": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-forms-for-project", + "type": "string" + }, + "params": { + "properties": { + "formId": { + "type": "string" + }, + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-project-services-updater3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "update-visitor-access-controls", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "appliesTo": { - "description": "Which project context this rule applies to", - "enum": [ - "all-projects", - "non-production-projects" - ], - "type": "string" - }, - "passwordValue": { - "type": "string" - }, - "requirePassword": { - "type": "boolean" - }, - "requireSSOTeamLogin": { - "type": "boolean" - }, - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId", - "appliesTo" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "update-forms", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "forms": { - "enum": [ - "enabled", - "disabled" - ], - "type": "string" - }, - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "manage-form-submissions", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "action": { - "enum": [ - "get-submissions", - "delete-submission" - ], - "type": "string" - }, - "formId": { - "type": "string" - }, - "limit": { - "default": 20, - "type": "number" - }, - "offset": { - "default": 0, - "type": "number" - }, - "siteId": { - "type": "string" - }, - "submissionId": { - "type": "string" - } - }, - "required": [ - "action" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "update-project-name", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Name must be hyphenated alphanumeric such as \"my-site\" or \"my-site-2\"", - "pattern": "^[a-z0-9-]+$", - "type": "string" - }, - "siteId": { - "type": "string" - } - }, - "required": [ - "siteId", - "name" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "manage-env-vars", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "deleteEnvVar": { - "type": "boolean" - }, - "envVarIsSecret": { - "type": "boolean" - }, - "envVarKey": { - "type": "string" - }, - "envVarValue": { - "type": "string" - }, - "getAllEnvVars": { - "type": "boolean" - }, - "newVarContext": { - "default": "all", - "enum": [ - "all", - "dev", - "branch-deploy", - "deploy-preview", - "production", - "branch" - ], - "type": "string" - }, - "newVarScopes": { - "default": [ - "all" - ], - "items": { - "enum": [ - "all", - "builds", - "functions", - "runtime", - "post_processing" - ], - "type": "string" - }, - "type": "array" - }, - "siteId": { - "type": "string" - }, - "upsertEnvVar": { - "type": "boolean" - } - }, - "required": [ - "siteId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "create-new-project", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "name": { - "description": "Name must be hyphenated alphanumeric such as \"my-site\" or \"my-site-2\"", - "pattern": "^[a-z0-9-]+$", - "type": "string" - }, - "teamSlug": { - "type": "string" - } - }, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "update-visitor-access-controls", + "type": "string" + }, + "params": { + "properties": { + "appliesTo": { + "description": "Which project context this rule applies to", + "enum": [ + "all-projects", + "non-production-projects" + ], + "type": "string" + }, + "passwordValue": { + "type": "string" + }, + "requirePassword": { + "type": "boolean" + }, + "requireSSOTeamLogin": { + "type": "boolean" + }, + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId", + "appliesTo" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "update-forms", + "type": "string" + }, + "params": { + "properties": { + "forms": { + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "manage-form-submissions", + "type": "string" + }, + "params": { + "properties": { + "action": { + "enum": [ + "get-submissions", + "delete-submission" + ], + "type": "string" + }, + "formId": { + "type": "string" + }, + "limit": { + "default": 20, + "type": "number" + }, + "offset": { + "default": 0, + "type": "number" + }, + "siteId": { + "type": "string" + }, + "submissionId": { + "type": "string" + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "update-project-name", + "type": "string" + }, + "params": { + "properties": { + "name": { + "description": "Name must be hyphenated alphanumeric such as \"my-site\" or \"my-site-2\"", + "pattern": "^[a-z0-9-]+$", + "type": "string" + }, + "siteId": { + "type": "string" + } + }, + "required": [ + "siteId", + "name" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "manage-env-vars", + "type": "string" + }, + "params": { + "properties": { + "deleteEnvVar": { + "type": "boolean" + }, + "envVarIsSecret": { + "type": "boolean" + }, + "envVarKey": { + "type": "string" + }, + "envVarValue": { + "type": "string" + }, + "getAllEnvVars": { + "type": "boolean" + }, + "newVarContext": { + "default": "all", + "enum": [ + "all", + "dev", + "branch-deploy", + "deploy-preview", + "production", + "branch" + ], + "type": "string" + }, + "newVarScopes": { + "default": [ + "all" + ], + "items": { + "enum": [ + "all", + "builds", + "functions", + "runtime", + "post_processing" + ], + "type": "string" + }, + "type": "array" + }, + "siteId": { + "type": "string" + }, + "upsertEnvVar": { + "type": "boolean" + } + }, + "required": [ + "siteId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "create-new-project", + "type": "string" + }, + "params": { + "properties": { + "name": { + "description": "Name must be hyphenated alphanumeric such as \"my-site\" or \"my-site-2\"", + "pattern": "^[a-z0-9-]+$", + "type": "string" + }, + "teamSlug": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-team-services-reader3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / selectSchema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-teams", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": {}, - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "aiAgentName": { - "type": "string" - }, - "llmModelName": { - "type": "string" - }, - "operation": { - "const": "get-team", - "type": "string" - }, - "params": { - "additionalProperties": false, - "properties": { - "teamId": { - "type": "string" - } - }, - "required": [ - "teamId" - ], - "type": "object" - } - }, - "required": [ - "operation" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-teams", + "type": "string" + }, + "params": { + "properties": {}, + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-team", + "type": "string" + }, + "params": { + "properties": { + "teamId": { + "type": "string" + } + }, + "required": [ + "teamId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + }, + { + "properties": { + "aiAgentName": { + "type": "string" + }, + "llmModelName": { + "type": "string" + }, + "operation": { + "const": "get-team-env-vars", + "type": "string" + }, + "params": { + "properties": { + "envVarKey": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "teamId" + ], + "type": "object" + } + }, + "required": [ + "operation" + ], + "type": "object" + } +]
- Changed
netlify-user-services-reader4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / selectSchema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / selectSchema / properties / params / additionalPropertiesRemoved value: -false
13 tool updates
v1.0.0- Removed
netlify-deploy-services - Added
netlify-deploy-services-reader - Added
netlify-deploy-services-updater - Removed
netlify-extension-services - Added
netlify-extension-services-reader - Added
netlify-extension-services-updater - Removed
netlify-project-services - Added
netlify-project-services-reader - Added
netlify-project-services-updater - Removed
netlify-team-services - Added
netlify-team-services-reader - Removed
netlify-user-services - Added
netlify-user-services-reader
6 tool updates
- First observed
netlify-coding-rules - First observed
netlify-deploy-services - First observed
netlify-extension-services - First observed
netlify-project-services - First observed
netlify-team-services - First observed
netlify-user-services
TDQS
Scored across 9 tools
Tools are grouped by domain and read/write, making most purposes distinct. However, netlify-extension-services-reader includes initialize-database, a write operation mislabeled as read-only, which could cause confusion.
Consistent kebab-case pattern netlify-<domain>-services-<reader|updater> for 8 tools, but netlify-coding-rules deviates from the pattern.
9 tools is well within the ideal range and each domain-focused tool earns its place without excessive fragmentation.
Read coverage is broad, but write/delete operations are notably missing (e.g., no delete project, deploy, or team), and database management under extensions is incomplete.
Maintenance
Related MCP Connectors
Deploy and manage your apps, databases, storage, and scheduled jobs from your AI agent
Deploy AI-generated HTML/CSS/JS to instant public HTTPS URLs from any MCP-compatible agent.
Build and publish full-stack apps from your coding agent: models, rules, pages, auth, per-app MCP.
Build and deploy websites, Telegram and Discord bots from chat via the DreamAgent platform.
Related MCP Servers
- -licenseCqualityNot gradedmaintenanceFollows the Model Context Protocol to enable code agents to use Netlify API and CLI, allowing them to create, deploy, and manage Netlify resources using natural language prompts.642,263 npm-
- AlicenseAqualityBmaintenanceEnables AI agents to build, edit, and publish live websites with hosting, database, auth, and domains via the Model Context Protocol.1317 npm1MIT
- AlicenseCqualityDmaintenanceEnables AI agents to create, deploy, and manage Netlify projects and resources using natural language via the Netlify API and CLI.642,263 npmISC
- AlicenseNot gradedqualityDmaintenanceEnables natural language management of Cloudflare services including Workers, KV, R2, D1, Queues, and more via the Model Context Protocol.2,442 npmApache 2.0