vsmoddb-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., "@vsmoddb-mcpupload release 1.2.0 for my mod with changelog: fixed crash on load"
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.
vsmoddb-mcp
An MCP server for managing your mods on the Vintage Story ModDB: upload and update releases, edit mod descriptions/metadata and tags, and read or answer comments — from any MCP client (Claude Code/Desktop, OpenCode, Cursor, …).
Install & login
npm install -g vsmoddb-mcp
npm install -g playwright && npx playwright install chromium # browser for the login helper, once
vsmoddb-mcp-login # one manual browser login (reCAPTCHA)Both commands are bins of this one package (vsmoddb-mcp runs the server,
vsmoddb-mcp-login runs the login helper) — there is no separate login package.
The helper also runs straight from the registry, without a global install:
npx playwright install chromium # browser for the login helper, once
npx -p vsmoddb-mcp vsmoddb-mcp-login # one manual browser login (reCAPTCHA)The login must be repeated roughly every two weeks; sessions cannot be renewed
without a human because of the reCAPTCHA. Playwright is an optional dependency:
without it, vsmoddb-mcp-login prints the exact commands to set it up and an
alternative (cookie copy) that needs no browser automation.
From source (for development or vendoring):
git clone https://github.com/LovelessCodes/vsmoddb-mcp.git
cd vsmoddb-mcp
npm install
npm run build
npm run loginThen point your MCP client at dist/index.js (see Client setup).
Related MCP server: civnode-mcp
What it can do
Tool | Purpose |
| Validate the session, report the logged-in account |
| List the mods your account contributes to |
| Public mod metadata, links, stats and releases |
| Description (Markdown/HTML), summary, name, URL alias, links, side, tags |
| The site-wide tag vocabulary (id, name, color) |
| Add existing tags through the edit form; new ones need |
| Publish a new release ( |
| Change a release's changelog / game versions / version |
| Retract a release with a public reason ( |
| Comments on a mod page, with ids |
| Reply to a comment (Markdown → HTML) |
| Edit or delete your comments |
| New comments, mentions, followed-mod releases |
| Clear specific notifications or all of them |
Read tools return JSON. Write tools return a small confirmation object (or an error message that the model can act on, e.g. "Unknown game version(s): 9.9.9").
Login
ModDB's login is protected by reCAPTCHA, so it cannot be automated end-to-end. Log in once; the server then uses the stored session cookie plus the site's action token for every request, refreshing the token automatically.
npm install playwright # only needed for the login helper
npx playwright install chromium # one-time browser download
npm run login # from a checkout; global install: vsmoddb-mcp-loginWithout a global install, run the helper through npx:
npx -p vsmoddb-mcp vsmoddb-mcp-login.
This writes ~/.config/vsmoddb-mcp/session.json (mode 0600) containing the
vs_websessionkey cookie. Sessions last roughly two weeks; when they expire,
every tool returns "Your ModDB session has expired" with the same instructions,
so you just run npm run login again. A server that is already running picks up
the new session file on the next tool call — no client restart needed.
No browser at all? Log in at mods.vintagestory.at in your own browser, copy the
vs_websessionkey cookie value from devtools, and create the file manually:
{ "cookie": "vs_websessionkey=<value>" }Treat that file like a password: the cookie is a full session for your Vintage Story account. Delete it and log out of the site to revoke access.
Client setup
No install needed — run it straight from npm:
{
"mcpServers": {
"vsmoddb": {
"command": "npx",
"args": ["-y", "vsmoddb-mcp"]
}
}
}Or after npm install -g vsmoddb-mcp, use "command": "vsmoddb-mcp" with no
args. From a source checkout, point at the built file with an absolute path:
{
"mcpServers": {
"vsmoddb": {
"command": "node",
"args": ["/absolute/path/to/vsmoddb-mcp/dist/index.js"]
}
}
}Note: the login helper needs the Playwright package and a Chromium build; the
browser binaries are not bundled. Run the helper once from a global install
(vsmoddb-mcp-login), from the registry without installing anything
(npx -p vsmoddb-mcp vsmoddb-mcp-login), or from a source checkout
(npm run login). All of them write the same session file, and an MCP server
that is already running picks it up on the next tool call.
Claude Code / CLI:
claude mcp add vsmoddb -- npx -y vsmoddb-mcpEnvironment variables
Variable | Default | Meaning |
|
| Session file location |
|
| Override for testing against a mock |
|
| Upload size guard (ModDB's default limit) |
How it works
ModDB is a hybrid site, and so is this server:
v2 API for comments (create/edit/delete), release retraction, and notifications. Requests carry the
ataction token scraped from the site; when ModDB rejects it as stale the server re-reads it and retries once.Classic PHP forms for release uploads, mod/release edits and tag changes, because the public API stubs those out (and because ModDB disables its user-tags API with the shipped
DISABLE_USER_TAGSdefault). The server renders the real edit page, serializes the form exactly like a browser, applies only your changes, and POSTs it back. A303redirect means success; a200re-render is parsed for the site's error messages and surfaced as a tool error.
Release uploads are multipart/form-data with a single file field. Game mod
identifiers/versions come from the zip's modinfo.json, so uploads require
game_versions: ["1.22.7", …] and ignore any version you pass.
Notes and limits
Release files are immutable.
upload_releasepublishes immediately and the zip can never be replaced; retraction is the only way back. Bothupload_releaseandretract_releaserequireconfirm: truefor this reason.One file per release (
.zip, or a bare.dll/.csfor non-game categories), 40 MB by default.update_mod'sdescriptionreplaces the entire description — ask the model to fetch the current one first (get_modwithinclude_description).Every
modparameter takes an alias (carrycapacity), a numeric id, or a ModDB URL/path copied from the browser (/show/mod/54807). The public API only knows published mods, so aliases, asset ids and unpublished drafts are resolved through the mod page; drafts work with the editing tools, but have no description/release/stats data until they are published.Comment replies are plain Markdown converted to HTML server-side by this MCP server. There is deliberately no bulk-reply tool: the ModDB rules forbid spamming or bot-like behaviour, so keep replies human-approved and on-topic.
Tags are site-wide, not per-mod:
list_tagsreturns the vocabulary, andadd_mod_tags(like the site's own edit page) refuses names that do not exist yet unless you passcreate_missing: true— otherwise a typo would silently invent a new public tag. Creating tags goes through ModDB's user-tags API, which the site currently disables (HTTP 503), so today only existing tags can actually be applied.Non-game-mod versions must match
n.n.n(optionally-rc.n/-pre.n/-dev.n).You need to be a team member with edit rights for anything you modify; other users' mods return a clear "no edit permission" error.
Development
npm run build # tsc
npm run typecheck # tsc --noEmit
npm run smoke # offline end-to-end test (no credentials, no network)npm run smoke starts a mock ModDB (all routes the tools touch), points the
real MCP server at it via VSMODDB_BASE_URL, drives all 14 tools over stdio
with the MCP SDK client, and asserts the wire format — exact Content-Type: text/html for comment bodies, multipart fields for uploads, action-token
refresh on 403 Invalid action token, and session-expiry handling (102 checks).
Releasing
npm publish runs prepublishOnly, which builds and runs the smoke test, so a
broken commit cannot be published by accident.
npm version patch # or minor / major: bumps package.json and tags the commit
npm publish
git push --follow-tagsAvailable Tools
15 toolsadd_mod_tagsAdd tags to a modA
Add tags to a mod. Existing tags are applied through the mod edit form (the path the site's own UI uses), and only names from list_tags are accepted unless create_missing: true is passed. Tags are site-wide: brand-new ones can only be created through ModDB's user-tags API, which the site currently disables (HTTP 503).
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| tags | Yes | Tag names to add | |
| create_missing | No | Also try to create tags that do not exist on ModDB yet (site-wide, visible to every user) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries the real burden and delivers: it discloses that tags are site-wide, that brand-new tags require ModDB's user-tags API which is currently disabled (HTTP 503), and that create_missing may therefore fail. That is concrete failure-mode and blast-radius information an agent cannot get from 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?
Three tightly packed sentences with no filler, and the constraint on tag names is front-loaded before the create_missing caveat. The opening clause largely restates the title, which is the only minor waste.
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 mutation tool with only a readOnlyHint annotation and no output schema, the description supplies the preconditions, visibility semantics, and known failure mode. What it omits is what a successful call returns or whether partial failures are reported, but that gap is minor given no output schema exists.
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, but the description adds real meaning beyond it: it explains the accepted domain for 'tags' (only names from list_tags) and the practical consequence of create_missing (site-wide creation attempts that currently fail).
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 ('Add tags to a mod') and distinguishes itself from the tag-reading sibling by naming list_tags as the source of valid names. An agent can tell it apart from update_mod and list_tags without opening any schema.
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?
Makes the precondition explicit: tag names must come from list_tags unless create_missing: true is passed, which effectively routes the agent to call list_tags first. It also explains that existing tags are applied via the mod edit form path the site UI uses. It does not state when to avoid this tool versus update_mod, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_commentDelete a ModDB commentADestructive
Delete one of your own comments (irreversible; requires confirm: true).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true to delete; a guard against accidental deletions | |
| comment_id | Yes | Id of the comment to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is partly covered. The description still adds real value beyond them: irreversibility and the confirm guard, plus the permission boundary that only your own comments can be deleted.
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?
One sentence with a parenthetical carrying the two critical facts (irreversible, confirm: true). No wasted words, and the destructive warning is front-loaded.
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 destructive tool with full schema coverage, annotations covering the safety profile, and no output schema, nothing an agent needs in order 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 description coverage is 100%, with both 'comment_id' and 'confirm' fully documented in the schema. The description restates the confirm requirement but adds no new syntax, format, or constraint detail, so the baseline 3 applies.
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 ('Delete ... comment') and adds an ownership scope ('one of your own comments') that separates it from edit_comment and reply_to_comment. It is clear and actionable, though it never names a sibling alternative explicitly, which is what a 5 would require.
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 concrete usage condition — 'requires confirm: true' — and flags irreversibility, so the agent knows the preconditions before calling. It does not say when to prefer edit_comment over deleting, but for a terminal destructive action the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_commentEdit a ModDB commentA
Edit one of your own comments (or any comment if you are a moderator). The text is Markdown and replaces the current content entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | New comment content in Markdown (replaces the old content) | |
| comment_id | Yes | Id of the comment to edit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description must carry the behavioral load. It does disclose the key trait: the text replaces existing content entirely, and it flags the permission model (own comment vs moderator). It doesn't address reversibility or failure modes, but the destructive-replacement semantics are the critical detail.
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 tightly written sentences with zero filler; the ownership/permission constraint and the replace-entirely semantics are both front-loaded.
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 mutation with no output schema, the description covers the essentials: who may edit and what editing does to existing content. Return-value behavior is unspecified, but little else 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 description coverage is 100%, so both parameters are already documented, and the description's note that text is Markdown/replaces content largely mirrors the schema wording. Baseline 3 applies since the schema does the heavy lifting.
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 (edit) and resource (comment) plus an ownership scope ('one of your own comments'), which separates it from reply_to_comment and list_comments. It stops short of naming a sibling directly, so an agent must infer the boundary.
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 authorization precondition: use it on your own comments, or on any comment if you are a moderator. It doesn't explicitly contrast with reply_to_comment ('add new' vs 'modify existing'), so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_modGet ModDB mod infoARead-only
Fetch a mod's public ModDB metadata: ids, tags, links, stats and the release list (with release ids and compatible game versions). Accepts mod name, numeric id, or URL alias.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| release_limit | No | How many (newest) releases to list | |
| include_changelogs | No | Include each release's changelog as plain text | |
| include_description | No | Include the full description as plain text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read, so the bar is lower. The description usefully adds that the data is public and what the response contains, but says nothing about rate limits, not-found behavior, or how release pagination interacts with the limit.
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 tight sentences, the resource and payload front-loaded, and the accepted identifier forms last. No filler or repetition of the title.
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?
There is no output schema, so the description correctly takes on the job of describing return contents (ids, tags, links, stats, releases with versions). It is nearly sufficient for a read tool with full schema coverage and a readOnly annotation, though error/empty-result behavior is unaddressed.
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 all four parameters are already documented in the schema with examples ('carrycapacity', '5894', '/show/mod/54807'). The description's 'name, numeric id, or URL alias' merely echoes that, adding no new format or constraint detail; baseline 3 applies.
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 gives a specific verb ('Fetch') and resource ('a mod's public ModDB metadata') and enumerates the returned payload (ids, tags, links, stats, release list). That is far more informative than a restated title, though it never names a sibling such as list_my_mods or update_mod to sharpen the boundary.
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: an agent can infer this is the lookup tool for a single mod, but there is no explicit when-to-use, when-not-to-use, or alternative (e.g. list_my_mods for the caller's own mods). The identifier-flexibility sentence is parameter help, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsList ModDB commentsARead-only
List comments on a mod's ModDB page, newest first. Accepts a mod name, numeric id, or URL alias. Returns comment ids for reply_to_comment, edit_comment and delete_comment.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| limit | No | Maximum number of comments to return (newest first) | |
| include_deleted | No | Include comments that were hidden/deleted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description usefully adds the sort order and the shape of the returned identifiers, but says nothing about pagination beyond the schema's limit, rate limits, or how deleted/hidden comments are treated by default. Adequate but not rich.
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 compact sentences, zero filler, with the core action and ordering front-loaded ahead of the identifier formats and return-value note.
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?
With no output schema, the description compensates by stating that comment ids are returned and what they feed into. Minor gaps remain around pagination behavior and how to page past the limit, but nothing essential to invoking the tool 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 description coverage is 100%, so the schema already explains the accepted mod identifier forms (alias, numeric id, URL) and the limit/include_deleted semantics. The description restates the identifier forms without adding syntax or edge-case detail, so the baseline 3 applies.
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 comments on a mod's ModDB page') plus ordering ('newest first'). It is clearly distinguishable from the reply_to_comment, edit_comment and delete_comment siblings, which mutate the same resource.
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?
Names the downstream tools that consume the returned comment ids (reply_to_comment, edit_comment, delete_comment), which implicitly defines the workflow context for calling this tool. It does not state when *not* to use it or name an alternative listing tool, 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.
list_my_modsList my ModDB modsARead-only
List the mods the logged-in account contributes to (the 'Your mod contributions' section of mods.vintagestory.at/home). Use the returned names/paths with get_mod, upload_release, update_mod, etc.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read, and the description is consistent with it. It adds the useful scoping fact that results are limited to the logged-in account's contributions. However, it says nothing about result size, ordering, or pagination behavior for accounts with many mods.
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 first establishes what the tool returns, the second tells the agent what to do with the output. Scope is front-loaded before the chaining advice.
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?
With no parameters and no output schema, the description carries the burden of explaining the result shape, and it partially does so by naming 'names/paths' as the useful fields. For a simple zero-arg list tool this is close to sufficient, though a note on whether all contributions are returned at once would close the gap.
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 there is no parameter semantics to convey; the baseline for a 0-param tool is 4. The description's mention of 'names/paths' describes return values rather than inputs, leaving this dimension essentially neutral.
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 the mods the logged-in account contributes to') and anchors it to a concrete UI location on mods.vintagestory.at/home, which removes ambiguity about scope. It is clearly distinguishable from siblings like get_mod (single mod fetch) and list_tags (different resource).
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 explicit downstream chaining guidance: use the returned names/paths with get_mod, upload_release, update_mod, etc. This tells the agent when this tool is the right first step in a workflow. It stops short of stating when NOT to use it or what to do if the account has no contributions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notificationsList ModDB notificationsARead-only
List the logged-in account's ModDB notifications (new comments, mentions, releases of followed mods, ...). Comment notifications are the quickest way to find comments awaiting a reply on your mods.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds useful context beyond that: it is scoped to the logged-in account's own notifications and the payload consists of notification events (comments, mentions, releases). It says nothing about pagination, ordering, volume limits, or whether unread state is returned, which matters for a notifications feed.
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, no filler, front-loaded with the scope and resource, then a single practical hint. 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 no-param, read-only list tool with no output schema, the description covers identity scope and the shape of the results, which is what an agent needs to select and call it. It stops short of describing pagination or result ordering, a minor gap for a feed-style endpoint.
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 there is nothing for the description to disambiguate. Baseline 4 applies; the description's mention of the account scope is the only relevant semantic note.
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?
Specific verb (List) plus resource (ModDB notifications) scoped to the logged-in account, with the notification kinds enumerated (comments, mentions, releases of followed mods). This lets an agent separate it from siblings like list_comments or list_my_mods without opening any schema.
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 second sentence implies a workflow ('quickest way to find comments awaiting a reply on your mods'), which nudges the agent toward this tool over list_comments for that task. However, it never explicitly states when to use this versus mark_notifications_read or when not to use it, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList ModDB tagsARead-only
List the site-wide tag vocabulary every mod can carry (id, name, color). Check this before add_mod_tags: only these names exist on ModDB, and anything else has to be created deliberately.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuine context: the vocabulary is site-wide, only these names exist, and unknown names must be created deliberately. That tells the agent how this tool constrains a subsequent write call, though it omits anything about pagination or caching.
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 tight sentences: the first defines what is returned, the second tells the agent why and when to call it. No filler, and the routing hint to add_mod_tags is placed where it matters.
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?
No output schema exists, but the description compensates by naming the returned fields (id, name, color) and the scope (site-wide). For a zero-parameter, read-only list tool this is complete.
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 the schema baseline of 4 applies and there is nothing further the description could add about argument semantics.
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 the site-wide tag vocabulary') and even enumerates the returned fields (id, name, color). It is clearly distinguishable from the sibling mutation tool add_mod_tags, which it names 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?
Gives a concrete when-to-use instruction ('Check this before add_mod_tags') and explains the constraint that makes it necessary — only existing names are valid. It stops short of stating when-not to use it, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_notifications_readMark ModDB notifications as readA
Mark specific notifications (ids) or all notifications (all: true) as read.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Mark every unread notification as read | |
| ids | No | Notification ids from list_notifications |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already tells the agent this is a mutation, so the bar is lower. The description adds the dual-mode behavior, but does not disclose whether marking is idempotent, reversible, what happens to already-read ids, or what occurs if both parameters are supplied.
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 with zero waste that front-loads the verb and names both modes compactly. Nothing is padded.
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 mutation tool with no output schema and only a readOnlyHint annotation, the description covers the what but not the operational edges (param precedence when both are set, error behavior for unknown ids, confirmation of affected count). It is minimally complete rather than fully informative.
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 both parameters are already documented in the schema (including 'ids from list_notifications'). The description merely restates the same two modes in prose, adding no syntax, format, or precedence information 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 ('mark ... as read') and resource ('notifications') and spells out the two operating modes, ids vs all. It is naturally distinguishable from the sibling list_notifications, though it never names that 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?
Usage is implied by the tool name and description ('mark as read'), and the two modes are stated, but there is no guidance on when to prefer this over list_notifications, whether ids must be unread/owned, or any exclusions. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moddb_statusModDB session statusARead-only
Validate the configured Vintage Story ModDB session, refresh the action token, and report the logged-in account. Run this first when other tools complain about an invalid session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description declares a state-changing operation ('refresh the action token'), while the annotation asserts readOnlyHint=true, i.e. no environment modification. That is a direct conflict between the text and the structured safety hint, and the description offers no reconciliation (e.g. whether the refresh is persisted locally/server-side). Per the rubric this is an annotation contradiction.
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, both front-loaded with the highest-value information: what it does first, the operational cue second. No filler, no restatement of the tool name.
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?
With no parameters and no output schema, the definition is nearly complete: it tells the agent what is checked, what is refreshed, and what is reported. It stops short of saying what happens on an invalid session (error vs. status payload) or what else the status report contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies the session is taken from configuration rather than arguments ('the configured ... session'), which is the only parameter-relevant fact.
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?
Specific verbs (validate, refresh, report) plus a specific resource (the configured Vintage Story ModDB session) and a concrete output (the logged-in account). Nothing here overlaps with the sibling CRUD tools like get_mod or update_release, so an agent can identify it instantly.
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 an explicit trigger condition: 'Run this first when other tools complain about an invalid session' — a real when-to-use rule tied to a failure mode. It does not name a when-not case or a specific alternative tool, so it falls 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.
reply_to_commentReply to a ModDB commentA
Post a reply to a comment on a mod's ModDB page. The text is Markdown (converted to HTML). Use only user-approved wording; the ModDB rules prohibit bot-like/spammy commenting.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| text | Yes | Reply content in Markdown | |
| comment_id | Yes | Id of the comment to reply to (from list_comments) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only readOnlyHint=false, so the description does real work: it discloses that the text is Markdown converted to HTML and that content must be user-approved due to ModDB anti-spam rules. It stops short of stating auth requirements or whether the reply posts immediately or awaits moderation.
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 tight sentences with no padding; the operation is front-loaded and the content constraint follows immediately.
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 low-complexity write tool with 100% schema coverage and no output schema, the description covers purpose, input format, and content policy. It omits only return/confirmation behavior and permission requirements, which is a minor gap.
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 schema already documents mod identifier formats, comment_id provenance ('from list_comments'), and Markdown text. The description only restates the Markdown aspect, adding no further parameter meaning beyond the schema baseline.
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 ('Post a reply to a comment on a mod's ModDB page'), which naturally separates it from siblings edit_comment and delete_comment. An agent can identify the operation without opening the schema.
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 policy constraint ('Use only user-approved wording') is useful guidance on acceptable content, but there is no when-to-use/when-not-to-use routing, e.g. pointing to edit_comment for revising an existing reply or noting prerequisites. Usage is only implied by the tool's name and purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retract_releaseRetract a ModDB releaseADestructive
Retract (mark as broken/withdrawn) a release with a reason. The release stays visible with a retraction notice and can no longer be edited. Requires confirm: true.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| reason | Yes | Public reason for the retraction | |
| confirm | No | Must be true; retraction cannot be undone by authors | |
| release_id | Yes | Release id (see get_mod) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing the actual consequence: the release stays visible with a retraction notice, becomes non-editable, and cannot be undone by authors. It also surfaces the confirm:true guard, which is critical for a destructive mutation.
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 compact sentences, front-loaded with the action and its effect; every clause (visibility, edit lock, confirm guard) carries distinct 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?
No output schema exists, but the description covers the essential outcome and irreversibility. Minor omissions remain, such as what a successful call returns and whether the retraction is reversible by moderators (it only says 'by authors').
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 all four parameters are already documented in the schema, including the confirm default and the mod identifier formats. The description reinforces reason and confirm but adds no syntax or format detail 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?
States a precise verb (retract) plus resource (release) and clarifies the semantic with 'mark as broken/withdrawn', which no sibling tool (update_release, delete_comment, etc.) covers. An agent can distinguish it from update_release without opening either schema.
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 strong selection condition: irreversible, requires confirm:true, release becomes uneditable. It doesn't explicitly name an alternative (e.g. 'use update_release to change metadata instead'), so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_modUpdate ModDB mod description/metadataA
Update a mod's ModDB page: description, summary, name, URL alias, links, side, and tags. Only the provided fields are changed; everything else (including team members, images, status) is preserved. 'description' REPLACES the whole description, so provide the full new text in Markdown. 'tags' replaces the full tag list; use add_tags/remove_tags for incremental changes.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| name | No | New mod name | |
| side | No | Mod side: 'client', 'server' or 'both' | |
| tags | No | Full replacement list of tag names | |
| summary | No | New short summary (max 100 chars) | |
| add_tags | No | Tag names to add (applied before remove_tags) | |
| wiki_url | No | Wiki URL | |
| url_alias | No | New URL alias (letters only) | |
| donate_url | No | Donation URL | |
| description | No | Full new description in Markdown (replaces the current description) | |
| remove_tags | No | Tag names to remove | |
| homepage_url | No | Homepage/forum post URL | |
| source_code_url | No | Source code URL | |
| description_html | No | Full new description as raw HTML (takes precedence over 'description') | |
| issue_tracker_url | No | Issue tracker URL | |
| trailer_video_url | No | Trailer video URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden and it delivers: 'description' fully replaces existing text and 'tags' replaces the whole list, plus a guarantee that unlisted fields (team members, images, status) are preserved. Missing auth/permission or reversibility notes keeps it short of 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?
Three sentences, no filler, front-loaded with the scope then the mutation semantics then the replacement caveats. Each sentence earns its place by preventing a distinct class of mistake.
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 16-parameter mutation tool with no output schema and only a minimal readOnly annotation, the description covers the destructive replace behavior that matters most. It omits error/validation behavior (e.g. url_alias letters-only) and permission requirements, leaving a small gap.
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, but the description adds genuinely non-obvious meaning by clarifying replace-vs-append semantics for 'description' and 'tags' and the Markdown format. It does not resolve the description_html precedence or the add/remove ordering beyond what the schema already states.
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 ('Update') and resource ('a mod's ModDB page') and enumerates the mutable fields (description, summary, name, URL alias, links, side, tags). The scope clearly separates it from release-oriented siblings like update_release and add_mod_tags.
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?
Explains the key selection condition: use field parameters for full replacement versus add_tags/remove_tags for incremental tag changes. It does not explicitly contrast against sibling tools like add_mod_tags or get_mod, so the routing guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_releaseUpdate a ModDB releaseA
Update an existing release's changelog, compatible game versions, or (non-game mods only) version. The uploaded file itself can never be replaced. Provide at least one of changelog / game_versions / version.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| version | No | New version (only allowed for non-game-mod categories; game mod versions come from the zip) | |
| changelog | No | New changelog in Markdown (replaces the old changelog) | |
| release_id | Yes | Release id (see get_mod) | |
| game_versions | No | Full replacement list of compatible game versions (game mods only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden. It adds genuinely useful behavior beyond the schema: the uploaded file can never be replaced, and version edits are restricted to non-game categories. It lacks auth/permission requirements and error behavior, so not 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?
Two sentences, zero filler, with the mutable-field scope front-loaded ahead of the short cross-field constraint. Nothing is padded or repeated.
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 5-parameter mutation tool with no output schema, the description covers the important semantics: what can change, what cannot (the file), and the minimum input requirement. Missing only permission/prerequisite and failure-mode guidance, which is a minor gap.
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 restates the 'at least one of' constraint (not enforced by the schema) and the non-game limitation on version, adding marginal value but no syntax or format details 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?
States a specific verb (Update) and resource (release) and enumerates exactly which fields are mutable: changelog, game_versions, and version. The parenthetical 'non-game mods only' qualification and the immutability of the uploaded file implicitly separate it from upload_release and retract_release.
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 concrete invocation rule — 'Provide at least one of changelog / game_versions / version' — which tells the agent when the call is valid. It does not name sibling alternatives (e.g. use upload_release to change the file) or state exclusions, so it falls 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.
upload_releaseUpload a ModDB releaseADestructive
Upload and publish a new release (zip in, one release out). For game mods the identifier/version are auto-detected from the zip's modinfo.json, and game_versions must be provided. The uploaded file cannot be replaced afterwards, so verify the build first. Requires confirm: true.
| Name | Required | Description | Default |
|---|---|---|---|
| mod | Yes | Mod identifier: alias/name, numeric id, or ModDB URL/path (e.g. 'carrycapacity', '5894', '/show/mod/54807') | |
| confirm | No | Must be true; guards against accidental publication | |
| version | No | Release version (e.g. 1.2.0). Required for non-game-mod categories; ignored for game mods (taken from the zip) | |
| changelog | No | Changelog text in Markdown (optional but recommended) | |
| file_path | Yes | Absolute path to the .zip (or .dll/.cs) to upload, on the machine running this server | |
| game_versions | No | Compatible game versions, e.g. ["1.22.7", "1.22.6"] (required for game mods) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, destructive operation; the description adds the crucial consequences the annotations cannot convey: the uploaded file is irreversible ('cannot be replaced afterwards'), a confirm:true guard is mandatory, and identifier/version may be silently overridden by auto-detection from the zip. That is exactly the extra context a mutation tool needs.
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?
Three tight sentences, zero filler, and the operation's shape is front-loaded before the constraints and the irreversibility warning. Every sentence carries a distinct piece of decision-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 no-output-schema mutation tool this covers nearly everything an agent needs: irreversibility, the confirm gate, the file location constraint ('on the machine running this server'), and per-category parameter rules. The only unaddressed area is authentication/precondition expectations, which is a minor gap given the annotations already flag destructiveness.
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, and the description adds cross-parameter conditional logic the schema does not state: version is required only for non-game-mod categories and ignored for game mods, and game_versions is required for game mods. It reinforces rather than merely restates the confirm requirement.
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?
Specific verb+resource ('upload and publish a new release') with the scope parenthetically clarified as 'zip in, one release out'. The word 'new' implicitly separates it from update_release and retract_release among siblings, so an agent can route correctly without opening other schemas.
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 clear conditional context: game mods auto-detect identifier/version from modinfo.json and require game_versions, non-game-mod categories require an explicit version, and the build should be verified first. It stops short of naming when to prefer update_release/retract_release instead, so it is strong context rather than full when/when-not 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.
15 tool updates
v0.1.1- First observed
add_mod_tags - First observed
delete_comment - First observed
edit_comment - First observed
get_mod - First observed
list_comments - First observed
list_my_mods - First observed
list_notifications - First observed
list_tags - First observed
mark_notifications_read - First observed
moddb_status - First observed
reply_to_comment - First observed
retract_release - First observed
update_mod - First observed
update_release - First observed
upload_release
TDQS
Scored across 15 tools
Each tool targets a clearly distinct resource or action: session status, mod listing/retrieval/update, tags, releases, comments, and notifications. Potential overlaps like update_mod replacing tags versus add_mod_tags for incremental changes are explicitly clarified in the descriptions. An agent can reliably select the correct tool.
All tools use snake_case, and the vast majority follow a verb_noun or verb_noun_modifier pattern (list_my_mods, update_release, mark_notifications_read). Minor deviations like moddb_status (noun-first) and reply_to_comment (prepositional) are still readable and predictable.
15 tools sits at the upper end of the ideal 3-15 range, and every tool earns its place across authentication, mod management, tags, releases, comments, and notifications. There are no redundant or trivial tools.
Core lifecycle coverage is strong: mods (list/get/update), releases (upload/update/retract), comments (list/reply/edit/delete), notifications (list/mark read), and tags (list/add). Missing create_mod and a dedicated remove_mod_tags tool, and top-level comment creation is not clearly supported, but agents can work around most of these gaps.
Maintenance
Related MCP Connectors
Create, update, and publish changelog entries on your Patchlog changelog from any MCP client.
Manage feature requests, votes, roadmaps, and changelogs from any MCP client.
Registry of MCP servers, agent skills and plugins: search, filter, comments, likes, publish.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Discord using personal user tokens instead of bot applications, allowing for seamless message management and server exploration. It provides tools for reading history, sending messages, and searching across channels and DMs directly through MCP-compatible clients.10MIT
- FlicenseNot gradedqualityNot gradedmaintenanceAn MCP server for the CivNode 'slow web' social platform that enables interaction with monuments, forums, and creative writing. It allows users to manage their profiles, send private or anonymous messages, and engage with the community's unique social features.-
- AlicenseNot gradedqualityCmaintenanceMCP server that allows posting, deleting, and reading X (Twitter) tweets using your own browser session cookie, bypassing the official paid API. Includes tools for auth setup, tweet creation, deletion, timeline reading, and regex search.341 PyPI13MIT
- FlicenseNot gradedqualityCmaintenanceEnables managing quest-log ideas, statuses, and mission log directly from MCP clients, allowing project tracking and updates without going through git/GitHub.-