Kalendis MCP
OfficialGenerates API route handlers for Express applications that integrate with the Kalendis scheduling API
Generates Fastify plugin with route handlers for integrating Kalendis scheduling functionality into Fastify applications
Generates complete NestJS modules including controllers, services, and modules for Kalendis scheduling API integration
Generates App Router API routes for Next.js applications to integrate with Kalendis scheduling services
Generates type-safe TypeScript clients for both backend and frontend applications to interact with the Kalendis scheduling API
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., "@Kalendis MCPgenerate a TypeScript client for my Next.js app to manage user bookings"
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.
Kalendis MCP Tool
MCP (Model Context Protocol) server and client generator for Kalendis scheduling API integration.
Features
🔧 MCP Server: Exposes Kalendis API tools for use with Claude, Cursor, etc
🚀 Client Generator: Generates TypeScript clients for backend and frontend applications
🛣️ Route Generator: Creates API route handlers for Next.js, Fastify, NestJS and Express
🔐 Secure: Uses environment variables for API key management
📝 Type-safe: Full TypeScript support with generated types
Related MCP server: @aiwerk/mcp-server-cal
Installation
npm install @kalendis/mcpQuick Start
1. Get Your API Key
Before using the Kalendis MCP tool, you'll need an API key. Create a free account at kalendis.dev to get started. Your API key will be available in your account dashboard and is required for authenticating requests to the Kalendis scheduling API.
2. Configure MCP Server
Quick Install (Cursor IDE)
Click the button below to automatically add Kalendis to your Cursor IDE:
Manual Configuration
Alternatively, add this to your MCP settings:
{
"mcpServers": {
"kalendis": {
"command": "npx",
"args": ["-y", "@kalendis/mcp"]
}
}
}3. Available MCP Tools
Once configured, the AI agent can use these tools:
generate-backend-client: Generate a TypeScript client for direct API calls
generate-frontend-client: Generate a TypeScript client for frontend applications
generate-api-routes: Generate API route handlers for Next.js, Express, Fastify, or NestJS
list-endpoints: List all available Kalendis API endpoints
Client Generation
Backend Client
Generate a client that calls the Kalendis API directly:
// Generated client usage
import KalendisClient from './generated/kalendis-client';
// Initialize with your API key (from environment variable, config, etc.)
const client = new KalendisClient({
apiKey: process.env.MY_API_KEY, // You choose the env var name
});
const users = await client.getUsers();
const user = await client.createUser({ name: 'John Doe', email: 'john@example.com' });Frontend Client
Generate a client that calls your backend API endpoints:
// Generated frontend client usage
import api from './generated/frontend-client';
// Calls your backend endpoints (e.g., /api/users)
const users = await api.getUsers();API Routes
Next.js Routes
Generates App Router API routes:
// app/api/users/route.ts
export async function GET(request: Request) {
// Implementation using backend client
}Express Routes
Generates Express router handlers:
// routes/api.ts
router.get('/users', async (req, res) => {
// Implementation using backend client
});Fastify Routes
Generates Fastify plugin with route handlers:
// routes/kalendis.ts
export default async function routes(fastify: FastifyInstance) {
fastify.get('/api/users', async (request, reply) => {
// Implementation using backend client
return users;
});
}NestJS Module
Generates complete NestJS module with controller, service, and module files:
// kalendis.controller.ts
@Controller('api')
export class KalendisController {
@Get('users')
async getUsers() {
return this.kalendisService.getUsersByAccountId();
}
}
// kalendis.service.ts - Wraps the backend client
// kalendis.module.ts - Wire everything togetherAPI Endpoints Coverage
The tool supports all 28 Kalendis API endpoints:
Users
GET /v1/users - Fetch all users
POST /v1/users - Create user
PUT /v1/users/:id - Update user
DELETE /v1/users/:id - Delete user
Availability
GET /v1/availability - Get availability with filters
GET /v1/availability/all - Get all availability
GET /v1/availability/calculated - Get calculated availability
GET /v1/availability/recurring - Get recurring availability
GET /v1/availability/matching - Get matching availability
POST /v1/availability - Add availability
PUT /v1/availability/:id - Update availability
DELETE /v1/availability/:id - Delete availability
Recurring Availability
GET /v1/recurring-availability - Get recurring availability
POST /v1/recurring-availability - Add recurring availability
PUT /v1/recurring-availability/:id - Update recurring availability
DELETE /v1/recurring-availability/:id - Delete recurring availability
Availability Exceptions
GET /v1/availability-exceptions - Get exceptions
POST /v1/availability-exceptions - Add exception
POST /v1/availability-exceptions/recurring - Add recurring exception
PUT /v1/availability-exceptions/:id - Update exception
DELETE /v1/availability-exceptions/:id - Delete exception
Bookings
GET /v1/bookings - Get bookings
GET /v1/bookings/:userId - Get user bookings
POST /v1/bookings - Create booking
PUT /v1/bookings/:id - Update booking
DELETE /v1/bookings/:id - Delete booking
Account
GET /v1/account - Get account info
PUT /v1/account - Update account
Environment Configuration
The tool supports three environments:
development:
https://sandbox.api.kalendis.devproduction:
https://api.kalendis.dev
Authentication
All API calls to the Kalendis scheduling service require authentication via the x-api-key header.
The generated clients require you to provide an API key when instantiating:
// You control how to manage your API key
const client = new KalendisClient({
apiKey: process.env.KALENDIS_API_KEY, // or from config, secrets manager, etc.
});The generated API route handlers use environment variables by default, but you can customize this:
# Example: Set in your application's environment
export KALENDIS_API_KEY="your-api-key-here"Note: The MCP tool itself doesn't need or use the API key - it only generates code. The API key is used by the generated clients in your application.
Error Handling
The generated clients provide clear error messages:
401: Authentication failed - Invalid or missing API key
403: Permission denied - API key lacks required permissions
Network errors: Clear connection failure messages
API errors: Detailed error messages from the API
Development
To build the MCP tool locally:
git clone https://github.com/kalendis-dev/kalendis-mcp.git
cd kalendis-mcp
npm install
npm run buildContributing
Contributions are welcome! Please feel free to submit a Pull Request.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add some amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
For issues or questions:
Open an issue on GitHub
Email: support@kalendis.dev
Available Tools
4 toolsgenerate-api-routesC
Generate API route handlers for Next.js or Express that use the Kalendis backend client
| Name | Required | Description | Default |
|---|---|---|---|
| framework | Yes | Target framework | |
| typesImportPath | No | Import path for types file (optional, defaults to "@/lib/types" for Next.js) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states what the tool does but lacks details on behavioral traits such as whether it modifies files, requires specific permissions, handles errors, or produces output format. For a generation tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is appropriately sized and front-loaded, making it easy to understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of generating API route handlers and the lack of annotations and output schema, the description is incomplete. It doesn't explain what the tool outputs (e.g., code files, configuration), how to handle the results, or any dependencies. For a tool with 2 parameters and no structured output information, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters ('framework' and 'typesImportPath') with descriptions and enums. The description adds no additional meaning beyond what the schema provides, such as explaining how the parameters affect the generation process. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Generate API route handlers for Next.js or Express that use the Kalendis backend client.' It specifies the verb ('generate'), resource ('API route handlers'), and technology context. However, it doesn't explicitly differentiate from sibling tools like 'generate-backend-client' or 'generate-frontend-client' beyond mentioning the backend client usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions using the Kalendis backend client, but doesn't explain when to choose this over sibling tools like 'generate-backend-client' or 'list-endpoints,' nor does it specify prerequisites or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate-backend-clientB
Generate a TypeScript client that calls Kalendis API directly with x-api-key authentication
| Name | Required | Description | Default |
|---|---|---|---|
| environment | No | Target environment (optional, defaults to production) | |
| typesImportPath | No | Import path for types file (optional, defaults to "../types") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions authentication but doesn't cover other important aspects like whether this is a read/write operation, what permissions are needed, what the output looks like (e.g., file generation), or any rate limits. The description is minimal and lacks behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any unnecessary words. It's appropriately sized and front-loaded with the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete for a tool that generates code. It doesn't explain what the output is (e.g., a file, code snippet), how it's delivered, or any behavioral traits. The description alone is insufficient for understanding the tool's full behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters with descriptions and enum values. The description doesn't add any parameter-specific information beyond what's in the schema, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Generate a TypeScript client'), the target ('Kalendis API'), and the authentication method ('x-api-key authentication'). It distinguishes from sibling tools like 'generate-api-routes' and 'generate-frontend-client' by specifying it's for backend/direct API calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for generating a TypeScript client with specific authentication, but doesn't explicitly state when to use this tool versus alternatives like 'generate-frontend-client' or 'generate-api-routes'. No explicit exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate-frontend-clientC
Generate a TypeScript client for frontend apps that calls your backend API endpoints
| Name | Required | Description | Default |
|---|---|---|---|
| typesImportPath | No | Import path for types file (optional, defaults to "../types") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. While it indicates this is a generation tool (implying a write operation), it lacks details on permissions needed, whether it overwrites existing files, what the output format is, or any rate limits. The description is minimal and doesn't provide sufficient behavioral context for safe use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded, with every element contributing to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generation tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the generated client includes, how it's structured, where it's saved, or what happens if files already exist. Given the complexity implied by generating a TypeScript client, more context is needed for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the single optional parameter. The description doesn't add any parameter-specific information beyond what's in the schema, but with high coverage and only one parameter, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Generate a TypeScript client for frontend apps that calls your backend API endpoints'. It specifies the verb ('Generate'), resource ('TypeScript client'), and target context ('frontend apps'), but doesn't explicitly differentiate from sibling tools like 'generate-backend-client' or 'generate-api-routes'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'generate-backend-client' or 'generate-api-routes', nor does it specify prerequisites, appropriate contexts, or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-endpointsB
List all available Kalendis API endpoints with descriptions
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool lists endpoints but doesn't mention if it's read-only, safe, requires authentication, has rate limits, or what the output format looks like. This is a significant gap for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity is low (0 parameters), but with no annotations and no output schema, the description is incomplete. It doesn't explain what the return values look like (e.g., list format, endpoint details) or behavioral aspects, leaving gaps for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and a baseline score of 4 is appropriate for this case as it avoids misleading or redundant information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('all available Kalendis API endpoints with descriptions'), making the purpose specific and understandable. It doesn't explicitly differentiate from sibling tools like 'generate-api-routes', but the purpose is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'generate-api-routes' or other sibling tools. It lacks context about prerequisites, timing, or exclusions, leaving the agent without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
- First observed
generate-api-routes - First observed
generate-backend-client - First observed
generate-frontend-client - First observed
list-endpoints
TDQS
Each tool has a clearly distinct purpose: generate-api-routes creates backend route handlers, generate-backend-client builds a direct API client, generate-frontend-client creates a client for frontend apps, and list-endpoints provides API documentation. There is no overlap in functionality, making tool selection straightforward for an agent.
All tool names follow a consistent verb_noun pattern with 'generate-' or 'list-' prefixes, using kebab-case throughout. This predictability enhances readability and reduces cognitive load for agents when scanning the toolset.
Four tools is reasonable for a code generation and API documentation server, though it feels slightly minimal. The tools cover key workflows (client generation, route handling, endpoint listing), but additional utilities like validation or testing helpers could enhance completeness without overloading the set.
The toolset covers core aspects of integrating with the Kalendis API: generating clients for both backend and frontend, creating API routes, and listing endpoints. A minor gap exists in tools for managing API keys or handling errors, but agents can work around this with the provided tools for most common tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
AI-native scheduling and booking: check availability, book meetings, share links.
Read appointments, types, calendars and availability; create, cancel or reschedule bookings.
Connects ChatGPT to your Apple Calendar via a local Mac agent + Vercel relay
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables interaction with Calendly to manage event types, scheduled events, and invitees. It provides tools for checking user availability and canceling appointments directly through the Calendly API.7MIT

@aiwerk/mcp-server-calofficial
AlicenseAqualityCmaintenanceConnects AI assistants to Cal.com for managing bookings, event types, and availability through natural language.1281MIT- AlicenseNot gradedqualityDmaintenanceEnables scheduling and calendar management through Google Calendar and Cal.com, with support for reminders, notes, and email notifications.MIT
- FlicenseNot gradedqualityDmaintenanceExposes Cal.com scheduling tools to AI agents via MCP, enabling listing event types, checking availability, and managing bookings (create, cancel, reschedule).-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/kalendis-dev/kalendis-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server