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-only
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 |
|---|---|---|---|
| creationType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the context that this is a mandatory pre-step before code creation/editing, and it does not contradict the readOnlyHint annotation. However, it does not describe what the tool actually returns, how it behaves, or what the agent should do with its output; the read-only annotation lowers the burden, so a 3 is appropriate.
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?
The description is short and front-loaded with 'ALWAYS call', making the key instruction immediately visible. It loses some polish due to a lowercase sentence fragment and the vague 'etc.', but overall it is concise and every sentence contributes to the usage directive.
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?
Given that this is a one-parameter read-only tool, the description should at least explain that it returns the relevant coding rules for the selected creationType and what those categories cover. It does neither, leaving the agent with a strong imperative but an incomplete functional contract.
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 never mentions creationType or any of its enum values (serverless, edge-functions, blobs, image-cdn, forms, db). The description only refers vaguely to 'serverless or Netlify code' and 'functions', leaving the agent without the parameter-level meaning needed to call the tool correctly.
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 clearly positions the tool as a required pre-step for writing serverless or Netlify code, and specifically for creating or editing functions and using the Netlify SDK/library. This is more informative than the tool name alone and distinguishes it from the sibling service reader/updater tools, though it never states the tool's core action (e.g., 'retrieves coding rules').
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 description gives explicit when-to-use guidance: 'ALWAYS call when writing serverless or Netlify code' and 'required step before creating or editing any type of functions, Netlify sdk/library usage'. It does not mention when not to use it or name alternative tools, but the use context is strong and unambiguous.
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-only
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?
The annotation already declares readOnlyHint=true, and the description reinforces this by saying 'read-only', so there is no contradiction. The description adds the dispatch-like behavior of selecting between the two named operations. However, it does not disclose return format, error behavior, authentication needs, or any other behavioral traits beyond the annotation.
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?
The description is a single efficient sentence with no filler, and the core action and operation names are front-loaded. It could be slightly better structured by separating the operation list, but overall it is appropriately sized for a short tool description.
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 tool with two distinct operations, nested parameters, and no output schema, this description is incomplete. It lacks parameter guidance, decision criteria between operations, and any indication of what the operations return. The read-only safety is covered, but essential calling context is missing.
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 carries full responsibility for explaining parameters. It only lists operation names without mentioning deployId, siteId, or how the selectSchema discriminator works. The schema itself provides no descriptions either, leaving an agent without meaningful parameter semantics.
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 action ('Select and run') applied to Netlify read operations and names the two supported operations, get-deploy and get-deploy-for-site. It clearly identifies this as a read-only tool, which distinguishes it from sibling updater tools at a basic level. It stops short of describing what each operation returns, so it is not fully self-contained.
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 description gives a general context: run one of the listed Netlify read operations. It does not explain when to choose get-deploy versus get-deploy-for-site, nor does it explicitly contrast this tool with sibling readers or updaters. An agent is left to infer selection criteria from 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-deploy-services-updaterC
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?
`readOnlyHint: false` already marks the tool as mutating, and the description's 'write operations' only restates that. It does not disclose that deployment updates the live Netlify site, requires a valid `siteId`, or may fail if the deploy directory is incorrect. No destructive consequences or auth requirements are described.
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?
The description is a single short sentence, but it spends words on filler ('Select and run one of the following') and places the actual operation at the end. It is brief but not cleanly informative.
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 mutating deployment tool with no output schema and only a readOnlyHint annotation, the description is under-specified: no workflow, preconditions, return status, or relationship to linking existing sites is provided. The schema's `siteId` warning helps, but the tool description itself leaves important operational context to be inferred.
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 tool description adds no parameter guidance and never references `selectSchema`, `params`, `deployDirectory`, or `siteId`. However, the nested schema compensates with detailed descriptions, including the strong warning not to assume a new site, so the missing parameter text is not a fatal gap despite the 0% schema coverage signal.
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 names the exact operation (`deploy-site`) and labels it a Netlify write, so an agent can infer the tool deploys a site. However, it never states what deployment actually does and uses generic dispatcher language ('Select and run one of the following') that obscures the single available operation. It does not actively distinguish this from sibling updater/reader tools beyond the operation name.
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 instead of `netlify-deploy-services-reader` or other sibling updaters, and no preconditions, exclusions, or alternative tools are mentioned. The only hint is the word 'write,' which is already implied by the tool name and annotations.
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-only
Select and run one of the following Netlify read operations (read-only) get-extensions, get-full-extension-details
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares the tool is read-only, and the description reinforces this with 'read-only'. It adds the behavioral trait that it is a dispatcher that selects and runs one of two operations, which is beyond the annotation. However, it does not disclose any additional constraints (e.g., authentication, rate limits) or consequences of selecting an operation, so the added transparency is minimal.
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?
The description is a single concise sentence that front-loads the action ('Select and run') and lists the operations. It is efficient with no wasted words, though it could be slightly more structured by separating the operations or explaining them. The brevity is appropriate for a dispatcher tool.
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?
The tool is complex with two distinct operations, yet the description does not explain the outcomes of each operation (e.g., list of extensions vs. detailed extension info) or the purpose of the required parameters. There is no output schema, so the agent cannot anticipate the return format. The description is insufficient for an agent to correctly choose and invoke an operation without additional inference.
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 schema has very low description coverage (0% per context signals), and the description does not explain any parameters. The only parameter-related content is the operation names listed, which hint at what inputs might be needed but not their semantics. For get-full-extension-details, the required extensionSlug has no description, and teamId only has a partial one; the description adds no meaning beyond what the schema already conveys.
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 the tool's role as a selector that runs Netlify read operations, and explicitly lists the two operations (get-extensions, get-full-extension-details). It is clearly specific to extension services, distinguishing it from sibling readers for other services. However, it does not describe what each operation returns (e.g., a list vs. details), so the purpose is clear but not fully detailed.
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 description offers no guidance on when to use this tool versus the sibling readers (e.g., netlify-user-services-reader) or the extension updater. The agent must rely on the tool name and operation names to infer usage. There are no explicit exclusions or alternative tool references, leaving the selection decision to the agent's interpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-extension-services-updaterC
Select and run one of the following Netlify write operations change-extension-installation, initialize-database
| Name | Required | Description | Default |
|---|---|---|---|
| selectSchema | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false, and the description repeats that these are write operations, adding no new behavioral context. It does not disclose side effects, required permissions, or any consequences of execution. For a write operation, the description carries minimal transparency beyond the annotation.
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?
The description is a single sentence, which is concise, but it is under-specified. It front-loads the action but fails to earn its place by providing meaningful detail. It is not verbose, but it is not useful either.
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?
Given the tool's complexity (a dispatcher with two operations, one with parameters and one without), the description is severely incomplete. It does not explain the purpose of each operation, their parameters, or the selection logic. An agent cannot reliably invoke this tool without additional external knowledge. The absence of an output schema further increases the burden on the description.
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 parameter meaning. However, it does not mention any parameters at all. The selectSchema parameter is complex (a union with two operation variants), but the description offers no explanation of how to populate it, what the operation names mean, or how to choose between them. This is a critical 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 it 'Select and run one of the following Netlify write operations', which conveys a clear action and domain (Netlify write operations). However, it does not explain what each operation actually does; it only lists names. An agent can infer some meaning from the operation names, but the description itself is vague about the tool's specific function beyond being a dispatcher.
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 description provides no guidance on when to use this tool versus sibling tools like the readers or other updaters. It does not mention alternatives, prerequisites, or conditions that would select one operation over the other. The agent is left to infer usage from the operation names and schema, which is insufficient.
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-only
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?
The description aligns with the readOnlyHint annotation by stating 'read-only'. It adds that the tool selects and runs one of the operations, which is a dispatcher behavior. However, it does not disclose other behavioral aspects such as error handling, pagination, or return format, which are not covered by annotations. Since annotations already cover the read-only nature, the description adds minimal extra value.
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?
The description is a single, compact sentence that front-loads the tool's purpose. It is efficient with no redundant words.
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?
The tool is a dispatcher with three distinct operations, each having different required parameters (siteId for get-project, teamSlug/projectNameSearchValue for get-projects, siteId/formId for get-forms-for-project). The description does not explain how to construct the selectSchema object, which operation to choose in which scenario, or what to expect in return. Given the complexity and absence of an output schema, this is a significant gap for an agent to use the tool correctly.
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 description provides no explanation of the selectSchema parameter or its nested structure. With schema description coverage at 0%, the agent must infer the meaning of siteId, teamSlug, formId, etc. solely from the schema itself. The description only lists operation names, which does not convey the required parameters or their semantics.
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 clearly states the tool's function: to select and run one of three Netlify read operations (get-project, get-projects, get-forms-for-project). It uses a specific verb and resource, and the operation names distinguish it from sibling tools for other service types. However, it does not explicitly mention 'project services' but the name implies it.
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 description does not provide any guidance on when to use this tool versus its siblings (e.g., netlify-user-services-reader, netlify-team-services-reader). It lists the operations but does not explain the context for choosing this tool over others, nor any exclusions. The only implicit hint is the 'project' in the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
netlify-project-services-updaterC
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 indicate readOnlyHint=false, and the description repeats that these are write operations, but it adds no further behavioral detail. It does not disclose that operations like manage-form-submissions can delete submissions, or that changes may be irreversible, or any permission requirements. Since annotations are sparse, the description should carry more weight, but it only lists operation names without explaining consequences 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?
The description is a single sentence, which is concise, but it is essentially a comma-separated list of operation names. It is not appropriately sized for the tool's complexity; it omits essential structural guidance and fails to earn its place by providing actionable information. The front-loading of 'Select and run' is fine, but the lack of any branching logic or parameter hints makes it insufficient.
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?
This tool has a highly complex input schema with six different operations, each with distinct parameters and some with enums and defaults. The description provides only a list of operation names, with no instructions on how to choose an operation, what parameters are needed, or any behavioral expectations. There is also no output schema. This is profoundly incomplete for a tool of this complexity.
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 description merely lists operation names but gives no explanation of how to use the selectSchema parameter, which is a complex union of six distinct object schemas. It provides no mapping from operation to required parameters, and the schema has many fields without descriptions (e.g., siteId, envVarKey, etc.). With 0% schema description coverage, the description was expected to compensate, but it does not – it leaves an agent completely uninformed about how to construct a valid request.
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 uses the verb phrase 'Select and run' and identifies the resource as Netlify write operations, listing six specific operations (update-visitor-access-controls, update-forms, etc.). This gives a clear sense of what the tool does. However, it does not differentiate this tool from sibling tools like netlify-deploy-services-updater, which also handle updates, so it lacks sibling-specific clarity.
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 description provides no guidance on when to use this tool over alternatives. It does not mention the related reader tools or the deploy-services-updater, nor does it explain under what circumstances an agent should choose this dispatcher. There is no 'when to use' or 'when not to use' advice, leaving the agent to infer usage 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-team-services-readerARead-only
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?
The description adds the dispatcher behavior ('Select and run') beyond the readOnlyHint annotation, which is valuable. It also lists the exact operations, confirming no side effects. No contradiction with the annotation; it reinforces the read-only nature.
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 that immediately conveys the tool's purpose and enumerates the options. No wasted words; the structure is efficient and scannable.
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?
The tool is a dispatcher with three sub-operations, yet the description does not explain how to choose among them or what parameters each requires. There is no output schema, so the description should at least hint at the return format or differences. This leaves the agent under-informed for correct invocation, especially for parameter-heavy operations like get-team-env-vars.
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 description gives zero parameter information. With schema coverage at 0%, the description carries the full burden for explaining what each operation requires, but it only lists operation names. The agent is left to deduce that get-team needs a teamId and get-team-env-vars needs teamId and envVarKey from the schema structure, which lacks any textual guidance. This is a significant 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 clear verb ('Select and run') and a specific resource ('Netlify read operations'), and enumerates the three sub-operations. The domain (team) is evident from the tool name and the operation list, distinguishing it from the user, deploy, project, and extension sibling tools.
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 explicitly marks the tool as read-only, which helps avoid confusion with updater siblings. However, it does not provide guidance on when to choose this tool over other readers (e.g., user, project) nor how to select among the three sub-operations. The decision is left to the agent's inference from the operation names and schema.
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-only
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?
The description repeats the readOnlyHint annotation with '(read-only)' and adds little behavioral context. It does not explain what get-user does, whether authentication is needed, or how results are returned. It does not contradict the annotation, but it also does not go beyond it.
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?
The description is a single short sentence, so it is concise, but the phrasing 'Select and run one of the following Netlify read operations (read-only) get-user' is redundant because only one operation is listed. The structure is passable but not polished.
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?
Given a nested schema, no output schema, and no parameter documentation, an agent needs to know what get-user returns and what inputs are required. The description only names the operation, leaving the call underspecified for correct invocation.
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, but it only mentions the operation name already enforced by the const 'get-user'. The nested selectSchema wrapper, empty params object, aiAgentName, and llmModelName fields remain unexplained.
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 names the operation 'get-user' and labels it 'read-only', making the tool's purpose as a Netlify user read operation clear. The 'user' in the tool name and the get-user operation differentiate it from sibling service readers, though the phrase 'one of the following' is awkward when only one operation is listed.
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?
No guidance is provided about when to use this tool versus sibling readers (deploy, team, project, extension). The description only names the operation and gives no context for selection or exclusions, leaving an agent to infer the domain from the tool name.
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.
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 clearly partitioned by domain (user, deploy, team, project, extension) and by read vs write intent, so their areas of responsibility are mostly distinct. The main ambiguity comes from each tool bundling multiple operations under a single selector, which forces the agent to infer which listed operation it actually needs.
All tools follow a consistent 'netlify-<domain>-services-<reader|updater>' pattern, reinforced by the reader/updater split. The only exception is netlify-coding-rules, which breaks the pattern but is still clearly named.
9 tools is within a reasonable scope for a Netlify management server. However, the count is somewhat misleading because many individual operations are compressed into category-level tools, making the real surface larger than the 9 tool names suggest.
The server covers core Netlify workflows: project management, deploys, env vars, forms, extensions, and basic user/team reads. Notable gaps include no team write operations, no project deletion, and no deploy listing or rollback capability, which may force agents to work around missing lifecycle steps.
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.656,216 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.656,216 npmISC
- AlicenseNot gradedqualityDmaintenanceEnables natural language management of Cloudflare services including Workers, KV, R2, D1, Queues, and more via the Model Context Protocol.2,120 npmApache 2.0