Build and manage no-code backend services with Xano using MCP server integration. Create database tables, API endpoints, custom functions, and business logic using XanoScript...
Build serverless backend infrastructure using Xano's no-code platform through MCP (Model Context Protocol) server integration. Create databases, REST APIs, custom functions, and business logic using XanoScript without traditional coding.
Xano Account and Workspace:
MCP Access Token and URL:
https://x8ki-letl-twmt.n7.xano.io/mcp)MCP Server Configuration: This plugin includes MCP server configuration that connects automatically when enabled.
Set environment variables:
export XANO_MCP_URL="https://your-workspace.xano.io/mcp"
export XANO_MCP_TOKEN="your_access_token_here"
Or add to your shell profile (~/.zshrc, ~/.bashrc):
# Xano MCP Configuration
export XANO_MCP_URL="https://your-workspace.xano.io/mcp"
export XANO_MCP_TOKEN="your_access_token_here"
Restart Claude Code after setting environment variables.
The Xano MCP server will start automatically when this plugin is enabled, and Xano tools will be available in your Claude Code session.
Xano Components:
XanoScript Basics: Xano uses a proprietary syntax called XanoScript for defining logic. Key characteristics:
db.query, array.push, var.updateas $variable_name|filter_name:optionImportant: XanoScript syntax is unique to Xano. When working with XanoScript:
Understand the requirement:
Design the database schema:
Use Xano MCP tools to create a table with specified fields
Create API endpoints:
Implement business logic with XanoScript:
db.query table_name { filters } as $resultsvar $my_var { value = "initial" }var.update $my_var { value = "new" }foreach ($items) { each as $item { } }conditional { if ($condition) { } else { } }$data|filter_name:optionTest the implementation:
Generate API documentation:
Deploy and monitor:
1. REST API for CRUD operations:
2. Webhook receiver:
3. External API integration:
4. Data transformation pipeline:
5. Scheduled background tasks:
Be mindful of syntax differences:
namespace.function (e.g., db.query, not db_query)$ prefix: $my_variableas keyword: db.query users {} as $users$users|count, not count($users)When uncertain about syntax:
Common XanoScript mistakes:
db_query("users") → ✅ db.query users { }var my_var = "value" → ✅ var $my_var { value = "value" }count($array) → ✅ $array|countif (condition) {} → ✅ conditional { if ($condition) { } }Once the plugin is enabled and environment variables are set, the Xano MCP server provides these tools automatically:
Using MCP tools: Simply ask Claude to perform Xano operations naturally (e.g., "Create a users table with email and name fields"). Claude will automatically use the appropriate Xano MCP tools to execute your requests.
Common issues:
Debugging approach:
Token management:
API security:
Data protection:
User request:
I need a backend to store user profiles with name, email, and bio
You would:
Use Xano MCP to create a table:
usersname (text, required)email (text, required, unique)bio (text, optional)created_at (timestamp, auto)Generate CRUD API endpoints:
/users - List all users/users/{id} - Get single user/users - Create user/users/{id} - Update user/users/{id} - Delete userAdd email validation to POST endpoint using XanoScript:
conditional {
if ($email|is_email|not) {
response.error "Invalid email format"
}
}
Test endpoints and return API documentation URLs
User request:
Create an endpoint to receive LinkedIn OAuth callback and store the access token
You would:
Create database table:
oauth_tokensuser_id (text)provider (text) - "linkedin"access_token (text, encrypted)refresh_token (text, encrypted)expires_at (timestamp)Create API endpoint:
POST/oauth/linkedin/callbackcode (text, required) - OAuth authorization codeuser_id (text, required)Implement function stack logic:
api oauth_callback {
input {
text code filters=required
text user_id filters=required
}
stack {
// Exchange code for token (would call LinkedIn API)
http.request {
url = "https://www.linkedin.com/oauth/v2/accessToken"
method = "POST"
body = {
grant_type: "authorization_code",
code: $code,
client_id: env.LINKEDIN_CLIENT_ID,
client_secret: env.LINKEDIN_CLIENT_SECRET
}
} as $token_response
// Store token in database
db.insert oauth_tokens {
user_id = $user_id,
provider = "linkedin",
access_token = $token_response.access_token,
refresh_token = $token_response.refresh_token,
expires_at = $token_response.expires_in|timestamp_offset
} as $stored_token
response = {
success: true,
token_id: $stored_token.id
}
}
}
Test the endpoint with sample OAuth code
Return endpoint URL and usage instructions
User request:
I need to format user data from the database before sending it to the frontend
You would:
Create custom function:
format_user_dataImplement XanoScript logic:
function format_user_data {
input {
object user_data
}
stack {
// Initialize result variable
var $formatted {
value = {}
}
// Format timestamp
var.update $formatted {
value = $user_data|set:"created_at":($user_data.created_at|format_timestamp:"Y-m-d")
}
// Add full name
var.update $formatted {
value = $formatted|set:"full_name":($user_data.first_name + " " + $user_data.last_name)
}
// Remove sensitive fields
var.update $formatted {
value = $formatted|unset:"password_hash"|unset:"internal_notes"
}
response = $formatted
}
}
Show how to use the function in API endpoint
Test with sample data
User request:
Create a webhook endpoint to receive notifications from Stripe
You would:
Create API endpoint:
POST/webhooks/stripeImplement handler logic:
api stripe_webhook {
input {
text event_type
object data
}
stack {
// Log the webhook event
db.insert webhook_logs {
source = "stripe",
event_type = $event_type,
payload = $data,
received_at = timestamp.now
}
// Handle different event types
conditional {
if ($event_type == "payment_intent.succeeded") {
// Update order status
db.update orders {
where = { stripe_payment_id: $data.id },
set = { status: "paid", paid_at: timestamp.now }
}
}
elseif ($event_type == "customer.subscription.deleted") {
// Handle subscription cancellation
db.update users {
where = { stripe_customer_id: $data.customer },
set = { subscription_status: "cancelled" }
}
}
}
response = { received: true }
}
}
Configure Stripe webhook URL
Test with Stripe webhook testing tool
User request:
Set up a daily task to clean up expired tokens
You would:
Create background task:
cleanup_expired_tokensImplement cleanup logic:
task cleanup_expired_tokens {
stack {
// Get current timestamp
var $now { value = timestamp.now }
// Find expired tokens
db.query oauth_tokens {
where = {
expires_at: { $lt: $now }
}
} as $expired_tokens
// Delete expired tokens
foreach ($expired_tokens) {
each as $token {
db.delete oauth_tokens {
where = { id: $token.id }
}
}
}
// Log cleanup result
db.insert task_logs {
task_name = "cleanup_expired_tokens",
tokens_deleted = $expired_tokens|count,
executed_at = $now
}
}
}
Set up task schedule
Test task execution manually
Monitor task logs
This skill enables building complete backend systems using Xano's no-code platform through MCP integration. Create databases, APIs, and business logic using XanoScript - Xano's custom syntax. Always reference the XanoScript documentation when uncertain about syntax, and test incrementally to ensure correct implementation.
Key Resources: