Evento Public MCP Server
Click on "Deploy 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., "@Evento Public MCP Serverlist upcoming events for user 'john'"
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.
Evento Public MCP Server
Local MCP server for Evento developer-facing authenticated public APIs.
It runs on your machine over stdio, authenticates every API call with your API key, and can be connected to Claude Desktop (or any MCP client that supports stdio transport).
What This Server Is
MCP transport adapter only (stdio)
Tool calls mapped to Evento Public API routes
Auth injected centrally using your API key
No database access, no Supabase, no server-side persistence in MCP layer
This follows the same architecture shape as the admin MCP pattern, with different API routes and key type.
Related MCP server: eesti.ai events MCP server
Features
list-eventsLists user events
Optional filters:
type,limit
get-eventGets one event by ID
Requirements
Node.js 18+
npm
Evento developer-facing API key
MCP client (Claude Desktop, Cursor, etc.)
Quick Start
git clone https://github.com/andreneves/evento-public-mcp.git
cd evento-public-mcp
npm install
npm run buildCreate your env file:
cp .env.example .envSet at least:
PUBLIC_API_KEY
Then run:
npm startInstallable Skill (SKILL.md)
This repository includes an installable Claude skill file at:
SKILL.md
Install it locally:
mkdir -p ~/.claude/skills/evento-public-mcp
cp SKILL.md ~/.claude/skills/evento-public-mcp/SKILL.mdCanonical source and docs:
Skill file:
https://github.com/andreneves/evento-public-mcp/blob/main/SKILL.mdDocs page:
https://docs.evento.so/mcp-server/skill
Versioning and sync policy
Source of truth is this repository's
SKILL.mdWhen updating skill behavior or instructions, update
SKILL.mdfirstKeep the docs mirror page in sync:
evento-docs/ai/skill.mdxBump
metadata.versioninSKILL.mdfor meaningful content changesVerify the docs page still reflects the full file content before release
Environment Variables
Required:
PUBLIC_API_KEYDeveloper-facing Evento API key used as
Authorization: Bearer <key>
Optional:
EVENTO_API_BASE_URL(default:https://evento.so/api)EVENTO_API_TIMEOUT_MS(default:15000)EVENTO_API_RETRY_ATTEMPTS(default:2)EVENTO_API_RETRY_DELAY_MS(default:250)EVENTO_PUBLIC_API_KEY(legacy compatibility fallback ifPUBLIC_API_KEYis missing)EVENTO_SMOKE_USERNAME(used by smoke command)
MCP Client Configuration
Example Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"evento-public": {
"command": "node",
"args": ["/absolute/path/to/evento-public-mcp/dist/index.js"],
"env": {
"PUBLIC_API_KEY": "your-evento-api-key",
"EVENTO_API_BASE_URL": "https://evento.so/api"
}
}
}
}Notes:
Use an absolute path in
argsRestart Claude Desktop after config changes
Available Tools
list-events
List events for a user.
Input:
username(required, string)type(optional,upcoming | past | profile)limit(optional, number)
Route mapping:
GET /public/v1/users/{username}/events
get-event
Get event details by ID.
Input:
eventId(required, string)
Route mapping:
GET /public/v1/events/{eventId}
Architecture
Key files:
src/index.tsprocess entrypoint
src/mcp-server.tsMCP protocol handling (
tools/list,tools/call)
src/public-tools.tssingle runtime registry (
PUBLIC_TOOLS)generic executor (
executePublicTool)auth/header injection, path interpolation, timeout/retry, normalized response
PUBLIC_MCP.tools.jsonmanifest mirror of runtime tools
Execution flow:
MCP client calls
tools/listserver returns
PUBLIC_TOOLSMCP client calls
tools/callserver delegates to
executePublicTool(name, args)executor validates required args, resolves path placeholders, strips path args from body
executor calls Evento API with auth header and retry/timeout policy
executor normalizes success/error payload back to MCP response
Local Development
Install deps:
npm installRun directly in TypeScript:
npm run devBuild:
npm run buildRun built server:
npm startTesting and Verification
Run tests:
npm testRun build + tests:
npm run verifySmoke check (live API):
EVENTO_SMOKE_USERNAME=your-username npm run smokeTest layers included:
Unit:
tests/public-tools.unit.test.tsManifest parity:
tests/manifest-parity.test.tsMCP stdio e2e:
tests/mcp.e2e.test.ts
Adding a New Tool
Add a new tool definition to
PUBLIC_TOOLSinsrc/public-tools.tsname, description, method, path, input schema
Ensure route/path placeholders align with args
Update
PUBLIC_MCP.tools.jsonto matchAdd/extend unit tests and parity assertions
Run
npm run verify
Error Handling and Retry Policy
Retries on retryable statuses:
408,429,5xxRetries on retryable network errors (timeout / DNS / connection reset classes)
Controlled by env vars (
EVENTO_API_RETRY_*)Returns MCP
isError: truewith structured error payload when failed
Troubleshooting
Missing API key
Symptom:
Tool call returns missing key error
Fix:
Set
PUBLIC_API_KEYin MCP client env config
Tools not visible in client
Fix checklist:
Run
npm run buildConfirm
dist/index.jsexistsConfirm absolute path in MCP config
Restart MCP client app
API errors
Fix checklist:
Verify key is valid for authenticated public endpoints
Verify
EVENTO_API_BASE_URLRun smoke check with a known username
Security Notes
Keep API keys in local env config, not source control
This project does not store your API key beyond process env
License
ISC
Available Tools
2 toolsget-eventA
Get detailed information about a specific event by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | The ID of the event to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. 'Get detailed information' clearly indicates a read-only retrieval operation with no side effects, though it does not specify behavior for missing IDs or error cases. For a simple read-by-ID tool, the core behavior is sufficiently transparent.
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?
A single, front-loaded sentence with no filler. Every word contributes to the meaning, and the description is appropriately sized for a simple one-parameter retrieval tool.
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 simple get-by-ID tool with one fully documented required parameter, the description is nearly complete. The only minor gap is that no output schema exists and the description does not clarify what fields 'detailed information' includes, but an agent can still invoke the tool correctly with the given information.
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 input schema already fully documents eventId as 'The ID of the event to retrieve'. The description adds no new parameter-level meaning beyond restating that the event is retrieved by ID, so the baseline 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 a specific verb ('Get'), a resource ('event'), and the selection by ID. It distinguishes from the sibling list-events by focusing on one specific event rather than a collection.
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 use when the agent already knows the event ID and needs details for that single event, while list-events would be used to enumerate events. It provides clear context but does not explicitly name the alternative or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list-eventsB
List events for a specific user. Returns upcoming, past, or all profile events.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter events by type: upcoming, past, or profile (all public events) | |
| limit | No | Maximum number of events to return | |
| username | Yes | The username to list events for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It only restates the return categories and does not mention pagination, default type when omitted, ordering, read-only nature, or how 'profile' events are selected.
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?
Two short sentences with no filler. The action and target are front-loaded, and the return categories are listed compactly.
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?
This is adequate for a straightforward list operation: the core purpose is clear, and the schema covers parameters. However, missing default behavior for when type/limit are omitted, no pagination/ordering context, and no output schema leave moderate gaps for an agent selecting and invoking the tool.
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 all parameters. The description's mention of 'upcoming, past, or all profile events' mirrors the type enum and adds no substantial meaning 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 states a specific verb and resource: 'List events for a specific user', and enumerates the three categories returned. It is clear enough to distinguish from the sibling get-event, though it does not explicitly contrast them.
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?
No guidance is given about when to use list-events versus get-event, nor when each event type filter is appropriate. The description implies a user-scoped listing but provides no selection criteria or alternative routing.
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.
2 tool updates
v1.0.0- First observed
get-event - First observed
list-events
TDQS
Scored across 2 tools
list-events returns a collection of events for a user, while get-event returns details for a single event by ID. The purposes are clearly distinct and unlikely to be confused.
Both tools follow the same kebab-case verb-noun pattern: list-events and get-event. The naming is consistent and predictable.
Two tools is minimal for a server, though acceptable for a narrow read-only event API. It falls below the typical well-scoped 3-15 tool range.
The core read workflow is covered: listing events and fetching event details. There are minor gaps such as no search or filter-by-date tool, but for a public read-only event server this is reasonable.
Maintenance
Related MCP Connectors
Eventify MCP server — manage events, attendees, sessions, speakers, sponsors, and analytics.
Google Events listings with dates, venues, and ticket links via a hosted MCP server.
TheSignup MCP server — read and manage signups, participants, webhooks, and analytics.
MCP server for Riveter's enrichment, scraping, and monitoring API
Related MCP Servers
- AlicenseAqualityDmaintenanceThis is a Model Context Protocol (MCP) server that provides tools for interacting with the Eventbrite API. It allows AI assistants to search for events, get event details, retrieve venue information, and more.418 npmMIT
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that exposes Estonian eesti.ai events (workshops and meetups) via search, upcoming, and single event tools, wrapping the vportal.ee search API.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for the Teamup Calendar API, enabling event management, calendar listing, and available slot search.-
- FlicenseBqualityDmaintenanceMCP server for interacting with the Eventin booking system, enabling natural language management of bookings, events, and venues.2-