Enpitech

AgentReady website scans for AI agents, AI Hub search, newsletter and contact, from Enpitech.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
82%
Naming quality
85%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,904Tokens (tool definitions)
~4.0 KBTypical response size
Significant attention impact (3.05% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "enpitech": {
      "url": "https://mcp.enpitech.dev/mcp-app"
    }
  }
}

Remote endpoints

https://mcp.enpitech.dev/mcp-appstreamable-http

What it can do

Tool inventory

Tools (8)

๐ŸŸข Read-only๐ŸŸก Write๐Ÿ”ด Deleteโšช Unknown
๐ŸŸขcontact_form(origin)

Opens Enpitech's contact form as a view in the conversation, where the user types their own name, email and message, plus an optional phone number and company, and submits it. Use it when the user wants to get in touch with Enpitech about frontend engineering work: frontend is the bottleneck their releases wait on; AI-generated frontend code their team cannot safely merge; senior React engineers embedded in a product team; AI features, an MCP app, or an agent-ready interface built into their product; private training for their team on AI-assisted frontend delivery or Claude Code; hosting, sponsoring or speaking at a frontend meetup. It opens a form and answers no questions. The tool itself sends nothing: it returns the contact surface the form opened on, and the enquiry is sent by submit_contact when the user submits.

Input Schema

{
  "type": "object",
  "properties": {
    "origin": {
      "type": "string",
      "enum": [
        "general",
        "factory",
        "community",
        "workshops",
        "ai-hub",
        "agent-ready"
      ],
      "default": "general",
      "description": "Which contact surface to open the form in, inferred from the conversation. Omit when unsure; it defaults to general. general = the user wants senior React engineers embedded in their team, a web product shipped faster, or delivery infrastructure installed so the whole org can ship frontend. factory = the conversation is specifically about the Frontend Delivery Factory as a named service: the delivery pipeline, the review load, or AI-generated frontend code the team cannot safely merge. community = the user wants to host a frontend meetup, offer a venue, sponsor, or speak. workshops = the user wants private hands-on training for their team on AI-assisted frontend delivery or Claude Code. ai-hub = the user wants AI built into their product, MCP apps, or agent-ready interfaces. agent-ready = the enquiry follows an AgentReady scan of the user's own site; the scanner view sets this itself, so pick it only when the conversation came from a scan."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "origin": {
      "type": "string",
      "enum": [
        "general",
        "factory",
        "community",
        "workshops",
        "ai-hub",
        "agent-ready"
      ],
      "description": "The contact surface the form opened on."
    }
  },
  "required": [
    "origin"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐ŸŸกsubmit_contact(name, email, phone, companyName, message, ...)

Sends a contact enquiry to Enpitech, storing the submitted name, email, message and optional phone and company as a sales lead in Enpitech's CRM, tagged with the origin surface. The contact form view calls this tool when the user submits the form; it can also be called directly once the user has given those details in the conversation. Every field carries a value the user actually supplied; contact_form opens the same form as a view for the user to fill in when a detail is missing.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 2
    },
    "email": {
      "type": "string",
      "minLength": 1,
      "format": "email"
    },
    "phone": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^(0[23489]|05\\d)-?\\d{3}-?\\d{4}$"
        },
        {
          "type": "string",
          "const": ""
        }
      ]
    },
    "companyName": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 250
        },
        {
          "type": "string",
          "const": ""
        }
      ]
    },
    "message": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "origin": {
      "type": "string",
      "enum": [
        "general",
        "factory",
        "community",
        "workshops",
        "ai-hub",
        "agent-ready"
      ],
      "default": "general",
      "description": "Which contact surface to open the form in, inferred from the conversation. Omit when unsure; it defaults to general. general = the user wants senior React engineers embedded in their team, a web product shipped faster, or delivery infrastructure installed so the whole org can ship frontend. factory = the conversation is specifically about the Frontend Delivery Factory as a named service: the delivery pipeline, the review load, or AI-generated frontend code the team cannot safely merge. community = the user wants to host a frontend meetup, offer a venue, sponsor, or speak. workshops = the user wants private hands-on training for their team on AI-assisted frontend delivery or Claude Code. ai-hub = the user wants AI built into their product, MCP apps, or agent-ready interfaces. agent-ready = the enquiry follows an AgentReady scan of the user's own site; the scanner view sets this itself, so pick it only when the conversation came from a scan."
    }
  },
  "required": [
    "name",
    "email",
    "message"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "description": "True when the enquiry was sent."
    }
  },
  "required": [
    "success"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐ŸŸขagent_ready(url)

Opens Enpitech's AgentReady scanner as a view in the conversation. Inside the view the scanner fetches the site's public pages and runs 21 checks across five weighted categories (Discovery & Access, Readable for Agents, Structured Data, Actions & MCP, Trust & Safety), then shows a 0-100 agent-readiness score, the per-category breakdown, and the fixes ranked by the points each would recover. Use it when the user asks how ready a website is for AI agents, their own or any site they name: how readable, accessible or usable it is to AI, to agents or to AI crawlers; whether ChatGPT or Claude can read or use it; how to show up in AI answers; or for an audit of llms.txt, robots.txt, schema.org markup or MCP support. url is optional: with no URL the scanner opens with an empty input for the user to fill in. This tool returns only the URL it was opened with; the scan runs inside the view, via agentready_scan.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "description": "The site to scan, as the user gave it. A bare hostname like stripe.com is fine; the scanner normalizes it. Omit when the user has not named a site, and they will be asked for one."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The site the scanner opened with, or an empty string when the user will type one in the view."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐Ÿ”ดemail_agentready_report(name, email, phone, companyName, url, ...)

Emails the full 21-point AgentReady report for a site that has already been scanned, and stores the submitted name, email, phone and company as a sales lead in Enpitech's CRM under the agent-ready origin. The AgentReady view calls this tool when the user fills in the report form on the results page; it is not offered to the model. The scan is re-run server-side before the report is rendered, so the emailed report reflects the site at send time. Returns success with an emailed flag, which is false when the lead was stored but the email did not go out.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 2,
      "maxLength": 200
    },
    "email": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "format": "email"
    },
    "phone": {
      "type": "string",
      "maxLength": 40
    },
    "companyName": {
      "type": "string",
      "maxLength": 250
    },
    "url": {
      "type": "string",
      "maxLength": 2048
    },
    "score": {
      "type": "string",
      "maxLength": 8
    }
  },
  "required": [
    "name",
    "email"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "description": "True when the request was stored."
    },
    "emailed": {
      "type": "boolean",
      "description": "False when the request was stored but the email did not go out; the view then offers a PDF instead."
    }
  },
  "required": [
    "success"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐ŸŸขagentready_scan(url)

Runs the AgentReady scan on one site and returns the raw result, with no view. It fetches the site's public pages and runs 21 checks across five weighted categories (Discovery & Access, Readable for Agents, Structured Data, Actions & MCP, Trust & Safety), returning a 0-100 agent-readiness score, the per-category breakdown of every check, and the top fixes ranked by the points each would recover. When bot protection blocks too many checks the result carries limited: true and the headline score is not meaningful, though the per-check breakdown still is. When the scan does not run it returns ok: false with an errorType of invalid, unreachable, timeout or ratelimited. agent_ready runs this same scan and presents it as a visual report, so this tool fits the cases a view does not: the result is wanted as data, or several sites are being compared at once. The AgentReady view also calls this tool to run its own scan. Read-only: it fetches only public pages of the site named in the call and changes nothing on it.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "description": "The site to scan. A bare hostname like stripe.com works."
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "const": true
    },
    "cleanUrl": {
      "type": "string",
      "description": "Hostname and path scanned, e.g. stripe.com."
    },
    "scannedUrl": {
      "type": "string",
      "description": "The absolute URL that was fetched."
    },
    "score": {
      "type": "number",
      "description": "Agent-readiness score, 0-100."
    },
    "projectedScore": {
      "type": "number",
      "description": "The score the site would reach with the top fixes applied."
    },
    "categories": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "discovery",
              "readable",
              "structured",
              "actions",
              "trust"
            ]
          },
          "num": {
            "type": "string",
            "description": "Display number, e.g. \"01\"."
          },
          "name": {
            "type": "string"
          },
          "weight": {
            "type": "number",
            "description": "Percent of the overall score; the five sum to 100."
          },
          "why": {
            "type": "string",
            "description": "Why the category matters to AI agents."
          },
          "score": {
            "type": "number",
            "description": "Category score, 0-100."
          },
          "passCount": {
            "type": "number"
          },
          "total": {
            "type": "number"
          },
          "unknownCount": {
            "type": "number",
            "description": "Checks that could not be verified, excluded from score."
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "categoryId": {
                  "$ref": "#/properties/categories/items/properties/id"
                },
                "state": {
                  "type": "string",
                  "enum": [
                    "pass",
                    "partial",
                    "fail",
                    "unknown"
                  ],
                  "description": "pass, partial (counts as half) or fail; unknown means it could not be verified and is left out of the score."
                },
                "note": {
                  "type": "string",
                  "description": "Short evidence, e.g. \"1,204 URLs\" or \"404 ยท missing\"."
                }
              },
              "required": [
                "id",
                "categoryId",
                "state",
                "note"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "num",
          "name",
          "weight",
          "why",
          "score",
          "passCount",
          "total",
          "unknownCount",
          "checks"
        ],
        "additionalProperties": false
      },
      "description": "The five weighted categories and their 21 checks."
    },
    "topFixes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "checkId": {
            "type": "string"
          },
          "rank": {
            "type": "number"
          },
          "title": {
            "type": "string"
          },
          "body": {
            "type": "string"
          },
          "tag": {
            "type": "string",
            "description": "Category and weight, e.g. \"ACTIONS & MCP ยท 30%\"."
          },
          "impact": {
            "type": "number",
            "description": "Points the overall score would gain if this check passed."
          }
        },
        "required": [
          "checkId",
          "rank",
          "title",
          "body",
          "tag",
          "impact"
        ],
        "additionalProperties": false
      },
      "description": "Fixes ranked by the points each would recover."
    },
    "unverifiedCount": {
      "type": "number",
      "description": "Checks that could not be verified, e.g. behind bot protection."
    },
    "limited": {
      "type": "boolean",
      "description": "True when bot protection blocked so much that the headline score is not meaningful; the per-check breakdown still is."
    },
    "protection": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "vendor": {
              "type": "string",
              "description": "Bot protection detected, e.g. \"Cloudflare\"."
            },
            "via": {
              "type": "string",
              "description": "The signal it was detected by."
            }
          },
          "required": [
            "vendor",
            "via"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Bot protection on the homepage, or null when there is none."
    },
    "scannedAt": {
      "type": "number",
      "description": "When the scan finished, Unix milliseconds."
    }
  },
  "required": [
    "ok",
    "cleanUrl",
    "scannedUrl",
    "score",
    "projectedScore",
    "categories",
    "topFixes",
    "unverifiedCount",
    "limited",
    "protection",
    "scannedAt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐ŸŸขai_hub_search(query, category, limit)

Searches the Enpitech AI Hub, Enpitech's curated catalog of Claude Code skills, MCP servers and AI tools, and agentic workflows for frontend teams, each one used by Enpitech engineers in production. Use it when the user wants a skill, MCP server, AI tool or workflow for a frontend task (code review, Figma to code, testing, context files, generative UI and so on), or asks what the AI Hub has. Returns matching items with a one-line take, an overview, the install command when there is one, and a link to the item's page on enpitech.dev. Read-only: it searches a published catalog and sends nothing anywhere.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 200,
      "description": "What to look for, in plain words: a task, a technology or a name, e.g. \"code review\", \"Figma to React\", \"MCP servers for React\". Omit to list the catalog in order."
    },
    "category": {
      "type": "string",
      "enum": [
        "skills",
        "tools",
        "workflows"
      ],
      "description": "Limit results to one part of the catalog: skills (Claude Code and Agent Skills), tools (MCP servers and AI tooling) or workflows (agentic workflows and prompts). Omit to search all three."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 20,
      "description": "How many results to return, 1-20 (default 8)."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "The search terms, or empty when listing."
    },
    "category": {
      "type": "string",
      "enum": [
        "skills",
        "tools",
        "workflows"
      ]
    },
    "total": {
      "type": "number",
      "description": "How many catalog items matched in all."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "enum": [
              "skills",
              "tools",
              "workflows"
            ]
          },
          "section": {
            "type": "string",
            "description": "The catalog section it sits in."
          },
          "summary": {
            "type": "string",
            "description": "One-line take from Enpitech."
          },
          "overview": {
            "type": "string"
          },
          "install": {
            "type": "string",
            "description": "Install command, when the item has one."
          },
          "url": {
            "type": "string",
            "description": "The item page on enpitech.dev."
          }
        },
        "required": [
          "name",
          "category",
          "section",
          "summary",
          "overview",
          "url"
        ],
        "additionalProperties": false
      },
      "description": "Best matches first."
    }
  },
  "required": [
    "query",
    "total",
    "results"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
๐ŸŸขnewsletter

Opens a signup form for the Enpitech newsletter, about frontend, AI and how teams ship, as a view in the conversation. The user types their own email and subscribes there. Use it when the user asks to subscribe to, join or get the Enpitech newsletter. It opens a form and subscribes no one: the subscription happens only when the user submits the form.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
๐ŸŸขsubscribe_newsletter(email)

Subscribes the email address the user typed into the newsletter signup view to the Enpitech newsletter, managed in Mailchimp. The newsletter view calls this tool when the user submits the form; it is not offered to the model. Returns success with a status of subscribed, or pending when a confirmation email was sent first. Every newsletter email carries an unsubscribe link.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "format": "email",
      "description": "The email address the user typed into the signup form."
    }
  },
  "required": [
    "email"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "description": "True when the signup went through."
    },
    "status": {
      "type": "string",
      "enum": [
        "subscribed",
        "pending"
      ],
      "description": "subscribed, or pending when a confirmation email was sent first."
    }
  },
  "required": [
    "success"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools