MCP Task
Provides a comprehensive set of tools for interacting with ERPNext instances, enabling AI agents to perform CRUD operations on any DocType, search and filter documents, with advanced permission controls and auditing.
Click on "Install 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., "@MCP Taskcreate a new customer named Acme Corp with email contact@acme.com"
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.
MCP Task - Universal ERPNext MCP Connector
A comprehensive Model Context Protocol (MCP) connector for ERPNext that enables LLMs to interact seamlessly with any ERPNext instance through standardized tools and advanced permission controls.
🎯 Overview
MCP Task is a general-purpose MCP connector that transforms any ERPNext instance into an AI-accessible business system. It provides:
🔌 Universal DocType Support: Works with any ERPNext DocType without configuration
🛡️ Advanced Permission Model: Field-level, operation-level, and conditional access controls
🚀 Complete CRUD Operations: Create, Read, Update, Delete with full validation
🎨 Web Chat Interface: Built-in chat widget for direct LLM interaction
📊 Comprehensive Auditing: Complete activity logging and permission tracking
⚡ Production Ready: Enterprise-grade security, error handling, and performance
🌟 Key Features
🔧 Complete ERPNext Integration
Full CRUD Operations: Create, Read, Update, Delete any document type
Intelligent Search: Text-based search across all document fields
Flexible Filtering: Query documents with complex filter conditions
DocType Agnostic: Works with standard and custom DocTypes automatically
🛡️ Advanced Security & Permissions
Multi-Level Access Control: User roles, DocType permissions, field restrictions
Conditional Access: Python-based rules for dynamic permission evaluation
Audit Trail: Complete logging of all LLM interactions and data access
Field-Level Security: Hide sensitive fields from LLM access
🎨 User Experience
Web Chat Interface: Floating chat widget integrated into ERPNext UI
Real-time Responses: Instant feedback with loading indicators
Conversation History: Persistent chat sessions per user
Mobile Responsive: Works seamlessly on desktop and mobile devices
🏗️ Architecture
System Overview
graph TB
LLM[LLM Client<br/>Claude, GPT, etc.] --> MCP[MCP Protocol Handler]
MCP --> TR[Tool Registry]
TR --> TOOLS[Document Tools<br/>CRUD Operations]
TOOLS --> PERM[Permission Engine]
PERM --> ERP[ERPNext Database]
PERM --> CONFIG[Permission Configuration]
CONFIG --> FIELD[Field Restrictions]
CONFIG --> OP[Operation Controls]
CONFIG --> COND[Condition Scripts]
MCP --> AUDIT[Audit Logger]
MCP --> CHAT[Chat Interface]
subgraph "Security Layers"
PERM
CONFIG
AUDIT
endCore Components
1. MCP Protocol Handler (api/__init__.py)
JSON-RPC 2.0 Compliance: Full MCP protocol implementation
Request Routing: Handles initialize, tools/list, tools/call methods
Error Management: Comprehensive error handling with proper status codes
Authentication: Integration with ERPNext session management
2. Tool Registry System (core/)
Dynamic Discovery: Automatic tool loading and registration
Permission Integration: Built-in permission validation for each tool
Extensible Architecture: Easy addition of custom tools
Metadata Management: Tool descriptions and input schemas
3. Document Tools (tools/)
create_document: Create any ERPNext document with validationget_document: Retrieve document data with field filteringlist_documents: Query documents with flexible filterssearch_documents: Full-text search across document typesupdate_document: Modify document fields with validationdelete_document: Remove documents with dependency checks
4. Advanced Permission Engine
MCP Permission Configuration: Configurable access control DocTypeMulti-Level Security: Role, DocType, field, and operation controls
Condition Scripts: Python-based dynamic permission evaluation
Field Filtering: Automatic removal of restricted fields from responses
5. Web Interface (public/js/mcp_task.js)
Floating Chat Widget: Non-intrusive interface integrated into ERPNext
Real-time Communication: WebSocket-based chat with loading indicators
Conversation Persistence: User-specific chat history management
Responsive Design: Mobile and desktop compatibility
6. Audit & Logging System
MCP Chat Log: Complete interaction logging for compliancePermission Tracking: Detailed logs of access control decisions
Performance Monitoring: Request timing and error rate tracking
Security Auditing: Failed access attempts and policy violations
🚀 Installation & Setup
Prerequisites
ERPNext v15+ or Frappe Framework v15+
Python 3.10+
Node.js 18+ (for building assets)
Redis (for background jobs and caching)
Step 1: Install the App
# Clone the repository
cd frappe-bench
bench get-app https://github.com/yourusername/mcp_task
# Install on your site
bench --site your-site.com install-app mcp_task
# Migrate database
bench --site your-site.com migrate
# Build and restart
bench build --app mcp_task
bench restartStep 2: Configure Permissions
Basic Setup (All Users)
# Enable MCP access for all users (basic setup)
bench --site your-site.com execute "frappe.db.set_single_value('System Settings', 'enable_mcp_chat', 1)"Advanced Setup (Role-Based)
Create MCP Roles (via Setup > Users and Permissions > Role):
MCP Admin: Full access to configuration and toolsMCP User: Limited access to standard operations
Assign Roles to users through User management
Step 3: Environment Variables
Create a .env file in your bench directory:
# MCP Configuration
MCP_ENABLED=1
MCP_DEBUG=0
MCP_LOG_LEVEL=INFO
# Security Settings
MCP_RATE_LIMIT=100 # Requests per minute per user
MCP_SESSION_TIMEOUT=3600 # Session timeout in seconds
# Optional: External LLM Integration
OPENAI_API_KEY=your_openai_key_here
CLAUDE_API_KEY=your_claude_key_hereStep 4: Basic Configuration Test
# Test MCP endpoint
curl -X POST http://your-site.com/api/method/mcp_task.api.handle_mcp_request \
-H "Content-Type: application/json" \
-H "Authorization: token your_api_key:your_api_secret" \
-d '{
"jsonrpc": "2.0",
"method": "initialize",
"params": {"protocolVersion": "2024-11-05"},
"id": 1
}'Step 5: Chat Interface Setup
The chat interface is automatically available after installation. Users will see a chat icon in the navbar when logged in.
Troubleshooting: If chat icon doesn't appear:
# Clear cache and rebuild
bench --site your-site.com clear-cache
bench build --app mcp_task
bench restart🔒 Permission Model & Access Control
Overview
MCP Task implements a multi-layered security model that allows granular control over LLM access to your ERPNext data:
User Authentication: Standard ERPNext login required
Role-Based Access: ERPNext role system integration
DocType Permissions: Native ERPNext permission system
MCP-Specific Controls: Advanced field and operation restrictions
Permission Configuration
Creating Permission Rules
Navigate to Setup > MCP Task > MCP Permission Configuration to create custom access rules:
# Example: Restrict Sales User to read-only Customer data
{
"title": "Sales User Customer Access",
"doctype_name": "Customer",
"user_roles": "Sales User",
"operation_restrictions": {
"allowed_operations": ["read", "list", "search"],
"blocked_operations": ["create", "update", "delete"]
},
"field_restrictions": {
"blocked_fields": ["credit_limit", "payment_terms"]
}
}Field-Level Restrictions
Control which fields are accessible to the LLM:
{
"field_restrictions": {
"allowed_fields": ["customer_name", "customer_group", "territory"],
"blocked_fields": ["credit_limit", "outstanding_amount", "payment_terms"]
}
}Condition-Based Access
Use Python scripts for dynamic permission evaluation:
# Condition Script Example: Only allow access to own records
if doc and doc.get("owner") == user:
result = True
else:
result = False
# Complex example: Time-based restrictions
import datetime
current_hour = datetime.datetime.now().hour
if current_hour < 9 or current_hour > 17: # Business hours only
result = False
else:
result = TruePermission Examples
Example 1: Basic User Restrictions
{
"title": "Standard User Access",
"user_roles": "Employee, Desk User",
"operation_restrictions": {
"allowed_operations": ["read", "search", "list"]
},
"field_restrictions": {
"blocked_fields": ["base_amount", "outstanding_amount", "credit_limit"]
}
}Example 2: Department-Specific Access
{
"title": "HR Department Access",
"doctype_name": "Employee",
"user_roles": "HR User, HR Manager",
"field_restrictions": {
"allowed_fields": ["employee_name", "department", "designation", "reports_to"]
},
"condition_script": "result = frappe.get_roles(user).contains('HR Manager') or doc.get('department') == frappe.db.get_value('Employee', {'user_id': user}, 'department')"
}Example 3: Financial Data Protection
{
"title": "Accounts Restricted Access",
"tool_names": "get_document, list_documents",
"operation_restrictions": {
"conditions": {
"financial_doctypes": ["Sales Invoice", "Purchase Invoice", "Payment Entry"],
"require_role": "Accounts User"
}
},
"condition_script": """
# Only accounts users can access financial documents
if doctype in ['Sales Invoice', 'Purchase Invoice', 'Payment Entry']:
result = 'Accounts User' in frappe.get_roles(user)
else:
result = True
"""
}Security Best Practices
1. Principle of Least Privilege
Start with minimal permissions and add as needed
Use role-based restrictions rather than user-specific rules
Regularly audit permission configurations
2. Field Sensitivity Classification
# High Sensitivity (Always Block)
HIGH_SENSITIVITY = [
"bank_account", "iban", "swift_number",
"salary", "ctc", "password", "api_key"
]
# Medium Sensitivity (Role-Based Access)
MEDIUM_SENSITIVITY = [
"credit_limit", "outstanding_amount",
"employee_id", "phone", "email"
]3. Audit Configuration
Enable detailed logging for all permission decisions
Monitor failed access attempts
Regular review of permission effectiveness
🎯 API Usage Examples
LLM Prompt Examples
Document Creation
"Create a new Customer with the name 'Tech Solutions Inc', customer group 'Corporate', and territory 'India'. Set the customer type to 'Company'."MCP Request:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "create_document",
"arguments": {
"doctype": "Customer",
"data": {
"customer_name": "Tech Solutions Inc",
"customer_group": "Corporate",
"territory": "India",
"customer_type": "Company"
}
}
},
"id": 1
}Document Retrieval with Field Filtering
"Show me the customer details for CUST-001, but hide any financial information."MCP Response (with field restrictions applied):
{
"jsonrpc": "2.0",
"result": {
"content": [{
"type": "text",
"text": {
"customer_name": "Tech Solutions Inc",
"customer_group": "Corporate",
"territory": "India",
"customer_type": "Company"
// Sensitive fields like credit_limit filtered out
}
}]
},
"id": 1
}Complex Searches
"Find all Sales Orders from the last 30 days where the customer is from Mumbai territory and the order value is above 50,000."MCP Request:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "list_documents",
"arguments": {
"doctype": "Sales Order",
"filters": {
"creation": [">=", "2024-12-15"],
"territory": "Mumbai",
"grand_total": [">", 50000]
},
"fields": ["name", "customer", "grand_total", "delivery_date"]
}
},
"id": 1
}⚠️ Security Considerations
Data Protection
Encryption in Transit: All MCP communications use HTTPS/WSS
Session Management: ERPNext session tokens with configurable timeouts
API Rate Limiting: Configurable request limits per user/IP
Audit Logging: Complete trail of all LLM interactions
Failure Modes & Mitigation
1. Permission Bypass Attempts
Risk: LLM attempts to access restricted data
Mitigation: Multi-layer validation, default-deny policies
Monitoring: Alert on permission failures
2. Data Leakage via Field Filtering
Risk: Sensitive data exposed through related fields
Mitigation: Deep field analysis, cascading restrictions
Example: Block
customer.credit_limitwhen customer data is filtered
3. Condition Script Vulnerabilities
Risk: Malicious Python code in condition scripts
Mitigation: Sandboxed execution, restricted imports
Validation: Syntax checking, security reviews
4. Large Data Extraction
Risk: LLM queries return excessive data volumes
Mitigation: Result size limits, pagination controls
Configuration:
MAX_RESULTS_PER_QUERY = 1000
Security Monitoring
# Example monitoring alerts
SECURITY_ALERTS = {
"permission_failures": {
"threshold": 10, # failures per hour
"action": "notify_admin"
},
"large_queries": {
"threshold": 5000, # records per query
"action": "log_and_limit"
},
"sensitive_field_access": {
"fields": ["salary", "credit_limit", "bank_account"],
"action": "audit_log"
}
}🛠️ Development & Customization
Adding Custom Tools
Create Tool Class (
tools/my_custom_tool.py):
from typing import Any
from mcp_task.core.base_tool import BaseTool
import frappe
class MyCustomTool(BaseTool):
def __init__(self):
super().__init__()
self.name = "my_custom_tool"
self.description = "Custom business logic tool"
self.requires_permission = "My Custom DocType"
self.inputSchema = {
"type": "object",
"properties": {
"param1": {"type": "string", "description": "First parameter"},
"param2": {"type": "integer", "description": "Second parameter"}
},
"required": ["param1"]
}
def execute(self, arguments: dict[str, Any]) -> dict[str, Any]:
try:
# Your custom logic here
result = self.perform_custom_operation(arguments)
return {"success": True, "data": result}
except Exception as e:
return {"success": False, "error": str(e)}
def perform_custom_operation(self, args):
# Implement your business logic
passRegister Tool (in
core/tool_registry.py):
from mcp_task.tools.my_custom_tool import MyCustomTool
# Add to load_tools method
self.register_tool(MyCustomTool())Extending Permission System
Custom Permission Validators:
# mcp_task/permissions/custom_validators.py
def validate_customer_territory(user, doc_data):
"""Only allow access to customers in user's territory"""
user_territory = frappe.db.get_value("Employee",
{"user_id": user}, "territory")
return doc_data.get("territory") == user_territoryPlugin-Based Architecture:
# mcp_task/plugins/custom_business_rules.py
class CustomBusinessRules:
def apply_restrictions(self, tool_name, user, doc_data):
# Custom business logic
passChat Interface Customization
CSS Styling (public/css/custom_chat.css):
.mcp-chat-widget {
/* Custom positioning */
bottom: 20px;
right: 20px;
/* Brand colors */
--primary-color: #1976d2;
--secondary-color: #424242;
}
.mcp-message-bubble.user {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}JavaScript Extensions (public/js/custom_chat.js):
// Extend chat functionality
frappe.ready(() => {
// Custom message preprocessing
window.mcpChat.preprocessMessage = function(message) {
// Add custom logic
return message;
};
// Custom response formatting
window.mcpChat.formatResponse = function(response) {
// Add charts, tables, etc.
return response;
};
});📋 Complete API Reference
MCP Protocol Endpoints
mcp_task.api.handle_mcp_request
Main MCP protocol handler supporting JSON-RPC 2.0 specification.
Supported Methods:
initialize: Establish MCP connectiontools/list: Get available tools for current usertools/call: Execute a specific toolping: Connection health check
Available Tools
create_document
Create new ERPNext documents with validation.
Input Schema:
{
"doctype": "string (required)",
"data": "object (required)",
"submit": "boolean (optional)"
}Example:
{
"doctype": "Customer",
"data": {
"customer_name": "ABC Corp",
"customer_type": "Company"
}
}get_document
Retrieve document by DocType and name.
Input Schema:
{
"doctype": "string (required)",
"name": "string (required)"
}list_documents
Query documents with flexible filtering.
Input Schema:
{
"doctype": "string (required)",
"filters": "object (optional)",
"fields": "array (optional)",
"limit": "integer (optional, default: 20)",
"order_by": "string (optional)"
}Example:
{
"doctype": "Sales Order",
"filters": {
"customer": "CUST-001",
"docstatus": 1
},
"fields": ["name", "customer", "grand_total"],
"order_by": "creation desc"
}search_documents
Full-text search across document fields.
Input Schema:
{
"doctype": "string (required)",
"search_text": "string (required)",
"fields": "array (optional)"
}update_document
Modify existing document fields.
Input Schema:
{
"doctype": "string (required)",
"name": "string (required)",
"data": "object (required)"
}delete_document
Remove documents with dependency validation.
Input Schema:
{
"doctype": "string (required)",
"name": "string (required)",
"force": "boolean (optional, default: false)"
}Chat Interface APIs
mcp_task.api.send_chat_message
Send message through web interface.
Parameters:
message: Chat message textconversation_id: Optional conversation ID
mcp_task.api.get_conversation_history
Retrieve chat history for current user.
Parameters:
conversation_id: Optional specific conversationlimit: Number of messages to retrieve
Permission Configuration APIs
check_mcp_permissions
Validate access for specific context.
from mcp_task.mcp_task.doctype.mcp_permission_configuration.mcp_permission_configuration import check_mcp_permissions
result = check_mcp_permissions(
user="user@example.com",
tool_name="get_document",
doctype_name="Customer",
operation="read",
doc_data={"customer_name": "ABC Corp"}
)🔧 Troubleshooting
Common Issues
1. Chat Icon Not Appearing
# Check if app is installed
bench --site your-site.com list-apps
# Rebuild assets
bench build --app mcp_task
bench restart
# Check browser console for JavaScript errors2. Permission Denied Errors
# Check user roles
frappe.get_roles("user@example.com")
# Verify DocType permissions
frappe.has_permission("Customer", "read", user="user@example.com")
# Check MCP permission configurations
frappe.get_all("MCP Permission Configuration", {"enabled": 1})3. Tool Not Found
# Check tool registry
from mcp_task.core.tool_registry import get_tool_registry
registry = get_tool_registry()
print([tool["name"] for tool in registry.list_tools()])4. Field Restrictions Not Applied
# Check permission configuration syntax
bench --site your-site.com console
>>> doc = frappe.get_doc("MCP Permission Configuration", "CONFIG-NAME")
>>> doc.validate_json_fields()5. Performance Issues
# Enable query debugging
frappe.db.set_debug(True)
# Check slow queries in logs
tail -f logs/frappe.log | grep "SLOW QUERY"
# Monitor memory usage
psutil.virtual_memory()Debug Mode
Enable detailed logging for troubleshooting:
# Enable debug mode
export MCP_DEBUG=1
bench restart
# Check debug logs
tail -f logs/mcp_task.logLog Analysis
# Analyze permission failures
frappe.db.sql("""
SELECT user, tool_name, COUNT(*) as failures
FROM `tabMCP Chat Log`
WHERE success = 0
AND creation >= NOW() - INTERVAL 1 DAY
GROUP BY user, tool_name
ORDER BY failures DESC
""")🚀 Performance Optimization
Caching Strategies
# Tool result caching
from frappe.utils import cint
cache_timeout = cint(frappe.conf.get("mcp_cache_timeout", 300))
@frappe.cache(ttl=cache_timeout)
def get_cached_document_list(doctype, filters):
return frappe.get_all(doctype, filters)Database Optimization
-- Add indexes for common queries
CREATE INDEX idx_mcp_chat_log_user_creation
ON `tabMCP Chat Log`(user, creation);
CREATE INDEX idx_mcp_permission_config_enabled
ON `tabMCP Permission Configuration`(enabled, doctype_name);Memory Management
# Limit result set sizes
MAX_RESULTS_PER_QUERY = 1000
MAX_FIELD_LENGTH = 10000
def apply_result_limits(results):
if len(results) > MAX_RESULTS_PER_QUERY:
results = results[:MAX_RESULTS_PER_QUERY]
return results� Monitoring & Analytics
Performance Metrics
# Built-in metrics collection
METRICS = {
"requests_per_minute": "tools_called / time_window",
"average_response_time": "sum(response_times) / request_count",
"error_rate": "failed_requests / total_requests",
"permission_denials": "count(access_denied_events)"
}Health Checks
# System health endpoint
curl -X POST http://your-site.com/api/method/mcp_task.api.handle_mcp_request \
-d '{"jsonrpc": "2.0", "method": "ping", "id": 1}'
# Expected response
{"jsonrpc": "2.0", "result": {"status": "ok", "timestamp": "2024-01-14T12:00:00"}, "id": 1}Usage Analytics
# Popular tools report
frappe.db.sql("""
SELECT
tool_name,
COUNT(*) as usage_count,
AVG(CASE WHEN success=1 THEN 1 ELSE 0 END) as success_rate
FROM `tabMCP Chat Log`
WHERE creation >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY tool_name
ORDER BY usage_count DESC
""")🤝 Contributing
We welcome contributions! Please follow these guidelines:
Development Setup
# Fork and clone the repository
git clone https://github.com/yourusername/mcp_task
cd mcp_task
# Install development dependencies
pip install -e ".[dev]"
pre-commit install
# Run tests
python -m pytest tests/Code Standards
Python: Follow PEP 8, use type hints
JavaScript: Use ESLint configuration
Documentation: Update README and docstrings
Tests: Add tests for new features
Pull Request Process
Create Feature Branch:
git checkout -b feature/your-featureWrite Tests: Ensure >80% code coverage
Update Documentation: Include examples and API docs
Submit PR: With detailed description and test results
📄 License
MIT License
Copyright (c) 2025 MCP Task Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
🆘 Support & Community
Getting Help
📖 Documentation: Full documentation
🐛 Issues: GitHub Issues
💬 Discussions: GitHub Discussions
📧 Email: ahmedmansy265@gmail.com
Community
Discord: Join our community server
Telegram: @mcp_task_community
LinkedIn: Follow for updates
Commercial Support
Professional implementation and support services available:
Implementation Consulting: Custom deployment and configuration
Training & Workshops: Team training on MCP integration
Custom Development: Tailored tools and extensions
Enterprise Support: SLA-backed support plans
Contact: enterprise@yourcompany.com
Made with ❤️ for the ERPNext Community
Transform your ERPNext into an AI-powered business system with MCP Task - the universal connector for intelligent automation.
🎨 UI Components
Chat Widget Features
Floating Interface: Non-intrusive chat overlay
Message Bubbles: User and assistant message styling
Typing Indicators: Shows when AI is processing
Responsive Design: Adapts to mobile screens
Conversation History: Persistent chat sessions
Integration Points
Navbar Icon: Easy access from any page
Auto-loading: Initializes on page load
Event Handling: Keyboard shortcuts and click handlers
🔧 Configuration
Enable Chat for Users
The chat is available to all logged-in users by default. You can customize access by modifying permissions in the DocType settings.
Customize AI Responses
In api/__init__.py, modify the _process_with_llm function to integrate with your preferred LLM provider (OpenAI, Claude, etc.).
📊 Monitoring
Chat Logs
All tool executions are logged in the MCP Chat Log DocType for:
Audit compliance
Performance monitoring
Error tracking
Usage analytics
Conversation Analytics
Monitor chat usage through:
Conversation counts per user
Popular tool usage
Error rates
Response times
🚀 Roadmap
Integration with external LLM APIs (OpenAI, Claude)
Advanced tool chaining and workflows
Voice chat capabilities
Multi-language support
Plugin architecture for custom tools
Advanced analytics dashboard
🤝 Contributing
Fork the repository
Create a feature branch
Make your changes
Add tests
Submit a pull request
📄 License
MIT License - see LICENSE file for details.
🆘 Support
For issues and questions:
Create an issue on GitHub
Check the documentation
Contact: ahmedmansy265@gmail.com
Installation
You can install this app using the bench CLI:
cd $PATH_TO_YOUR_BENCH
bench get-app $URL_OF_THIS_REPO --branch develop
bench install-app mcp_taskContributing
This app uses pre-commit for code formatting and linting. Please install pre-commit and enable it for this repository:
cd apps/mcp_task
pre-commit installPre-commit is configured to use the following tools for checking and formatting your code:
ruff
eslint
prettier
pyupgrade
License
mit
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ahmed-Mansy-Mansico/MCP_LLM_Server_FOR_ERPNext'
If you have feedback or need assistance with the MCP directory API, please join our Discord server