create_document
Create new documents in Frappe by specifying the document type and field values. Handles required fields, links, and table data for structured data entry.
Instructions
Create a new document in Frappe.
Args:
doctype: DocType name
values: Document field values. Required fields must be included.
For Link fields, provide the exact document name.
For Table fields, provide an array of row objects.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| doctype | Yes | ||
| values | Yes |
Implementation Reference
- src/tools/documents.py:84-121 (handler)The create_document tool handler: creates a new Frappe document via POST to api/resource/{doctype}, handles errors with formatted response.@mcp.tool() async def create_document( doctype: str, values: Dict[str, Any] ) -> str: """ Create a new document in Frappe. Args: doctype: DocType name values: Document field values. Required fields must be included. For Link fields, provide the exact document name. For Table fields, provide an array of row objects. """ try: client = get_client() # Create the document data doc_data = { "doctype": doctype, **values } # Make API request to create document response = await client.post( f"api/resource/{doctype}", json_data=doc_data ) if "data" in response: doc = response["data"] return f"Document created successfully: {doctype} '{doc.get('name', 'Unknown')}'" else: return json.dumps(response, indent=2) except Exception as error: return _format_error_response(error, "create_document")
- src/server.py:40-40 (registration)Calls register_tools on the documents module to register all document tools including create_document with the MCP server.documents.register_tools(mcp)
- src/tools/documents.py:51-79 (helper)Helper function _format_error_response used by create_document to format and return detailed error messages.def _format_error_response(error: Exception, operation: str) -> str: """Format error response with detailed information.""" credentials_check = validate_api_credentials() # Build diagnostic information diagnostics = [ f"Error in {operation}", f"Error type: {type(error).__name__}", f"Is FrappeApiError: {isinstance(error, FrappeApiError)}", f"API Key available: {credentials_check['details']['api_key_available']}", f"API Secret available: {credentials_check['details']['api_secret_available']}" ] # Check for missing credentials first if not credentials_check["valid"]: error_msg = f"Authentication failed: {credentials_check['message']}. " error_msg += "API key/secret is the only supported authentication method." return error_msg # Handle FrappeApiError if isinstance(error, FrappeApiError): error_msg = f"Frappe API error: {error}" if error.status_code in (401, 403): error_msg += " Please check your API key and secret." return error_msg # Default error handling return f"Error in {operation}: {str(error)}"