eventor-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., "@eventor-mcplist orienteering events in Norway next weekend"
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.
eventor-mcp
An MCP server that exposes the Norwegian/Swedish orienteering federation's Eventor REST API as typed tools, so an MCP client (e.g. Claude) can query events, clubs, entries and competitors -- and optionally publish start/result lists -- without ever seeing your API key or Eventor password.
Why this exists
Eventor's own API documentation (the "Hämta data via API"
guide)
only documents authentication and one example call. The actual endpoint shapes
used here were taken from a real, working integration (ttime.pl) against this
API.
Related MCP server: Nettskjema MCP Server
Security model
Credentials (
EVENTOR_API_KEY,EVENTOR_USERNAME,EVENTOR_PASSWORD) are read only from environment variables, by the server process itself.They are never included in any tool result, logged, or written to disk by this project.
.envis git-ignored -- only.env.example(with empty values) is committed.An MCP client (including an LLM) only ever calls tools like
list_events(from_date, to_date); it never handles the raw key/password.
If you ever paste your API key into a chat, file, or issue, treat it as compromised and regenerate it in Eventor under Klubben -> Klubbinnstillinger.
Setup
Requires uv.
uv sync --extra dev
cp .env.example .env # then fill in your own values in .envuv sync creates .venv and installs everything pinned in uv.lock. Run
project commands with uv run <command> (e.g. uv run pytest), or activate
the environment yourself (.venv\Scripts\activate on Windows,
source .venv/bin/activate on macOS/Linux) if you prefer.
Two separate credential types are used by Eventor's API:
Credential | Used for | Where to get it |
|
| Eventor -> Klubben -> Klubbinnstillinger (club admin only) |
|
| Your personal Eventor login |
Running
uv run python -m eventor_mcp.serverThis starts the server on stdio, ready for an MCP client to connect.
Registering with Claude Code
This repo ships a project-scoped .mcp.json, so opening this folder in
Claude Code (or the Claude desktop app's Code tab) offers to enable the
eventor server automatically -- you'll see a one-time approval prompt
(project MCP servers can run arbitrary commands, so Claude Code always
asks first). It runs uv run python -m eventor_mcp.server with this
project directory as its working directory, so it picks up your local
.env on its own; no credentials are stored in .mcp.json.
To register it globally instead (available from any directory, not just this one), use the CLI:
claude mcp add eventor -- uv run --directory /path/to/eventor-mcp python -m eventor_mcp.serverEither way, credentials come from your environment / local .env --
never hardcode them anywhere in this repo.
Installing as a standalone tool (no clone needed)
If you just want to run the server -- not modify or test the code -- you don't need a checkout at all:
uv tool install git+https://github.com/bjorges/eventor-mcpThis puts an eventor-mcp command on your PATH, in its own isolated
environment. There's no project directory here for .env auto-loading to
find, so set credentials as real environment variables instead (see
.env.example for the full list), then register it:
claude mcp add eventor -- eventor-mcpUpgrade with uv tool upgrade eventor-mcp, remove with
uv tool uninstall eventor-mcp.
If uv warns that its tool bin directory isn't on your PATH, run
uv tool update-shell and restart your shell before eventor-mcp (or
claude mcp add ... -- eventor-mcp) will resolve.
Tools
Tool | Auth | Notes |
| API key | Dates as |
| API key | All clubs/districts/federations |
| Username/password | Classes for one event |
| Username/password | Full entries: name, class, club, control cards (a list -- Emit, emiTag and SI are distinct systems and a person can have more than one) |
| Username/password | Just entry/modify timestamps |
| Username/password | Registered club members |
| Username/password | Writes to Eventor -- publishes a start list |
| Username/password | Writes to Eventor -- publishes results |
import_startlist and import_resultlist expect a complete
IOF XML 3.0 document as a string;
this project does not (yet) build that XML for you.
Testing
uv run pytestLimitations / TODO
No XML-building helpers for
import_startlist/import_resultlistyet -- callers must supply valid IOF XML 3.0.No caching, even though Eventor's usage terms ask integrations to cache frequently-fetched data (e.g. club member lists) client-side.
Only tested against the Norwegian instance (
eventor.orientering.no); the Swedish instance (eventor.orientering.se) uses the same API shape viaEVENTOR_BASE_URL.
Available Tools
8 toolsget_competitorsB
Get all registered competitors for one or more clubs.
Args: organisation_ids: Comma-separated Eventor organisation id(s).
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| organisation_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the authentication requirement (EVENTOR_USERNAME and EVENTOR_PASSWORD), which is genuine behavioral context. However, it says nothing about whether the call is read-only, what happens with invalid organisation ids, or rate/volume limits.
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 core purpose is front-loaded in one sentence, with credentials and parameter notes kept short. The Google-style 'Args:' block is slightly mechanical for a single parameter but wastes little space.
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?
An output schema exists, so return values need no explanation, and the description covers purpose, the sole parameter's format, and the auth requirement. Minor gaps remain around error behavior and whether results are paginated, but nothing essential to invocation is missing.
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 0% and the single parameter has no description in the schema, so the description must compensate. It does so by documenting the expected format ('Comma-separated Eventor organisation id(s)') and noting multiple clubs are accepted. Only the id source/validation rules remain unstated.
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 specific verb ('Get') and resource ('all registered competitors') plus the scoping dimension ('for one or more clubs'). An agent can distinguish it from event-scoped siblings like get_event_entries, though the description never names those siblings explicitly.
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 when-to-use statement, no prerequisites beyond credentials, and no alternative tools named. The organisation-scoped framing hints at its niche versus event-scoped siblings, but the agent must infer that rather than being told.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entry_changesB
Get entry/modification timestamps for a specific event (who entered or changed their entry, and when), without full competitor details.
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden. It discloses the required credentials (EVENTOR_USERNAME and EVENTOR_PASSWORD), which is useful, and clarifies the scope (timestamps, not full details). However, it doesn't cover rate limits, error behavior, or what the timestamp format looks like (though output schema exists).
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, front-loaded with the purpose and a useful qualifier, then the auth requirement. No wasted words, though the line break in the middle is slightly awkward.
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 single-parameter tool with an output schema, the description is nearly complete: it states purpose, scope, and auth requirements. The main gap is lack of explicit sibling differentiation and parameter format.
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?
Only one parameter (event_id), and schema description coverage is 0%. The description doesn't explain what event_id is or its format, but with just one obvious required parameter, the baseline 3 is reasonable – the schema structure itself is self-explanatory.
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 specific verb (Get) and resource (entry/modification timestamps for a specific event) with clarifying parenthetical about what's returned (who entered/changed and when). It distinguishes itself from get_event_entries by emphasizing change timestamps rather than full competitor details, though it doesn't name the sibling explicitly.
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 explicit when-to-use guidance or alternatives. The phrase 'without full competitor details' implies a contrast with get_event_entries but doesn't state when to choose this tool over that one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_event_classesA
Get the competition classes defined for a specific event.
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD (a personal Eventor login) -- this endpoint does not accept the club API key.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It clearly discloses the authentication constraint and that the club API key is rejected, which is valuable behavioral context. It does not explicitly state read-only safety, but the 'Get' verb implies it.
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 tight sentences, front-loads the purpose, and then supplies the critical authentication requirement. No words are wasted.
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 read tool with one required parameter and an output schema, the description covers purpose and the important authentication quirk. It remains thin on parameter semantics and usage alternatives, but the output schema carries return-value details.
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 0% and the only parameter, event_id, is not described in the schema. The description says 'for a specific event,' which minimally links the parameter to an event, but adds no format, source, or constraint details.
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: 'Get the competition classes defined for a specific event.' This distinguishes it from siblings like get_event_entries and get_competitors without needing to name 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?
It gives an important usage prerequisite: EVENTOR_USERNAME and EVENTOR_PASSWORD are required, and the club API key will not work. However, it does not explain when to prefer this tool over sibling tools such as get_event_entries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_event_entriesB
Get all entries for a specific event: competitor name, class, club and control card number.
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully states that EVENTOR_USERNAME and EVENTOR_PASSWORD are required, adding auth context beyond the schema, but it does not disclose whether the operation is read-only (though 'Get' implies it), rate limits, pagination, or error 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?
The description is two short sentences that are front-loaded with the primary action and returned fields, followed by the auth requirement. Every sentence earns its place with no redundancy.
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 read tool with one parameter and an output schema, the description covers purpose and auth requirements. However, it leaves a clear gap in parameter semantics by not explaining event_id, which is required given the 0% schema coverage for that parameter.
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 schema has 0% description coverage for event_id, so the description must compensate. It only says 'for a specific event', which adds little beyond the schema's title 'Event Id' and does not explain format, source, or constraints for the 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 states a specific verb ('Get') and resource ('all entries for a specific event'), and lists returned fields, making the purpose clear. It does not explicitly differentiate from similar siblings like get_event_classes or get_entry_changes, but the resource is distinct enough that an agent can infer the difference.
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?
There is no guidance on when to use this tool versus alternatives such as get_entry_changes or get_event_classes. The only guideline provided is the authentication requirement, which is a prerequisite rather than usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_resultlistA
Upload a result list to Eventor.
THIS WRITES DATA: it publishes results. Only call this after the user has explicitly confirmed they want to publish these exact results.
Args: iof_xml: A complete IOF XML 3.0 ResultList document as a string.
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| iof_xml | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it flags that this WRITES/publishes data, demands explicit user confirmation, and states the EVENTOR_USERNAME/EVENTOR_PASSWORD credential requirement. It omits idempotency, overwrite behavior, and failure handling, which keeps it from a 5.
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?
Front-loads the action and the critical write warning, then lists the arg and credential requirement. Every line earns its place with no redundancy.
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?
An output schema exists so return values need no explanation; the description covers action, safety precondition, payload format, and auth requirements. Nothing an agent needs to call this correctly is missing.
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 0% for the single iof_xml parameter, so the description must compensate — and it does, specifying the expected format as a complete IOF XML 3.0 ResultList document passed as a string. No further syntax detail is given, so not a 5.
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 specific verb and resource: upload/publish a result list to Eventor. The resource 'result list' distinguishes it from the sibling import_startlist and other read tools, though it never explicitly says so.
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?
Gives a clear precondition — only call after explicit user confirmation to publish these exact results — which is strong when-to-use guidance for a write tool. It doesn't name alternatives (e.g. import_startlist) or when-not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_startlistA
Upload a start list to Eventor.
THIS WRITES DATA: it changes what is published in Eventor. Only call this after the user has explicitly confirmed they want to publish this exact start list -- treat it like any other irreversible "publish" action, not a routine read.
Args: iof_xml: A complete IOF XML 3.0 StartList document as a string.
Requires EVENTOR_USERNAME and EVENTOR_PASSWORD.
| Name | Required | Description | Default |
|---|---|---|---|
| iof_xml | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that this WRITES data, alters what is published, is irreversible, and requires EVENTOR_USERNAME/EVENTOR_PASSWORD credentials. This is exactly the safety context missing from the structured fields.
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?
Front-loads the action, then the critical safety warning, then the argument and auth requirement. Each sentence earns its place; the emphasis on irreversibility is warranted for a destructive publish.
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 single-param write tool with an output schema (so return values need not be explained), the description covers purpose, danger profile, format expectations, and auth prerequisites. Nothing an agent needs to call it correctly is missing.
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 0% (the property is only titled 'Iof Xml' with no description), so the description must compensate. It specifies that iof_xml is a complete IOF XML 3.0 StartList document passed as a string, adding format and version detail the schema lacks, though not edge cases like validation failure.
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 specific verb+resource ('Upload a start list to Eventor'), clearly distinguishable from the sibling import_resultlist and the read-oriented get_* tools. It does not explicitly name an alternative, but the resource itself differentiates it.
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 call it: only after the user has confirmed they want to publish this exact start list. It frames the action as irreversible and warns it is not a routine read, which is precisely the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsA
List events (competitions/activities) from Eventor within a date range.
Args: from_date: Start date, format YYYY-MM-DD. to_date: End date, format YYYY-MM-DD. organisation_ids: Optional comma-separated Eventor organisation id(s) to filter by (a club or district). Omit for all events in range.
Requires EVENTOR_API_KEY (a club API key from Eventor -> Klubben -> Klubbinnstillinger).
| Name | Required | Description | Default |
|---|---|---|---|
| to_date | Yes | ||
| from_date | Yes | ||
| organisation_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the auth requirement (EVENTOR_API_KEY, including where to get it) and read-only intent via 'List'. It stops short of disclosing pagination, rate limits, or result-size behavior, which matters for a date-range listing.
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 core purpose is front-loaded in one sentence, followed by a compact Args block that earns its place given the zero schema coverage. The auth note is slightly separated from the invocation context but overall tight.
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?
An output schema exists, so return values need not be explained. Auth, date format, and filter semantics are all covered, leaving only secondary operational details (pagination/limits) absent.
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 0%, so the description must compensate, and it does: date format YYYY-MM-DD for both bounds, organisation_ids as optional comma-separated club/district ids, and 'omit for all events'. It only misses edge details like inclusivity of the date bounds.
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 specific verb and resource ('List events (competitions/activities) from Eventor') plus the scoping dimension (a date range). Sibling tools operate on clearly different resources (entries, organisations, classes), so an agent can route without ambiguity.
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 clarifies that omitting organisation_ids returns all events in range, which is useful conditional behavior, but it never states when to choose this tool over siblings or any preconditions beyond the generic API key. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_organisationsA
List all organisations (clubs, districts, federations) known to Eventor.
Requires EVENTOR_API_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It does disclose a real operational requirement — 'Requires EVENTOR_API_KEY' — which is useful beyond structured fields, but says nothing about pagination, result size, rate limits, or ordering for a 'list all' call that could return a large collection.
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 zero filler; the resource and its scope are front-loaded ahead of the API-key requirement. Every clause carries 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?
An output schema exists, so return-value documentation is not needed, and the auth requirement plus the definition of 'organisations' covers what an agent needs before calling. The only residual gap is the absence of any hint about result volume or pagination on an unfiltered listing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline a 4 applies. There is no parameter surface for the description to explain, and it correctly does not invent filtering options that the schema does not support.
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 specific verb ('List') and resource ('organisations') and disambiguates the term with the parenthetical '(clubs, districts, federations) known to Eventor'. No sibling overlap exists — none of the event/competitor tools could be confused with it — but it never explicitly differentiates itself from a sibling, which keeps it short of a 5.
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?
Usage is only implied: 'List all' signals an unfiltered enumeration, but there is no statement of when to reach for this versus another tool, no prerequisites beyond the API key, and no note on whether the list can be narrowed. Adequate for a simple read tool but with clear gaps.
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.
8 tool updates
v0.1.0- First observed
get_competitors - First observed
get_entry_changes - First observed
get_event_classes - First observed
get_event_entries - First observed
import_resultlist - First observed
import_startlist - First observed
list_events - First observed
list_organisations
TDQS
Scored across 8 tools
Most tools target distinct resources (events, organisations, classes, imports), and the descriptions clarify scope. However, get_event_entries, get_competitors, and get_entry_changes all concern 'who is participating' and differ mainly by scope (event vs club vs timestamps), which could cause occasional misselection.
All eight tools follow a clean snake_case verb_noun pattern using get_, list_, and import_ prefixes consistently. The convention is predictable and easy to reason about.
Eight tools is well-scoped for an orienteering event data server, with a sensible split between read operations and two publish/import writes. Each tool clearly earns its place.
The surface covers the core lifecycle: listing events/organisations, reading classes, entries, competitors, and publishing start/result lists. Minor gaps exist, such as no single-event detail fetch and no update/delete of entries, but agents can work around these.
Maintenance
Related MCP Connectors
Find concerts, theatre, sport and festivals in Sweden. Authless, read-only MCP.
PredictHQ MCP — wraps the PredictHQ Events API (predicthq.com)
TheSignup MCP server — read and manage signups, participants, webhooks, and analytics.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Related MCP Servers
- AlicenseAqualityDmaintenanceExposes the OpenProject REST API as MCP tools for project management, including creating and managing projects, work packages, relations, attachments, users, notifications, watchers, boards, and reference data.3725 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Nettskjema forms, submissions, invitations, and data export through the MCP protocol.MIT
- 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
- FlicenseAqualityDmaintenanceMCP server to list and get events from Evento's public API using an API key.21-