Skip to main content
Glama
Dreiev

l2calendar-mcp

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_servers

List tracked servers, ordered by VIP status + opening date. Filters: chronicle, only_upcoming, new_only, min_rate, max_rate, limit.

get_chronicles

List every chronicle (slug + display name) to use as a filter.

search_servers

Free-text search across name, website, rate, chronicle, description and labels.

get_server

Full public record of one server by exact name (case-insensitive).

list_labels

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 chronicle filter.

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 9000

GET /health returns { "status": "ok" } for uptime checks.

Configuration

Variable

Default

Purpose

L2CALENDAR_API_URL

https://l2calendar.com

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 HTTP

About 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 tools
get_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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExact server name, for example "L2Hispano".
chronicleNoOptional chronicle slug to narrow the lookup.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of servers to return (1-50). Defaults to 50, the API page size.
max_rateNoMaximum numeric rate. GVE entries are excluded.
min_rateNoMinimum numeric rate (e.g. 100 for x100+). GVE entries are excluded.
new_onlyNoWhen true, only return servers flagged as newly added entries.
chronicleNoChronicle slug to filter by (e.g. interlude, high-five, classic, essence, god, gracia-final). Use get_chronicles for the full list.
only_upcomingNoWhen true, only return servers whose opening date is today or later.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matches to return (1-50).
queryYesText to match, for example "interlude x1000" or a server name.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 5 tool updatesv1.0.0
    • First observedget_chronicles
    • First observedget_server
    • First observedlist_labels
    • First observedlist_servers
    • First observedsearch_servers

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

Related MCP Servers