The Events Calendar MCP Server
OfficialProvides CRUD operations for The Events Calendar and Event Tickets WordPress plugins, including events, venues, organizers, and tickets management.
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., "@The Events Calendar MCP Servercreate a new event for next Saturday at 2pm"
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.
The Events Calendar MCP Server
An MCP (Model Context Protocol) server that provides unified CRUD operations for The Events Calendar and Event Tickets WordPress plugins.
Features
Unified Tools: Single tools for Create/Update, Read, Delete, and Search operations across all post types
Supported Post Types:
Events (
tribe_events)Venues (
tribe_venue)Organizers (
tribe_organizer)Tickets (
tribe_rsvp_ticketsortec_tc_ticket)
Full CRUD Operations: Create, Read, Update, Delete with proper error handling
Search Functionality: Integrated search via the read tool with query parameter
Type Safety: Full TypeScript support with proper type definitions
Related MCP server: WordPress MCP Server
Requirements
Node.js >= v20.0.0
WordPress site with The Events Calendar plugin
WordPress Application Password for authenticationd
Installation
Go to: Settings -> Cursor Settings -> MCP -> Add new global MCP server
Pasting the following configuration into your Cursor ~/.cursor/mcp.json file is the recommended approach. You may also install in a specific project by creating .cursor/mcp.json in your project folder. See Cursor MCP docs for more info.
Since Cursor 1.0, you can click the install button below for instant one-click installation.
Cursor Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {
"WP_APP_PASSWORD": "your-application-password"
}
}
}
}Run this command. See Claude Code MCP docs for more info.
Claude Code Local Server Connection
WP_APP_PASSWORD="your-application-password" claude mcp add tec-mcp -- npx -y @the-events-calendar/mcp-server --url https://your-wordpress-site.com --username your-usernameAdd this to your Windsurf MCP config file. See Windsurf MCP docs for more info.
Windsurf Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {
"WP_APP_PASSWORD": "your-application-password"
}
}
}
}
Add this to your VS Code MCP config file. See VS Code MCP docs for more info.
VS Code Local Server Connection
"mcp": {
"servers": {
"tec-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {
"WP_APP_PASSWORD": "your-application-password"
}
}
}
}It can be installed via Zed Extensions or you can add this to your Zed settings.json. See Zed Context Server docs for more info.
{
"context_servers": {
"TEC MCP": {
"command": {
"path": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
]
},
"env": {"WP_APP_PASSWORD": "your-application-password"},
"settings": {}
}
}
}To configure TEC MCP in Augment Code, you can use either the graphical interface or manual configuration.
A. Using the Augment Code UI
Click the hamburger menu.
Select Settings.
Navigate to the Tools section.
Click the + Add MCP button.
Enter the following command:
WP_APP_PASSWORD="your-application-password" npx -y @the-events-calendar/mcp-server@latest --url https://your-wordpress-site.com --username your-usernameName the MCP: TEC MCP.
Click the Add button.
Once the MCP server is added, you can start using the TEC MCP tools directly within Augment Code.
B. Manual Configuration
Press Cmd/Ctrl Shift P or go to the hamburger menu in the Augment panel
Select Edit Settings
Under Advanced, click Edit in settings.json
Add the server configuration to the
mcpServersarray in theaugment.advancedobject
"augment.advanced": {
"mcpServers": [
{
"name": "tec-mcp",
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
]
}Once the MCP server is added, restart your editor. If you receive any errors, check the syntax to make sure closing brackets or commas are not missing.
Add this to your Roo Code MCP configuration file. See Roo Code MCP docs for more info.
Roo Code Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}See Gemini CLI Configuration for details.
Open the Gemini CLI settings file. The location is
~/.gemini/settings.json(where~is your home directory).Add the following to the
mcpServersobject in yoursettings.jsonfile:
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}If the mcpServers object does not exist, create it.
Open Claude Desktop and navigate to Settings > Connectors > Add Custom Connector. Enter the name as TEC MCP and configure it to launch via npx.
Local Server Connection
Open Claude Desktop developer settings and edit your claude_desktop_config.json file to add the following configuration. See Claude Desktop MCP docs for more info.
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": ["-y", "@the-events-calendar/mcp-server"]
}
}
}Add this to your Opencode configuration file. See Opencode MCP docs docs for more info.
Opencode Local Server Connection
{
"mcp": {
"tec-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"},
"enabled": true
}
}
}See OpenAI Codex for more information.
Add the following configuration to your OpenAI Codex MCP server settings:
[mcp_servers.tec-mcp]
args = [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
]
command = "npx"See JetBrains AI Assistant Documentation for more details.
In JetBrains IDEs go to
Settings->Tools->AI Assistant->Model Context Protocol (MCP)Click
+ Add.Click on
Commandin the top-left corner of the dialog and select the As JSON option from the listAdd this configuration and click
OK
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Click
Applyto save changes.The same way TEC MCP could be added for JetBrains Junie in
Settings->Tools->Junie->MCP Settings
See Kiro Model Context Protocol Documentation for details.
Navigate
Kiro>MCP ServersAdd a new MCP server by clicking the
+ Addbutton.Paste the configuration given below:
{
"mcpServers": {
"TEC MCP": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"},
"disabled": false,
"autoApprove": []
}
}
}Click
Saveto apply the changes.
Use the Add manually feature and fill in the JSON configuration information for that MCP server. For more details, visit the Trae documentation.
Trae Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Use these alternatives to run the local TEC MCP server with other runtimes. These examples work for any client that supports launching a local MCP server via command + args.
Bun
{
"mcpServers": {
"tec-mcp": {
"command": "bunx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Deno
{
"mcpServers": {
"tec-mcp": {
"command": "deno",
"args": [
"run",
"--allow-env=NO_DEPRECATION,TRACE_DEPRECATION",
"--allow-net",
"npm:@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}If you prefer to run the MCP server in a Docker container:
Build the Docker Image:
First, create a
Dockerfilein the project root (or anywhere you prefer):FROM node:18-alpine WORKDIR /app # Install the latest version globally RUN npm install -g @the-events-calendar/mcp-server # Expose default port if needed (optional, depends on MCP client interaction) # EXPOSE 3000 # Default command to run the server CMD ["mcp-server"]Then, build the image using a tag (e.g.,
tec-mcp). Make sure Docker Desktop (or the Docker daemon) is running. Run the following command in the same directory where you saved theDockerfile:docker build -t tec-mcp .Configure Your MCP Client:
Update your MCP client's configuration to use the Docker command.
Example for a cline_mcp_settings.json:
{ "mcpServers": { "TEC MCP": { "autoApprove": [], "disabled": false, "timeout": 60, "command": "docker", "args": ["run", "-i", "--rm", "tec-mcp"], "transportType": "stdio" } } }Note: This is an example configuration. Please refer to the specific examples for your MCP client (like Cursor, VS Code, etc.) earlier in this README to adapt the structure (e.g.,
mcpServersvsservers). Also, ensure the image name inargsmatches the tag used during thedocker buildcommand.
The configuration on Windows is slightly different compared to Linux or macOS (Cline is used in the example). The same principle applies to other editors; refer to the configuration of command and args.
{
"mcpServers": {
"github.com/the-events-calendar/mcp-server": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"},
"disabled": false,
"autoApprove": []
}
}
}Add this to your Amazon Q Developer CLI configuration file. See Amazon Q Developer CLI docs for more details.
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}See Warp Model Context Protocol Documentation for details.
Navigate
Settings>AI>Manage MCP servers.Add a new MCP server by clicking the
+ Addbutton.Paste the configuration given below:
{
"TEC MCP": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"},
"working_directory": null,
"start_on_launch": true
}
}Click
Saveto apply the changes.
Using TEC MCP with Copilot Coding Agent
Add the following configuration to the mcp section of your Copilot Coding Agent configuration file Repository->Settings->Copilot->Coding agent->MCP configuration:
{
"mcpServers": {
"tec-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}For more information, see the official GitHub documentation.
See LM Studio MCP Support for more information.q
Manual set-up:
Navigate to
Program(right side) >Install>Edit mcp.json.Paste the configuration given below:
{
"mcpServers": {
"TEC MCP": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Click
Saveto apply the changes.Toggle the MCP server on/off from the right hand side, under
Program, or by clicking the plug icon at the bottom of the chat box.
You can configure TEC MCP in Visual Studio 2022 by following the Visual Studio MCP Servers documentation.
Add this to your Visual Studio MCP config file (see the Visual Studio docs for details):
{
"mcp": {
"servers": {
"tec-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}
}For more information and troubleshooting, refer to the Visual Studio MCP Servers documentation.
Add this to your Crush configuration file. See Crush MCP docs for more info.
Crush Local Server Connection
{
"$schema": "https://charm.land/crush.json",
"mcp": {
"tec-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Open the "Settings" page of the app, navigate to "Plugins," and enter the following JSON:
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}Once saved, you can start using the TEC MCP tools. More information is available on BoltAI's Documentation site. For BoltAI on iOS, see this guide.
Edit your Rovo Dev CLI MCP config by running the command below -
acli rovodev mcpExample config -
Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {"WP_APP_PASSWORD": "your-application-password"}
}
}
}To configure TEC MCP in Zencoder, follow these steps:
Go to the Zencoder menu (...)
From the dropdown menu, select Agent tools
Click on the Add custom MCP
Add the name and server configuration from below, and make sure to hit the Install button
{
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {
"WP_APP_PASSWORD": "your-application-password"
}
}Once the MCP server is added, you can easily continue using it.
See Qodo Gen docs for more details.
Open Qodo Gen chat panel in VSCode or IntelliJ.
Click Connect more tools.
Click + Add new MCP.
Add the following configuration:
Qodo Gen Local Server Connection
{
"mcpServers": {
"tec-mcp": {
"command": "npx",
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
"--password",
"your-password"
]
}
}
}See Local and Remote MCPs for Perplexity for more information.
Navigate
Perplexity>SettingsSelect
Connectors.Click
Add Connector.Select
Advanced.Enter Server Name:
TEC MCPPaste the following JSON in the text area:
{
"command": "npx"
"args": [
"-y",
"@the-events-calendar/mcp-server",
"--url",
"https://your-wordpress-site.com",
"--username",
"your-username"
],
"env": {
"WP_APP_PASSWORD": "your-application-password"
}
}Click
Save.
Command-Line Options
Option | Description |
| WordPress site URL (required) |
| WordPress username (required) |
| WordPress application password (required) |
| Ignore SSL certificate errors (for local development) |
| Set logging level (error, warn, info, http, verbose, debug, silly) |
| Write logs to file (suppresses console output for clean MCP protocol) |
| Show help message |
Authentication Setup
Creating a WordPress Application Password
Log in to your WordPress admin dashboard
Navigate to Users → Your Profile
Scroll down to "Application Passwords" section
Enter a name for this application (e.g., "MCP Server")
Click "Add New Application Password"
Copy the generated password (spaces can be included)
Security Best Practices
Never commit passwords to version control
Use environment variables or secure configuration files
Rotate application passwords regularly
Use SSL/HTTPS for production sites
Restrict application password permissions when possible
Available Tools
1. tec-calendar-create-update-entities
Create or update a post. If an ID is provided, it updates; otherwise, it creates.
Parameters:
postType: "event" | "venue" | "organizer" | "ticket"id: (optional) Post ID for updatesdata: Post data object (fields depend on post type)
Example - Create Event:
{
"postType": "event",
"data": {
"title": "My Event",
"start_date": "2024-12-25 10:00:00",
"end_date": "2024-12-25 18:00:00",
"venue": 123
}
}Example - Create Event with Nested Venue:
{
"postType": "event",
"data": {
"title": "Conference 2024",
"start_date": "2024-12-25 10:00:00",
"end_date": "2024-12-25 18:00:00",
"venue": {
"venue": "Convention Center",
"address": "123 Main St",
"city": "New York",
"state_province": "NY",
"zip": "10001",
"country": "US"
}
}
}2. tec-calendar-read-entities
Read a single post by ID or list posts with filters.
Parameters:
postType: "event" | "venue" | "organizer" | "ticket"id: (optional) Post ID for single postquery: (optional) Search termCommon filters (all post types):
page: Page numberper_page: Items per page (max 100 by default)status: Post statusorder: "asc" | "desc"orderby: Field to order byinclude: Array of specific IDs to includeexclude: Array of specific IDs to exclude
eventFilters: (optional) Event-specific filtersstart_date: Events starting after this dateend_date: Events ending before this datevenue: Filter by venue IDorganizer: Filter by organizer ID
Example - List Events:
{
"postType": "event",
"per_page": 10,
"status": "publish",
"eventFilters": {
"start_date": "2024-12-01",
"end_date": "2024-12-31"
}
}Example - Search Events:
{
"postType": "event",
"query": "conference",
"per_page": 20
}3. tec-calendar-delete-entities
Delete a post (soft delete to trash or permanent delete).
Parameters:
postType: "event" | "venue" | "organizer" | "ticket"id: Post ID to deleteforce: (optional) true for permanent delete, false for trash
Example:
{
"postType": "event",
"id": 123,
"force": false
}Development
Setting Up for Development
Clone the repository:
git clone https://github.com/the-events-calendar/mcp-server.git
cd mcp-serverInstall dependencies:
npm installCopy environment template:
cp .env.example .envConfigure
.envwith your credentials:
WP_URL=https://your-wordpress-site.com
WP_USERNAME=your-username
WP_APP_PASSWORD=your-application-password
LOG_LEVEL=infoRun in development mode:
npm run devBuild Commands
Command | Description |
| Run in watch mode with hot reload |
| Build TypeScript to JavaScript |
| Run the compiled server |
| Run with Bun runtime |
| Run with debug logging |
Environment Variables Reference
Variable | Description | Default |
| WordPress site URL | Required |
| WordPress username | Required |
| Application password | Required |
| Ignore SSL errors |
|
| Enforce 100 item limit |
|
| Server identifier |
|
| Logging verbosity |
|
| Log output file | Console output |
Important Notes
Per-Page Limits
By default, the API limits results to 100 items per page. To disable this limit:
Set
WP_ENFORCE_PER_PAGE_LIMIT=falsein your environmentOr use smaller
per_pagevalues in your requests
Post Type Names
Use the simplified post type names:
Events:
eventVenues:
venueOrganizers:
organizerTickets:
ticket
Additional Resources
TOOLS_GUIDE.md - Comprehensive guide with examples for all tools
examples/ - Configuration examples for various MCP clients
GitHub Issues - Report bugs or request features
License
ISC
Available Tools
3 toolstec-calendar-create-update-entitiesA
Create or update a calendar post (Event, Venue, Organizer, or Ticket).
For creating: provide postType and data. For updating: provide postType, id, and data.
FREE TICKETS: To create free tickets, omit the price field entirely. WordPress will automatically default to price 0. Do NOT set price to 0 explicitly as this triggers validation errors. Both Tickets Commerce and RSVP providers support free tickets when the price field is omitted.
TICKET AVAILABILITY DATES: Use start_date and end_date fields to control when tickets are available for purchase. start_date is when tickets become available, end_date is when sales stop (typically the event start time). All ticket date fields must be in Y-m-d H:i:s format (e.g., "2024-12-25 15:30:00"). If not provided, defaults to 1 week before event (start) and event start time (end). By default, end_date will be capped to the event start unless you pass allow_end_after_event: true.
SALE PRICING: To offer tickets at a reduced price during specific periods:
price: Regular ticket price
sale_price: Discounted price (must be less than regular price)
sale_price_start_date: When the sale price becomes active
sale_price_end_date: When the sale price expires (reverts to regular price)
Example: Regular $50 ticket on sale for $35 from Dec 1-15:
{
"price": 50,
"sale_price": 35,
"sale_price_start_date": "2024-12-01",
"sale_price_end_date": "2024-12-15"
}NOTE: Ticket availability dates (start_date, end_date) must be provided in Y-m-d H:i:s format. Sale price dates (sale_price_start_date, sale_price_end_date) must be provided in YYYY-MM-DD format. UNLIMITED TICKETS: To create unlimited tickets, set stock_mode to "unlimited".
IMPORTANT: Ensure your event dates and times use the expected formats and timezone context.
Date Formats Supported
ISO 8601:
"2024-12-25T15:00:00"Date and time:
"2024-12-25 15:00:00"Natural language:
"tomorrow 2pm","next monday","first thursday of next month"Relative:
"+3 days","+2 hours","3 days 1 hour"Specific dates:
"December 15, 2024 7:00 PM"
Workflow for Events with Dates
Calculate appropriate dates for your event
Create/update event with calculated dates
Create Examples
Event Creation
The Events Calendar event post type with date, location, and ticketing information
Example 1: Standard event with ISO dates
{
"postType": "event",
"data": {
"title": "Conference Next Week",
"start_date": "next monday 9am",
"end_date": "next friday 5pm",
"all_day": false,
"timezone": "America/New_York",
"venues": [
456
],
"organizers": [
789
]
}
}Example 2: Event with natural language dates
{
"postType": "event",
"data": {
"title": "Holiday Party",
"start_date": "December 15, 2024 7:00 PM",
"end_date": "December 15, 2024 11:30 PM",
"all_day": false,
"timezone": "America/Denver",
"venues": [
789
],
"cost": "$25 per person"
}
}Example 3: All-day event
{
"postType": "event",
"data": {
"title": "All Day Workshop",
"start_date": "tomorrow",
"end_date": "tomorrow",
"all_day": true,
"timezone": "Europe/London",
"cost": "Free"
}
}Example 4: Event with venue and organizers
{
"postType": "event",
"data": {
"title": "Summer Music Festival",
"start_date": "2024-07-15 18:00:00",
"end_date": "2024-07-15 23:00:00",
"all_day": false,
"timezone": "America/Los_Angeles"
}
}Venue Creation
Location where events take place, including address and contact information
Example 1: Complete venue with address
{
"postType": "venue",
"data": {
"title": "The Grand Ballroom",
"venue": "Grand Ballroom at the Historic Hotel",
"address": "456 Park Avenue",
"city": "New York",
"state": "NY",
"zip": "10022",
"country": "USA",
"phone": "+1 (212) 555-0123",
"website": "https://grandballroom.example.com"
}
}Example 2: Virtual/online venue
{
"postType": "venue",
"data": {
"title": "Beachside Resort",
"venue": "Sunset Beach Resort & Spa",
"address": "1000 Coastal Highway",
"city": "Miami Beach",
"state": "FL",
"zip": "33139",
"country": "US",
"phone": "305-555-BEACH",
"website": "https://sunsetbeachresort.example.com",
"geo_lat": 25.7906,
"geo_lng": -80.13
}
}Organizer Creation
Person or organization responsible for hosting events
Example 1: Organization with full contact
{
"postType": "organizer",
"data": {
"title": "Local Arts Council",
"email": "info@localartscouncil.org",
"website": "https://localartscouncil.org",
"phone": "(555) 123-4567"
}
}Example 2: Individual organizer
{
"postType": "organizer",
"data": {
"title": "DJ Mike Stevens",
"organizer": "Mike Stevens - Professional DJ",
"email": "bookings@djmikestevens.com",
"phone": "+1-555-DJ-MIKE",
"website": "https://djmikestevens.example.com"
}
}Ticket Creation
Event ticket as returned by the API, including read-only fields like sold count and calculated values.
Example 1: Paid general admission
{
"postType": "ticket",
"data": {
"title": "General Admission",
"event": 123,
"price": 25,
"stock": 100,
"capacity": 100,
"sku": "GA-2024-001"
}
}Example 2: VIP ticket with limited availability
{
"postType": "ticket",
"data": {
"title": "VIP Pass",
"event": 123,
"price": 150,
"stock": 20,
"capacity": 30,
"sku": "VIP-2024-001"
}
}Update Examples
Updating Events
The Events Calendar event post type with date, location, and ticketing information
Partial update example 1
{
"postType": "event",
"id": 124,
"data": {
"title": "Conference Next Week",
"start_date": "next monday 9am",
"end_date": "next friday 5pm"
}
}Partial update example 2
{
"postType": "event",
"id": 127,
"data": {
"title": "Holiday Party",
"start_date": "December 15, 2024 7:00 PM",
"end_date": "December 15, 2024 11:30 PM"
}
}Updating Venues
Location where events take place, including address and contact information
Partial update example 1
{
"postType": "venue",
"id": 457,
"data": {
"address": "456 Park Avenue",
"city": "New York",
"phone": "+1 (212) 555-0123"
}
}Partial update example 2
{
"postType": "venue",
"id": 461,
"data": {
"address": "1000 Coastal Highway",
"city": "Miami Beach",
"phone": "305-555-BEACH"
}
}| Name | Required | Description | Default |
|---|---|---|---|
| postType | Yes | The type of post to create or update | |
| id | No | Post ID (required for updates, omit for creation) | |
| data | Yes | The post data. Required fields depend on postType: Event (title, start_date, end_date), Venue (title or venue, address, city, country), Organizer (title or organizer), Ticket (title, event_id or event). Note: For Venue and Organizer, you can use "title" which will be converted to the appropriate field. For Tickets, all date fields must be in Y-m-d H:i:s format (e.g., "2024-12-25 15:30:00"). Sales dates default to 1 week before event (start) and event start date (end) if not specified. By default, ticket end_date will be capped to the event start date unless allow_end_after_event: true is provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: creates/updates events, venues, organizers, tickets; special rules for free tickets (omit price), ticket availability dates, sale pricing, and stock mode. However, it does not mention what the tool returns or any error conditions, which would improve transparency.
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?
Description is long but well-structured with sections, bullet points, and examples. Front-loaded with core purpose. Some repetition across examples, but overall efficient for the complexity. Could be slightly trimmed without loss.
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 tool with 3 parameters (required 2), nested data object, and no output schema, the description is extremely comprehensive: covers creation/update logic, field requirements per type, date formatting, special cases, and provides workflow and multiple examples. Sufficient for correct agent invocation.
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 coverage is 100% but description adds significant meaning: explains required fields per postType, date formats, special cases like free tickets and sale pricing, and provides multiple examples. This goes well beyond the schema's field descriptions.
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 'Create or update a calendar post (Event, Venue, Organizer, or Ticket).' This specifies the verb (create/update) and resource (calendar post types), clearly distinguishing from sibling tools (delete, read).
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?
Explicitly states when to use create vs update based on presence of 'id', provides detailed field requirements per postType, and includes notes on free tickets, availability dates, sale pricing, and unlimited tickets. This provides clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tec-calendar-delete-entitiesA
Delete or trash a calendar post (Event, Venue, Organizer, or Ticket).
Default (force=false or omitted): Moves posts to trash where they can be restored
Permanent delete (force=true): Permanently deletes posts with no option to restore
Delete Behaviors
Default (
force=false): Moves to trash (recoverable)Force delete (
force=true): Permanent deletion (not recoverable)
Best Practices
Always use default trash unless permanent deletion is required
Consider checking post details before deletion
For events, verify dates and timezone context first
Examples
Event Deletion
The Events Calendar event post type with date, location, and ticketing information
Move to trash (default, recoverable)
{
"postType": "event",
"id": 123
}Permanent deletion (not recoverable)
{
"postType": "event",
"id": 124,
"force": true
}Venue Deletion
Location where events take place, including address and contact information
Move to trash (default, recoverable)
{
"postType": "venue",
"id": 456
}Permanent deletion (not recoverable)
{
"postType": "venue",
"id": 457,
"force": true
}Organizer Deletion
Person or organization responsible for hosting events
Move to trash (default, recoverable)
{
"postType": "organizer",
"id": 789
}Permanent deletion (not recoverable)
{
"postType": "organizer",
"id": 790,
"force": true
}| Name | Required | Description | Default |
|---|---|---|---|
| postType | Yes | The type of post to delete | |
| id | Yes | Post ID to delete | |
| force | No | true for permanent delete, false for trash (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains default recoverable trash vs permanent deletion. Does not mention potential side effects like cascading deletes or access requirements, but is transparent about the core behavior.
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?
Well-structured with headings, bullet points, and examples. Front-loaded with purpose. Some redundancy (Delete Behaviors section repeats prior info), but overall efficient and readable.
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?
Covers behavior for all post types with examples and best practices. Missing details on cascading effects or output format, but given no output schema and simplicity of tool, it is sufficiently complete for an agent.
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 coverage is 100%, but description adds value by explaining the force parameter's effect and providing examples for each post type. The examples clarify usage beyond schema definitions.
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?
Description clearly states the verb (delete or trash) and the resources (Event, Venue, Organizer, Ticket). It distinguishes between default trash and permanent delete, and the name differentiates it from create-update and read siblings.
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?
Provides best practices (use default trash unless permanent deletion required) and suggests checking post details before deletion. However, it does not explicitly contrast with alternatives or provide when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tec-calendar-read-entitiesA
Read, list, or search calendar posts.
Use Cases
Get single post: provide postType and id
List all posts: provide postType only
Search posts: provide postType and query
Query Capabilities
Get single post by ID
List all posts with pagination
Search posts by keyword
Filter by post-specific criteria
Combine multiple filters
Examples
Basic Queries
1. Get specific event by ID
{ "postType": "event", "id": 123 }2. List all venues with pagination
{ "postType": "venue", "per_page": 20, "page": 1 }3. Search events by keyword
{ "postType": "event", "search": "conference" }4. Get all organizers sorted by name
{ "postType": "organizer", "orderby": "title", "order": "asc" }Date Filtering
5. Get upcoming events
{
"postType": "event",
"eventFilters": {
"start_date": "2024-12-06"
}
}6. Get events in date range
{
"postType": "event",
"eventFilters": {
"start_date": "2024-12-01",
"end_date": "2024-12-31"
}
}Location Filtering
7. Find venues by city and state
{
"postType": "venue",
"venueFilters": {
"city": "San Francisco",
"state": "CA"
}
}8. Find venues near coordinates
{
"postType": "venue",
"venueFilters": {
"geo_lat": 37.7749,
"geo_lng": -122.4194,
"radius": 10
}
}Relationship Queries
9. Get events at specific venue
{ "postType": "event", "eventFilters": { "venue": 456 } }10. Get tickets for specific event
{ "postType": "ticket", "ticketFilters": { "event": 123 } }11. Get available tickets only
{
"postType": "ticket",
"ticketFilters": {
"event": 123,
"available": true
}
}Status & Filtering
12. Get only published events
{ "postType": "event", "status": "publish" }13. Get draft and pending venues
{ "postType": "venue", "status": ["draft", "pending"] }Complex Queries
14. Search published events at venues with dates
{
"postType": "event",
"search": "workshop",
"status": "publish",
"eventFilters": {
"venue": 456,
"start_date": "2024-12-01"
},
"per_page": 50
}15. Get tickets under $50 sorted by price
{
"postType": "ticket",
"ticketFilters": {
"max_price": 50,
"available": true
},
"orderby": "price",
"order": "asc"
}Available Filters
eventFilters: venue, organizer, featured, categories, tags
venueFilters: city, state, country, zip, geo_lat/lng, radius
ticketFilters: event, type, provider, min/max_price
organizerFilters: email, website, phone
Common: status, search, include, exclude, page, per_page, orderby
| Name | Required | Description | Default |
|---|---|---|---|
| postType | Yes | The type of post to read | |
| id | No | Post ID for single post retrieval | |
| query | No | Search query string | |
| page | No | Page number | |
| per_page | No | Items per page | |
| order | No | Sort order | |
| orderby | No | Field to order by | |
| status | No | Post status filter | |
| include | No | Include specific IDs | |
| exclude | No | Exclude specific IDs | |
| eventFilters | No | Event-specific filters (only used when postType is "event") | |
| venueFilters | No | Venue-specific filters (only used when postType is "venue") | |
| organizerFilters | No | Organizer-specific filters (only used when postType is "organizer") | |
| ticketFilters | No | Ticket-specific filters (only used when postType is "ticket") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It implies read-only behavior through examples and the tool name, but it does not explicitly state that this tool does not modify data, require specific permissions, or have rate limits. The examples are thorough but lack a clear safety statement.
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 well-structured with a clear hierarchy: purpose, use cases, examples, and filter summary. It is front-loaded with essential information. However, it is lengthy due to 15 examples; some could be condensed without losing clarity. Overall, it balances detail and organization well.
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 (14 parameters, nested objects, no output schema), the description covers parameter usage comprehensively but is incomplete regarding return values, pagination behavior, and error handling. With no output schema, the agent would benefit from knowing what the response contains.
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 coverage is 100%, yet the description adds significant value by grouping parameters into use cases, providing 15 detailed examples showing valid combinations, and explaining conditional filters (e.g., eventFilters only for events). This greatly enhances parameter understanding beyond the schema.
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 'Read, list, or search calendar posts' and immediately outlines three use cases (get single, list all, search). The tool name 'tec-calendar-read-entities' combined with sibling tools for create-update and delete effectively distinguishes its purpose as read-only.
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 clear use cases and example queries that guide when to use each mode (single vs list vs search). However, it does not explicitly state when not to use this tool (e.g., for modifications) or reference sibling tools. The context from sibling names helps, but an explicit exclusion would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct action (create/update, delete, read) on a unified set of entities. There is no overlap or ambiguity; agents can easily distinguish based on the verb.
All tools follow the pattern `tec-calendar-<action>-entities` with consistent snake_case. The naming is predictable and clear.
Three tools is minimal but sufficient for the core CRUD operations across four entity types. The scope is well-defined and each tool earns its place, though a dedicated tool for listing or searching could further improve the surface.
The tools cover create/update, delete, and read (including advanced filtering and pagination) for events, venues, organizers, and tickets. Minor gaps like managing categories or tags exist, but the core lifecycle is solid.
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
Run in-person events from your AI: create events, manage tickets, attendees, broadcasts.
Event venue CRM — manage inquiries, quotes, events and availability from any AI agent
Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.
Event management for organizers: events, sessions, speakers, agendas, forms, approval-gated writes.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI assistants to interact with WordPress sites through REST APIs, allowing programmatic management of posts, users, comments, categories, and tags with secure authentication.2948MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to manage WordPress sites through natural conversation, supporting post creation, content updates, site queries, and draft-to-publish workflows via the WordPress REST API.9MIT
- AlicenseCqualityCmaintenanceEnables AI assistants to manage WordPress content, design, SEO, WooCommerce, and more through natural language commands.100323MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage WordPress sites via ~74 capabilities including content, media, plugins, themes, and more.
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/the-events-calendar/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server