Best AI tool to use frappe developers

I’m a fresh Frappe developer and looking for AI tools to support my learning.

I’ve noticed that ChatGPT sometimes doesn’t provide the most accurate or in-depth responses regarding Frappe’s structure and best practices. Can anyone suggest a list of AI tools or resources that are specifically useful for Frappe development and will help me in my career?
Your recommendations will be greatly appreciated!

I use Gemini, but regardless of the tool, using the correct approach is very important.

Uploading files from the GitHub page helps a lot, and with Gemini rolling out the ability to upload a GitHub project based on URL, this can be very helpful with development.

However, no tool is perfect.

Thank you for you kind responses

Try Claude AI, Good for Frappe Development

https://claude.ai

5 Likes

Check out Deepseek
the entire website was derived out of Deepseek
i have a zero knowledge on programming or building websites
had tried both chatgpt and deepseek for a long time
for a similar prompt, deepseek provides better code
check out the page

for scripting, i have found chatgpt to be better
have used lots of scripts, for example for the product registration page

its all boils down to the prompt
Regards
Hemanth

I use both gemiii/(bard) and deepseek, sometimes deepseek response is better than gemini.

Use MCP server with Claude desktop.

I was able to achieve the following with MCP server

  1. Structure/finalize the approach to the requirements using prompts
  2. Set up necessary tools for MCP set up like GitHub, Frappe, AWS etc
  3. Instruct your prompt to do the needful.

Boom!!
Everything will be archestrated by Claude

  • use your entire bench as workspace, enable indexing (exclude node modules, python env, JS build folders)
  • also add docs.frappe.io so all documentation is indexed and available to the LLMs
  • instruct agent to look into existing files, or for specific keywords
Example

Find User.name email assumptions

Exported on 10.6.2025 from Cursor (1.0.0)


User

Please search the code base to find all places where User.name is assumed to be an email address


Cursor

I’ll search the codebase to find all places where User.name is assumed to be an email address. Let me start with a comprehensive search strategy.

Let me search for more specific patterns where User.name is used as an email address.

Let me look at the get_email_address function more closely:

Now let me check the User doctype more closely:

Let me search for more patterns where User.name is used as email:

Let me check for patterns where user is created with email as name:

Let me look at the sign_up function to see how new users are created:

Let me check how users are created in other places:

Let me check the test files to understand better:

Now let me search for more patterns where User.name is used as email in JavaScript files:

Let me check this file:

Now let me search for more patterns in the codebase:

Let me look at the request_for_quotation.py file to see how it uses user.name as email:

Now let me search for more patterns in the codebase where User.name is used as email:

Based on my comprehensive search of the codebase, I’ve found all the places where User.name is assumed to be an email address. Here’s a summary of my findings:

Places where User.name is assumed to be an email address:

1. User Document Creation and Validation

  • apps/frappe/frappe/core/doctype/user/user.py (line 178): In the validate() method, self.email = self.name is set for non-standard users

  • apps/frappe/frappe/core/doctype/user/user.py (line 179): self.validate_email_type(self.name) validates that the user name is a valid email

  • apps/frappe/frappe/core/doctype/user/user.py (line 606): The validate_email_type() method uses validate_email_address() to ensure the name is a valid email

  • apps/frappe/frappe/core/doctype/user/user.py (line 628): After rename, frappe.db.set_value("User", new_name, "email", new_name) sets email to the new name

2. User Sign Up and Creation

  • apps/frappe/frappe/core/doctype/user/user.py (line 1044): In sign_up(), new users are created with "email": email and the document name becomes the email

  • apps/frappe/frappe/core/doctype/user/test_user.py (line 56): Test creates user with email=user_id

  • apps/frappe/frappe/tests/test_assign.py (line 23): Creates user with "email": "test@example.com"

3. Email Utilities

  • apps/frappe/frappe/utils/__init__.py (line 98): In get_formatted_email(), if no email is found, it tries validate_email_address(user) as a fallback, assuming the user parameter might be an email

4. Personal Data Deletion Request

  • apps/frappe/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py (line 65): Uses frappe.utils.validate_email_address(self.email, throw=True) in autoname

  • apps/frappe/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py (line 83): Gets user with frappe.get_doc("User", self.email)

5. Contact Creation

  • apps/erpnext/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py (line 218): Sets contact.email_id = user.name

  • apps/frappe/frappe/contacts/doctype/contact/contact.py (line 82): Sets self.user = frappe.db.get_value("User", {"email": self.email_id})

6. JavaScript Code

  • apps/frappe/frappe/public/js/frappe/desk.js (line 73): Compares email_list[u] === frappe.user.name

  • apps/frappe/frappe/public/js/frappe/utils/user.js (line 89): get_formatted_email() function uses email parameter which could be user name

7. Various Get User by Email Patterns

  • Multiple files use patterns like frappe.get_doc("User", email) or frappe.db.get_value("User", {"email": email_id}) which rely on the fact that User.name is the email address

8. Test Files

  • apps/frappe/frappe/tests/test_doc_ref.py (line 20): Tests that user.name == "test@example.com"

  • Various test files create users with email as the document name

This assumption that User.name is an email address is deeply embedded in the Frappe framework’s design. The User doctype uses the email address as the primary key (name field), which is enforced in the validation logic and used throughout the codebase for user identification and email communication.

2 Likes

Has anyone written cursor rules? Looking for inspirations

pip install frappe-mcp-server doesn’t work

Does this only work with frappe cloud sites or with any site?

Wouldn’t it make sense that it be linked with local development environment rather that production sites?

Follow this and see if it works for you.

Thanks @Chinmay_Bhat

I read this it sound interesting but not quite see the picture. Can you share more detail or elaborate more?

I am keen to see how to use AI to make the implementation faster (not just for research), do you see the real potential from this?

1 Like

I think it depends on what you are trying to do.

The MCP is more of a thing that says “Hey, how many orders did we place to people in rainy climates” [or whatever]. You’re developing an AI module that queries the production content.

CODING an ERP app isn’t that - a Coding AI model would be something that understands Frappe and/or ERPNext itself. You don’t need an MCP, you just tell it to read the code on the disk (and with CoPilot, it does that anyway). It figures out you’re using ERPNext from your code.

In this case, I don’t have production data, I have an instance with test data in it, that’s not public (it’s on a VM in my Windows machine)

Frankly, I find most of the models are pretty close to full understanding of ERPNext. Unprompted, both Anthropic models suggested code in patches.txt, hooks.py, and other Frappe specific coding idioms.

I did have one generate some pre-version 15 code, and some of the internals have changed, so I had to add a context to my app.

This goes into a “copilot-instructions.md” (if you’re using copilot, for example):

## General Guidelines
- When generating Mermaid diagrams, use a placeholder language like ```text instead of ```mermaid, with a note to change

# Project Context

## Key Requirements
- ERPNext Version: v15
- Compatible with ERPNext version 16.
- Not backward compatible to other versions of ERPNext, but should be forward compatible with future versions as well.
- Target Users: <example sanitized>
- Compatible with ERPNext as well as Frappe HRMS for employee management and payroll.

## Architecture Decisions
- <examples sanitized>

This isn’t the same thing as writing docs; I have separate more detailed design specs. You can ask AI to read those, of course. Adding to the copilot-instructions.md means you don’t have to tell it to do that every time, and you can also fix bugs (it would consistently mess up Mermaid diagrams in my implementation plan)

My version kept giving API’s for far older versions of ERPNext, so that fixed it right up.

@ahassoun :

Has anyone written cursor rules? Looking for inspirations

So I haven’t really needed to. It intuitively understands to go look for the ERP docs. I just had to guide it to the correct version per my above.