l2calendar-mcp
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., "@l2calendar-mcpList the Interlude servers opening soon"
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.
l2calendar-mcp
MCP server for L2 Calendar — query upcoming Lineage 2 private server openings by chronicle directly from any MCP client (Claude Desktop, Cursor, VS Code, Windsurf, Cline...).
It wraps the free, public, CORS-enabled L2 Calendar API and exposes it as MCP tools.
Tools
Tool | What it does |
| List tracked servers, ordered by VIP status + opening date. Filters: |
| List every chronicle (slug + display name) to use as a filter. |
| Free-text search across name, website, rate, chronicle, description and labels. |
| Full public record of one server by exact name (case-insensitive). |
| Distinct labels in use (PTS, Low rate, Craft...) with colors. |
Every result is JSON, ready for the model to reason about.
Related MCP server: webcal-mcp
Data source
All data comes from the public API:
GET https://l2calendar.com/api/servers— up to 50 servers per call, optional?chronicle=<slug>filter.GET https://l2calendar.com/api/chronicles— the chronicle catalog.
The API is read-only, requires no key and sends Access-Control-Allow-Origin: *.
Fields returned per server: name, website_url, rate, opening_date, opening_time, opening_datetime_utc, description, is_vip, vip_level, multiproff, multicraft, is_new, chronicle and labels.
Note: the public API returns a single page of up to 50 servers (VIP first, then soonest opening). Tools that filter or search operate on that public page. Increase precision with the
chroniclefilter.
Install
Remote (HTTP) — no install
When hosted, point your client at the streamable HTTP endpoint:
{
"mcpServers": {
"l2calendar": {
"type": "http",
"url": "https://<your-host>/mcp"
}
}
}Local (stdio) via npx
{
"mcpServers": {
"l2calendar": {
"command": "npx",
"args": ["-y", "l2calendar-mcp"]
}
}
}Local (stdio) from source
git clone https://github.com/Dreiev/l2calendar-mcp.git
cd l2calendar-mcp
npm install
npm run build{
"mcpServers": {
"l2calendar": {
"command": "node",
"args": ["/absolute/path/to/l2calendar-mcp/dist/index.js"]
}
}
}Run the HTTP transport
node dist/index.js --http # http://127.0.0.1:8787/mcp
node dist/index.js --http --port 9000GET /health returns { "status": "ok" } for uptime checks.
Configuration
Variable | Default | Purpose |
|
| Base URL of the L2 Calendar instance to query. |
Example prompts
"List the Interlude servers opening soon."
"Which Classic servers are new this week?"
"Search for High Five servers with rate x1000."
"Show me every chronicle L2 Calendar tracks."
"Get the details of the server named L2Hispano."
Development
npm install
npm run build # tsc -> dist/
npm run dev # run src/index.ts directly (Node >= 22)
npm run start:http # build output over HTTPAbout L2 Calendar
L2 Calendar is a multilingual (EN/ES/PT/RU) calendar and tracker of Lineage 2 private server openings by chronicle — l2calendar.com.
License
MIT © Dreiev
Available Tools
5 toolsget_chroniclesList Lineage 2 chroniclesA
List every Lineage 2 chronicle tracked by L2 Calendar (slug, display name and order). Use the slugs as the chronicle filter for list_servers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly indicates a read-only retrieval operation by using 'List every', identifies the data source ('tracked by L2 Calendar'), and specifies the returned fields. It doesn't mention error cases or rate limits, but for a zero-parameter list tool this is adequate and adds meaningful 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?
Two sentences with zero fluff. The first sentence front-loads the purpose and output, the second delivers the key usage instruction. Every word earns its place.
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 zero-parameter, no-output-schema tool with no annotations, the description is complete. It explains what the tool returns and how to use it downstream (filter for list_servers). An agent has everything it needs to call and apply the result correctly.
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 input schema has zero parameters, so the baseline is 4. The description adds a practical usage hint about how to use the returned slugs with list_servers, but since there are no parameters, it cannot add parameter-level meaning. The baseline score is correct.
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 ('List'), a specific resource ('every Lineage 2 chronicle tracked by L2 Calendar'), and the data returned ('slug, display name and order'). This clearly distinguishes it from sibling tools that deal with servers or labels.
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?
It explicitly tells the agent when to use this tool: 'Use the slugs as the chronicle filter for list_servers.' This gives a clear, actionable use case. It doesn't explicitly state when not to use it, but the alternative tools are clearly different in scope, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_serverGet a Lineage 2 private serverA
Return the full public record of a single server by its exact name (case-insensitive), including description and labels.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact server name, for example "L2Hispano". | |
| chronicle | No | Optional chronicle slug to narrow the lookup. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses case-insensitive exact matching and that the response includes description and labels, but it does not describe no-match behavior, error responses, or explicitly confirm that this is a read-only operation.
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?
Single sentence, front-loaded with the core action and scoping, with no filler. Every phrase contributes meaning.
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?
Without an output schema, the description should clarify the return value, and it does so at a high level by saying 'full public record... including description and labels.' However, it omits no-match behavior, how the optional chronicle parameter narrows the lookup, and explicit guidance to use search_servers when the exact name is unknown.
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%, so the baseline is 3. The description adds value beyond the schema by clarifying exact, case-insensitive name matching, which the schema does not state. It does not add extra meaning for the optional chronicle parameter, but the name semantics are a genuine improvement.
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?
States a clear verb and resource: return the full public record of a single server. The qualifier 'by its exact name' distinguishes this from list_servers and search_servers, which are siblings with different lookup semantics.
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 the tool should be used when the caller has an exact server name, but it does not explicitly state when to prefer search_servers or list_servers instead. No exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_labelsList server labelsA
List the distinct labels (e.g. PTS, Low rate, Craft) currently applied to servers on the public page, with their colors.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the result contains only distinct labels, reflects the currently applied state, is scoped to the public page, and includes colors. The verb 'List' also implies a read-only operation, providing sufficient behavioral context for such a simple tool.
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 communicates the resource, scope, examples, and output details with zero filler. The parenthetical examples improve clarity without adding length.
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, parameterless read operation with no output schema, the description is fully sufficient: it names the returned data (distinct labels and colors), the source (servers on the public page), and the current-state semantics. Nothing essential is missing for an agent to invoke it correctly.
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 input schema has zero parameters, so there is nothing for the description to clarify. The baseline for a parameterless tool is 4, and the description appropriately focuses on what the tool returns rather than on inputs.
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 uses a specific verb ('List') with a clear resource ('distinct labels applied to servers'), and adds concrete examples and the detail that colors are included. This clearly distinguishes it from sibling tools like list_servers or search_servers, which target servers rather than label metadata.
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 the use case: when you need the distinct server labels and their colors from the public page. However, it does not explicitly state when to choose this over alternatives, and it names no sibling tools or exclusion conditions, so the guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serversList Lineage 2 private serversA
List Lineage 2 private servers tracked by L2 Calendar, ordered by VIP status and opening date. Optionally filter by chronicle, upcoming openings, newly added entries or rate range.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of servers to return (1-50). Defaults to 50, the API page size. | |
| max_rate | No | Maximum numeric rate. GVE entries are excluded. | |
| min_rate | No | Minimum numeric rate (e.g. 100 for x100+). GVE entries are excluded. | |
| new_only | No | When true, only return servers flagged as newly added entries. | |
| chronicle | No | Chronicle slug to filter by (e.g. interlude, high-five, classic, essence, god, gracia-final). Use get_chronicles for the full list. | |
| only_upcoming | No | When true, only return servers whose opening date is today or later. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly indicates a read-only list operation, reveals the ordering ('ordered by VIP status and opening date'), and names the filtering dimensions. It leaves some details such as GVE exclusion and pagination to the schema, but the core behavior is 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?
The description is two concise sentences with no filler. It front-loads the core action and resource, then summarizes the optional filters in one efficient phrase. Every sentence earns its place.
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 optional-filter list tool with all six parameters fully documented in the schema, the description is nearly complete: it states the data source, ordering, and available filter categories. It does not describe the return shape, but there is no output schema and the absence is acceptable for this simple listing operation.
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 baseline is 3. The description condenses the parameters into categories like 'upcoming openings, newly added entries or rate range', but adds no meaning beyond what the schema already provides for each parameter.
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 names a specific verb and resource: 'List Lineage 2 private servers tracked by L2 Calendar', and adds ordering and filter scope. It is clear, but it does not explicitly differentiate itself from the sibling search_servers or get_server tools.
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 phrase 'List ... Optionally filter by ...' implies this tool is for listing and filtering servers, which gives reasonable usage context. However, it never states when to prefer this tool over search_servers or get_server, so alternative guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_serversSearch Lineage 2 private serversA
Search the current L2 Calendar server page by free text. Matches the server name, website, rate, chronicle, description and labels (case-insensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matches to return (1-50). | |
| query | Yes | Text to match, for example "interlude x1000" or a server name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It adds useful behavior beyond the schema: matching is case-insensitive and covers a specific set of fields. It does not mention ordering, pagination, result format, or that the operation is read-only, though search semantics imply safety.
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 sentence front-loads the action and resource, then packs the search behavior into the rest. There is no redundant filler, and every clause adds relevant information.
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 two-parameter tool with no output schema, the description is largely sufficient: it identifies the source page, query semantics, and matched fields. Minor gaps remain around what a returned match looks like and the default limit when limit is omitted, but these are not blocking for correct 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%, so the baseline is 3. The description adds value by explaining what the query is matched against (name, website, rate, chronicle, description, labels) and that matching is case-insensitive, going beyond the schema's generic 'Text to match'.
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 action ('search'), a specific resource ('current L2 Calendar server page'), and the matching behavior (free text across name, website, rate, chronicle, description, and labels). It is distinguishable from siblings like list_servers and get_server, though it does not explicitly name or 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?
The phrase 'by free text' implies when to use the tool: when a caller needs to match arbitrary text against multiple server attributes. However, it does not explicitly state when not to use it or mention alternatives such as list_servers or get_server, so routing guidance is only implied.
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.
5 tool updates
v1.0.0- First observed
get_chronicles - First observed
get_server - First observed
list_labels - First observed
list_servers - First observed
search_servers
TDQS
Scored across 5 tools
Most tools have clearly distinct purposes, with list_servers, search_servers, and get_server each serving different retrieval modes. The only possible confusion is between list_servers and search_servers, since both return servers, but their filtering vs. free-text search approaches are described distinctly.
All tool names follow a consistent snake_case verb_noun pattern: list_servers, get_chronicles, search_servers, get_server, list_labels. The verbs (list, get, search) are predictable and match the action each tool performs.
Five tools is a well-scoped set for a read-only calendar/lookup service. Each tool covers a distinct need—listing, searching, detail retrieval, and reference lookups—without unnecessary redundancy or bloat.
The tool surface fully covers the apparent read-only domain: broad listing with filters, free-text search, exact record retrieval, and enumeration of chronicles and labels. No obvious dead ends or missing operations for the stated purpose.
Related MCP Connectors
Google Events listings with dates, venues, and ticket links via a hosted MCP server.
MCP server providing attendance data queries via the CloudTime API.
MCP server for Cronofy — read calendars, events and free/busy, and create, update or delete events.
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that enables scheduling, updating, deleting, and listing calendar appointments through Cal.com's Calendar API.43-
- AlicenseNot gradedqualityBmaintenanceA read-only MCP server that exposes iCalendar feeds as queryable tools for LLM agents, enabling calendar event retrieval and filtering.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for the Teamup Calendar API, enabling event management, calendar listing, and available slot search.-
- FlicenseDqualityDmaintenanceMCP server for interacting with Google Calendar, enabling reading events from public calendars and, with OAuth, creating, updating, and deleting events.1-