Skip to main content
Glama

Server Details

Modded Minecraft: which mod crashed, where to get a mod for your version, which mods work together.

Ownership verified
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct question: search_mods resolves ids, get_mod_info describes a mod, get_mod_runs shows lab history, find_mod_download locates a build, check_mod_pair/check_mod_list handle compatibility, and diagnose_crash uniquely reads logs. The descriptions explicitly cross-reference each other and state when to prefer one over another, leaving no real overlap.

Naming Consistency5/5

All seven names use consistent snake_case with a clear verb_noun shape (check_mod_pair, get_mod_info, find_mod_download, search_mods, diagnose_crash). The pattern is predictable and readable throughout.

Tool Count5/5

Seven tools is well-scoped for a mod-compatibility and crash-diagnosis service, and each tool covers a distinct capability without redundancy. Nothing feels padded or missing at the count level.

Completeness4/5

The surface covers the full workflow: name resolution, mod metadata, lab run history, pairwise and batch compatibility, download resolution, and crash diagnosis. Minor gaps exist (e.g. no dedicated per-version compatibility summary or bulk download resolution), but agents can work around them via existing tools.

Available Tools

7 tools
check_mod_listDo these mods work togetherA
Read-onlyIdempotent
Inspect

A whole mod list or modpack checked against the Modkeel lab at once: every pair in it that clashed, the mods whose jar crashed, the pairs that ran together, and the mods the lab has no data on. Use it for "will these mods work together?" or before updating a pack; for two mods, check_mod_pair is enough. Takes up to 300 mod ids (from names, search_mods first; unknown ids just land in untested_mods). With mc, only runs on that version count, and each crashed mod also gets the author's current build for it, since the crash is about the exact file the lab ran. verdict is problems_found when anything clashed or crashed, else no_known_problem, which is not a guarantee: pairs.tested out of pairs.total says how much of the list the lab covered.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcNoMinecraft version to narrow the answer to, e.g. 1.21.1, 1.20.1 or 26.2. Omit it to get every version the lab ran; with it, only runs on exactly that version count.
mod_idsYesLowercase mod ids as the loader knows them, e.g. ["sodium", "iris", "create"]. The ids of a mods folder's jars work.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcNo
dataYesSnapshot date and license of the lab data; attribute when quoting.
modsYesDistinct ids checked.
pairsYes
clashesYesPairs in the list that clashed in a lab run.
crashedYesMods whose jar crashed in a lab run: that exact file (runs[].file).
verdictYes
next_stepNoWith mc and crashed mods: what to install or leave out, for the player.
ran_togetherNoPairs in the list seen working together.
untested_modsYesNo lab data: unknown, not broken.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this read-only, idempotent and non-destructive, so the safety profile is covered; the description goes further with the 300-id cap, the exact-version semantics of mc, the fact that crashed mods return the author's current build, and the verdict/coverage caveat (pairs.tested out of pairs.total, no_known_problem is not a guarantee). That is meaningful behavioral context beyond 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the sibling routing, then dense supporting detail; nothing is clearly filler. It is packed close to the limit, running several ideas together per sentence, which costs a bit of scanability but not substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers invocation limits, id sourcing, version scoping, output bucket names, verdict semantics and the coverage caveat, which is everything needed to call and interpret this tool; since an output schema exists, no further return-value documentation is owed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning: mod_ids are lowercase loader ids derived from mod names or jar filenames, and unrecognized ids degrade gracefully into untested_mods rather than erroring. The mc parameter's narrowing semantics are also restated usefully, though partly duplicating the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (check a whole mod list/modpack against the Modkeel lab) and enumerates the four result buckets: clashed pairs, crashed jars, pairs that ran together, and untested mods. It explicitly distinguishes itself from the sibling check_mod_pair, so an agent can route 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers ("will these mods work together?", before updating a pack) and a named alternative with the condition that selects it ("for two mods, check_mod_pair is enough"). It also prescribes a prerequisite workflow: resolve names via search_mods first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_mod_pairDo two mods work togetherA
Read-onlyIdempotent
Inspect

Whether two Minecraft mods ran together in the Modkeel lab, clashed, or were never tested together. Use it for "can I use X with Y?" or to check two suspects from diagnose_crash; for one mod's whole record, use get_mod_runs. Takes two mod ids in any order (from names, call search_mods first). Unknown ids are not an error: the verdict is untested, meaning no lab run, never a known conflict. With mc, only runs on that version count. clash wins if any run clashed. Returns the verdict and the runs behind it.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcNoMinecraft version to narrow the answer to, e.g. 1.21.1, 1.20.1 or 26.2. Omit it to get every version the lab ran; with it, only runs on exactly that version count.
mod_aYesFirst mod. Lowercase mod id as the loader knows it (the Modrinth/Fabric/NeoForge id, e.g. sodium, create, entityculling), not the display name. Unsure of the id? Call search_mods first.
mod_bYesSecond mod, same format, e.g. iris.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcNo
dataYesSnapshot date and license of the lab data; attribute when quoting.
modsYes
runsYesThe runs behind the verdict; env: server, client or clash.
verdictYesuntested: no lab run, not a known conflict.

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real behavioral context: unknown ids are not an error but yield an 'untested' verdict, mc narrows to exact-version runs, and clash takes precedence if any run clashed. However it does not describe the shape or size of the returned run list, so this is solid supplemental context rather than exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the outcome definition, then prerequisites, semantics, and precedence rules, closing with the return summary. Sentences are dense but each carries distinct information; no repetition of annotation or schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the outcome vocabulary, the untested/unknown-id edge case, the version-narrowing parameter, ordering insensitivity, and precedence of clash, with an output schema handling return details. Nothing an agent needs to invoke or interpret this correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameter formats are already documented. The description nevertheless adds non-obvious semantics beyond the schema: the two ids are interchangeable ("any order"), ids may come from names via search_mods, and mc restricts to exactly one version. That exceeds the baseline for a fully covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb-and-resource pair (compare whether two mods ran together) and enumerates the possible outcomes: worked together, clashed, or never tested. It also names the sibling it is not (get_mod_runs) for the one-mod case, so an agent can route between them without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggering scenarios ("can I use X with Y?", or two suspects from diagnose_crash) plus an explicit alternative (get_mod_runs for one mod's whole record) and a prerequisite (call search_mods first if unsure of ids). When-to-use, when-not, and alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_crashWhich mod crashed MinecraftA
Read-onlyIdempotent
Inspect

Find the mod most likely behind a modded Minecraft crash (Fabric, NeoForge, Forge). Use it whenever the user shares a crash report or latest.log or says the game will not start. It is the only tool that reads logs, and it adds what the file does not hold: it checks every installed mod against the Modkeel lab (pairs in the pack that clashed, jars that crashed on that Minecraft version), says how many other players hit the same crash and which fix worked for them (when 10+ did), counts lab runs of each suspect, and ranks suspects by evidence (mixin, trace, missing class) with a confidence level (NONE when nothing points at a mod). It also returns a fix guide and, when the log names the Minecraft version and loader, the build to install for the suspect and for every installed mod the lab saw crash on that version, so no follow-up call is needed. Pass the whole file as text, unedited: trimming it loses the mod list; or, when the user gave a link to a paste (mclo.gs, pastebin.com, paste.ee, gist.github.com, modkeel.com), pass url instead and Modkeel fetches it. Text with no crash in it comes back as an error to fix and retry. Up to 4 MB; read and dropped, never stored.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoA link to the crash report or log on a paste site (mclo.gs, pastebin.com, paste.ee, gist.github.com, modkeel.com), e.g. https://mclo.gs/abc123. Modkeel downloads the raw text itself. Give text or url.
textNoThe full crash report (crash-reports/crash-*.txt, from '---- Minecraft Crash Report ----') or logs/latest.log, unedited. Up to 4 MB. Give text or url.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcNo
kindYes
packNoThe installed mods checked against the lab, beyond this crash.
errorNoThe root exception and its message.
guideYesHow to fix this kind of crash.
loaderNo
sourceYes
in_gameNoThe same diagnosis inside the game, for players who crash often.
playersNoWhat other players' reports of this same crash say (Modkeel Companion reports, monthly snapshot); null below 10 players.
replaceNoThe build to install for the first suspect, then for every installed mod whose jar crashed in the lab on this version (the next crash), as find_mod_download gives it; null when the version or loader is unknown or Modrinth is down.
suspectsYesMost likely first; empty when no mod is implicated.
next_stepNoWhat to replace and with what, one sentence per mod; tell the user all of it. Null when the version or loader is unknown.
signatureNoStable id of this crash shape.
confidenceYesHow sure the first suspect is the cause.
descriptionNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive, open-world), and the description adds substantial context beyond them: cross-checking against the Modkeel lab, the 10+ player threshold for fix reporting, a NONE confidence fallback, an error on logs containing no crash, a 4 MB cap, and 'read and dropped, never stored.' That is a rich disclosure of behavior, limits, and data handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and trigger, and nearly every clause carries operational information. It is a dense single paragraph that runs long, but the length is justified by the tool's complexity rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description covers inputs, the text/url choice, size limits, error behavior, privacy, and the shape of the ranking output. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters and the paste-site list. The description still adds real meaning the schema lacks: 'Pass the whole file as text, unedited: trimming it loses the mod list,' which tells the agent why fidelity matters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and outcome ('Find the mod most likely behind a modded Minecraft crash') and names the supported loaders. It also separates itself from siblings with 'It is the only tool that reads logs,' so an agent can tell it apart from check_mod_list, check_mod_pair, and get_mod_runs without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger conditions ('whenever the user shares a crash report or latest.log or says the game will not start') and effectively excludes alternatives by declaring itself the only log-reading tool. The url-vs-text branch is spelled out with the exact paste sites that select the url path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_mod_downloadWhere to download a mod for a Minecraft versionA
Read-onlyIdempotent
Inspect

The exact file to install for one mod on one Minecraft version and loader, with its download link. Use it for "where do I get X for 26.2 Fabric?", after diagnose_crash names a mod that needs another build, or when updating a pack to a new version. Checks, best first: the author's own build on Modrinth (status official: file, required mods, and lab runs of that exact file), a community port the Modkeel lab verified in one of its modpacks (port), the author's file for an earlier version that the lab ran on this one and saw start (older_build), a port the lab built from its public source and saw start but does not host (build_from_source: the repo, branch and how to build it), the loaders the author does build for that version (other_loader), else none; when that older file crashed in the lab instead, older_build says so and next_step warns against it. next_step says what the user can do in each case. For what the mod is, use get_mod_info; for whether it ran in the lab, get_mod_runs. Takes the mod's name as the user wrote it ("YUNG's Better Mineshafts"), a lab mod id or a Modrinth slug: no search_mods call needed first. Asks Modrinth live (two to five calls, nothing cached), so it can fail when Modrinth is down: retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcYesMinecraft version to install on, exactly, e.g. 1.21.1 or 26.2.
loaderYesMod loader of the instance: fabric, neoforge, forge or quilt.
mod_idYesThe mod's name as the user wrote it (e.g. Entity Culling), a lab mod id (e.g. sodium, fabric_api) or a Modrinth slug (e.g. fabric-api).

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcYes
modYes
dataYesSnapshot date and license of the lab data; attribute when quoting.
portsYesPorts verified by the lab; only when there is no official build.
loaderYes
statusYes
projectNoThe mod's Modrinth project; null when none matches.
officialYesThe author's build for this version and loader (a release when any).
next_stepYesWhat the user can do now, one sentence.
older_buildNoThe author's file for an earlier version, as the Modkeel lab ran it on this one (only when there is no official build or port): ran (started on env) or crashed (detail says how).
source_buildNoA port the Modkeel lab built from this GitHub repo and branch and saw start on env; Modkeel does not host its jar, so the player builds it (next_step says how). Only when nothing published fits.
other_loadersNoLoaders the author builds this version for.
declared_versionsNoNewest Minecraft releases the author lists.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, but the description adds substantial behavior beyond them: live Modrinth calls (2-5, nothing cached), failure/retry guidance when Modrinth is down, and the full ranked resolution order (official, port, older_build, build_from_source, other_loader, none) with what each status means and how next_step warns on harmful older builds.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core purpose and the resolution ordering, and every sentence carries routing or behavior information rather than filler. The single dense paragraph is on the long side, but the length is justified by the multi-branch resolution logic it must convey.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return fields, yet it still explains the status values and next_step semantics the agent will see. For an openWorld, live-calling tool with 3 required params, nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds usable context by restating that mod_id accepts a user-typed name, lab mod id, or Modrinth slug and, crucially, that no search_mods call is needed first. It adds little on mc/loader beyond the enum already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource+scope: it returns the exact file to install for one mod on one Minecraft version and loader, plus the download link. It explicitly differentiates from siblings by naming get_mod_info (what the mod is) and get_mod_runs (whether it ran in the lab), so an agent can route without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states concrete when-to-use triggers ("where do I get X for 26.2 Fabric?", after diagnose_crash names a mod needing another build, when updating a pack) and names alternatives with their selecting conditions. Nothing is left to inference about when this tool is the right choice versus get_mod_info or get_mod_runs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mod_infoWhat a mod is, from its catalog pageA
Read-onlyIdempotent
Inspect

What one Minecraft mod is and where to get it: its Modrinth page (title, summary, categories, loaders, the Minecraft releases its author lists, client/server side, licence, downloads, source and issue links) next to a short Modkeel lab record (tested versions, run and pair counts). Use it for "what does this mod do?", "is it client-only?", "where do I download it?" or to link a suspect from diagnose_crash. The versions here are what the author declares; for what the lab saw run or crash, use get_mod_runs, and for two mods together, check_mod_pair. Takes a lab mod id or a Modrinth slug; from a name, call search_mods first. The project is matched by the SHA-1 of a jar the lab ran (source: jar_hash, exact), else by slug (source: slug); a mod on neither returns found: false, not an error. Asks Modrinth live on each call (nothing cached here), so it can fail when Modrinth is down: retry later.

ParametersJSON Schema
NameRequiredDescriptionDefault
mod_idYesLab mod id (e.g. fabric_api, ferritecore) or Modrinth slug (e.g. fabric-api, sodium-extra), lowercase. Unsure? Call search_mods first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
labYes
modYes
dataYesSnapshot date and license of the lab data; attribute when quoting.
foundYesFalse: on neither Modrinth nor in lab jars.
sourceNoHow the Modrinth project was matched.
modrinthYes
other_projectsNoOther Modrinth project ids for this mod id: a fork the lab also ran, or the project whose slug is this id when the lab ran a port (fabric_api on NeoForge).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/open-world, but the description adds real behavior: no caching, a live Modrinth call per invocation, potential failure when Modrinth is down with a retry hint, resolution by jar SHA-1 then slug, and found:false rather than an error for unknown mods. This is far beyond the annotation set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense paragraph that is front-loaded with purpose, then usage, then resolution/failure semantics; nearly every clause carries information. It is long for a single-parameter tool, and the resolution detail could be tightened, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is unnecessary, and the description still covers prerequisites, resolution order, the found:false non-error case, and the live-call failure mode. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning: the value may be a lab mod id or a Modrinth slug, is matched by jar hash then slug, and a plain name requires search_mods first. That is more than the schema's format hint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource (fetch a mod's Modrinth catalog page plus a Modkeel lab record) and enumerates the fields returned, so an agent knows exactly what it gets. It explicitly separates itself from siblings get_mod_runs, check_mod_pair and search_mods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger questions ("what does this mod do?", "is it client-only?", "where do I download it?"), names the alternatives for adjacent needs (get_mod_runs for observed behavior, check_mod_pair for two mods together), and states the prerequisite of calling search_mods when only a name is known.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mod_runsWhat the Modkeel lab saw a mod doA
Read-onlyIdempotent
Inspect

Everything the Modkeel lab saw one Minecraft mod do: each Minecraft version where it ran on a server or a client, or crashed, and every mod it ran with or clashed with. Use it for "does this mod work on 1.21.1?", "which versions was it tested on?" or to check a suspect from diagnose_crash. For one specific pair of mods, check_mod_pair gives a direct verdict; for what the mod is and where to get it, get_mod_info. Takes a mod id; from a name, call search_mods first. A mod the lab never ran returns tested: false with empty lists, not an error. Returns every matching row, unpaginated: a few dozen at most per mod.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcNoMinecraft version to narrow the answer to, e.g. 1.21.1, 1.20.1 or 26.2. Omit it to get every version the lab ran; with it, only runs on exactly that version count.
mod_idYesLowercase mod id as the loader knows it (the Modrinth/Fabric/NeoForge id, e.g. sodium, create, entityculling), not the display name. Unsure of the id? Call search_mods first.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcNo
modYes
dataYesSnapshot date and license of the lab data; attribute when quoting.
runsYesOne per jar the lab ran; env: server, client or crashes.
pairsYesMods it shared a run with; env: server, client or clash.
testedYesFalse: the lab never ran this mod.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds genuinely non-obvious behavior: an untested mod returns tested:false with empty lists rather than erroring, and results are returned unpaginated with a bounded count (a few dozen per mod). These are edge-case and result-shape facts an agent could not infer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns, then routing alternatives, then the input contract, then the empty-result and pagination caveats. Every sentence carries distinct information; nothing is restated from annotations or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, the description covers everything an agent needs: what the rows mean, how versions are scoped, the name-vs-id prerequisite, and the no-data-vs-error distinction. Return-value documentation is appropriately left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are fully documented in the schema, including the mc narrowing semantics and the lowercase-id requirement. The description only reiterates that it takes a mod id and to use search_mods for names, adding nothing the schema lacks; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource: everything the lab observed one mod do, broken down into per-version run/crash outcomes plus co-run and clash relationships. It is immediately distinguishable from check_mod_pair (pair verdict), get_mod_info (metadata), and diagnose_crash (suspect analysis), none of which are duplicated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sample queries ('does this mod work on 1.21.1?', 'which versions was it tested on?'), names the exact sibling to use for a pair verdict, for mod metadata, and for name-to-id resolution, and states the prerequisite (call search_mods first when you only have a name).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_modsFind a mod's id in the Modkeel labA
Read-onlyIdempotent
Inspect

Turn a mod's display name or part of its id into the exact mod id the other lab tools take, and see which mods the Modkeel lab has data on. Use it first when you only have a name ("Entity Culling", "Sodium") or are unsure of the id; skip it when you already have the id. To download a mod, call find_mod_download with its name instead: it finds the mod itself. Matching ignores case, spaces and punctuation; best match first, then the mods with more lab data. An empty query lists every mod the lab tested. Returns each mod's id, the Minecraft versions it was tested on and how many runs and pairs it has, plus the total number of matches. No match means the lab has no data on that mod, not that it is broken (get_mod_info still finds it on Modrinth by slug). mc keeps only mods with a run on that exact version; limit caps the list, and total says how many matched.

ParametersJSON Schema
NameRequiredDescriptionDefault
mcNoMinecraft version to narrow the answer to, e.g. 1.21.1, 1.20.1 or 26.2. Omit it to get every version the lab ran; with it, only runs on exactly that version count.
limitNoHow many mods to return, 1 to 100. Default 25.
queryNoMod name or part of its id, e.g. "Entity Culling", "sod" or "create". Empty or omitted: list every mod the lab tested.

Output Schema

ParametersJSON Schema
NameRequiredDescription
mcNo
dataYesSnapshot date and license of the lab data; attribute when quoting.
modsYesBest match first.
queryYes
totalYesMatches before the limit.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, yet the description still adds real behavior: case/space/punctuation-insensitive matching, ordering (best match first, then most lab data), empty-query listing everything, return contents, and the important no-match semantics (absence of lab data, not a broken mod). That last point is a genuine failure-mode disclosure an agent would otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core purpose and the primary routing decision come first, then matching rules, then result shape, then parameter notes. All sentences carry information, though the final parameter recap sentence is somewhat redundant against the schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param, zero-required search tool with an output schema present, the description covers what an agent needs: purpose, routing, matching behavior, empty/no-match edge cases, and parameter effects. It even explains the return shape, which the output schema makes optional, so completeness is not in question.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds interpretation: mc counts only runs on that exact version, limit caps the list, and total reports how many matched regardless of limit. That clarifies the mc filtering semantics and the limit/total relationship beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: turning a display name or partial id into the exact mod id other lab tools consume, and revealing which mods the lab has data on. It explicitly distinguishes itself from siblings find_mod_download and get_mod_info, so an agent can route 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use trigger (only have a name or unsure of the id), an explicit when-to-skip rule (already have the id), and names two alternatives with their selecting conditions: find_mod_download for downloading, get_mod_info for Modrinth slug lookup. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_mod_runs1 field changed
      • changedOutput schema / properties / runs / items / properties / how_to_get / description
        Previous value: -"For a ported build: the jar is not hosted; the command that builds it. Relay it."New value: +"For a ported build: the jar is not hosted; the command that builds it, and whether the lab ran it on a client. Relay it."
  2. 1 tool update
    • Changedget_mod_runs2 fields changed
      • addedOutput schema / properties / runs / items / properties / how_to_get
        Added value: +{
        +  "description": "For a ported build: the jar is not hosted; the command that builds it. Relay it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / runs / items / properties / repo / description
        Previous value: -"For a ported build: the GitHub repo (owner/name) the lab built it from; find_mod_download says how a player gets it."New value: +"For a ported build: the GitHub repo (owner/name) the lab built it from."
  3. 3 tool updates
    • Changeddiagnose_crash1 field changed
      • changedOutput schema / properties / replace / items / properties / status / enum
        Previous value: -[
        -  "official",
        -  "port",
        -  "older_build",
        -  "other_loader",
        -  "none"
        -]New value: +[
        +  "official",
        +  "port",
        +  "older_build",
        +  "build_from_source",
        +  "other_loader",
        +  "none"
        +]
    • Changedfind_mod_download2 fields changed
      • addedOutput schema / properties / source_build
        Added value: +{
        +  "description": "A port the Modkeel lab built from this GitHub repo and branch and saw start on env; Modkeel does not host its jar, so the player builds it (next_step says how). Only when nothing published fits.",
        +  "properties": {
        +    "branch": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "env": {
        +      "type": "string"
        +    },
        +    "repo": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "official",
        -  "port",
        -  "older_build",
        -  "other_loader",
        -  "none"
        -]New value: +[
        +  "official",
        +  "port",
        +  "older_build",
        +  "build_from_source",
        +  "other_loader",
        +  "none"
        +]
    • Changedget_mod_runs5 fields changed
      • addedOutput schema / properties / runs / items / properties / branch
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / runs / items / properties / file
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / runs / items / properties / loader
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / runs / items / properties / repo
        Added value: +{
        +  "description": "For a ported build: the GitHub repo (owner/name) the lab built it from; find_mod_download says how a player gets it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / runs / items / properties / version
        Added value: +{
        +  "type": "string"
        +}
  4. 2 tool updates
    • Changeddiagnose_crash1 field changed
      • changedOutput schema / properties / replace / items / properties / status / enum
        Previous value: -[
        -  "official",
        -  "port",
        -  "other_loader",
        -  "none"
        -]New value: +[
        +  "official",
        +  "port",
        +  "older_build",
        +  "other_loader",
        +  "none"
        +]
    • Changedfind_mod_download2 fields changed
      • addedOutput schema / properties / older_build
        Added value: +{
        +  "description": "The author's file for an earlier version, as the Modkeel lab ran it on this one (only when there is no official build or port): ran (started on env) or crashed (detail says how).",
        +  "properties": {
        +    "detail": {
        +      "type": "string"
        +    },
        +    "env": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "file": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "page": {
        +      "type": "string"
        +    },
        +    "result": {
        +      "enum": [
        +        "ran",
        +        "crashed"
        +      ],
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "version": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "official",
        -  "port",
        -  "other_loader",
        -  "none"
        -]New value: +[
        +  "official",
        +  "port",
        +  "older_build",
        +  "other_loader",
        +  "none"
        +]
  5. 3 tool updates
    • Changedcheck_mod_list7 fields changed
      • changedOutput schema / properties / crashed / description
        Previous value: -"Mods whose jar crashed in a lab run."New value: +"Mods whose jar crashed in a lab run: that exact file (runs[].file)."
      • addedOutput schema / properties / crashed / items / properties / current
        Added value: +{
        +  "description": "With mc: the author's current build for it. newer_build: another file than the one that crashed, not run by the lab yet.",
        +  "properties": {
        +    "filename": {
        +      "type": "string"
        +    },
        +    "published": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "crashed",
        +        "newer_build"
        +      ],
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / crashed / items / properties / next_step
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / crashed / items / properties / runs / items / properties / file
        Added value: +{
        +  "description": "The jar that crashed.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / crashed / items / properties / runs / items / properties / loader
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / crashed / items / properties / runs / items / properties / version
        Added value: +{
        +  "description": "That jar's own version.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "description": "With mc and crashed mods: what to install or leave out, for the player.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changeddiagnose_crash4 fields changed
      • changedOutput schema / properties / pack / properties / crashed / description
        Previous value: -"Installed mods whose jar crashed in a lab run."New value: +"Installed mods whose jar crashed in a lab run (the same version as installed, when the report names it)."
      • addedOutput schema / properties / pack / properties / crashed / items / properties / runs / items / properties / file
        Added value: +{
        +  "description": "The jar that crashed.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / pack / properties / crashed / items / properties / runs / items / properties / loader
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / pack / properties / crashed / items / properties / runs / items / properties / version
        Added value: +{
        +  "description": "That jar's own version.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedfind_mod_download1 field changed
      • addedOutput schema / properties / ports / items / properties / requires
        Added value: +{
        +  "description": "Mods this port needs installed too (port: true when that one is a lab port as well, its url the jar).",
        +  "items": {
        +    "properties": {
        +      "port": {
        +        "type": "boolean"
        +      },
        +      "slug": {
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  6. 2 tool updates
    • Changeddiagnose_crash2 fields changed
      • changedOutput schema / properties / next_step / description
        Previous value: -"The follow-up call that gets the first suspect a build for this Minecraft version and loader, when both are known."New value: +"What to replace and with what, one sentence per mod; tell the user all of it. Null when the version or loader is unknown."
      • addedOutput schema / properties / replace
        Added value: +{
        +  "description": "The build to install for the first suspect, then for every installed mod whose jar crashed in the lab on this version (the next crash), as find_mod_download gives it; null when the version or loader is unknown or Modrinth is down.",
        +  "items": {
        +    "properties": {
        +      "file": {
        +        "properties": {
        +          "filename": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "mod": {
        +        "type": "string"
        +      },
        +      "next_step": {
        +        "type": "string"
        +      },
        +      "page": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "status": {
        +        "enum": [
        +          "official",
        +          "port",
        +          "other_loader",
        +          "none"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
    • Changedfind_mod_download1 field changed
      • changedInput schema / properties / mod_id / description
        Previous value: -"Lab mod id (e.g. sodium, fabric_api) or Modrinth slug (e.g. fabric-api), lowercase. Unsure? Call search_mods first."New value: +"The mod's name as the user wrote it (e.g. Entity Culling), a lab mod id (e.g. sodium, fabric_api) or a Modrinth slug (e.g. fabric-api)."
  7. 1 tool update
    • Changeddiagnose_crash3 fields changed
      • changedInput schema / properties / text / description
        Previous value: -"The full crash report (crash-reports/crash-*.txt, from '---- Minecraft Crash Report ----') or logs/latest.log, unedited. Up to 4 MB."New value: +"The full crash report (crash-reports/crash-*.txt, from '---- Minecraft Crash Report ----') or logs/latest.log, unedited. Up to 4 MB. Give text or url."
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "A link to the crash report or log on a paste site (mclo.gs, pastebin.com, paste.ee, gist.github.com, modkeel.com), e.g. https://mclo.gs/abc123. Modkeel downloads the raw text itself. Give text or url.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "text"
        -]
  8. 1 tool update
    • Changeddiagnose_crash2 fields changed
      • addedOutput schema / properties / pack
        Added value: +{
        +  "description": "The installed mods checked against the lab, beyond this crash.",
        +  "properties": {
        +    "clashes": {
        +      "description": "Pairs in the pack that clashed in a lab run.",
        +      "items": {
        +        "properties": {
        +          "mods": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "runs": {
        +            "items": {
        +              "properties": {
        +                "detail": {
        +                  "description": "What the lab saw, in words.",
        +                  "type": "string"
        +                },
        +                "env": {
        +                  "type": "string"
        +                },
        +                "mc": {
        +                  "type": "string"
        +                },
        +                "source": {
        +                  "description": "Which lab check produced the run.",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "crashed": {
        +      "description": "Installed mods whose jar crashed in a lab run.",
        +      "items": {
        +        "properties": {
        +          "mod": {
        +            "type": "string"
        +          },
        +          "runs": {
        +            "items": {
        +              "properties": {
        +                "detail": {
        +                  "description": "What the lab saw, in words.",
        +                  "type": "string"
        +                },
        +                "env": {
        +                  "type": "string"
        +                },
        +                "mc": {
        +                  "type": "string"
        +                },
        +                "source": {
        +                  "description": "Which lab check produced the run.",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "mods": {
        +      "description": "Mods read from the report's mod list.",
        +      "type": "integer"
        +    },
        +    "pairs_tested": {
        +      "description": "Pairs of the pack the lab ran.",
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / players
        Added value: +{
        +  "description": "What other players' reports of this same crash say (Modkeel Companion reports, monthly snapshot); null below 10 players.",
        +  "properties": {
        +    "as_of": {
        +      "description": "Month of the snapshot, YYYY-MM.",
        +      "type": "string"
        +    },
        +    "fixes": {
        +      "description": "Fixes 10+ players chose, and for how many it held.",
        +      "items": {
        +        "properties": {
        +          "title": {
        +            "type": "string"
        +          },
        +          "worked": {
        +            "enum": [
        +              "most",
        +              "more than half",
        +              "some",
        +              "few"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "seen": {
        +      "description": "How many players reported it, as a band.",
        +      "type": "string"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
  9. 4 tool updates
    • Addedcheck_mod_list
    • Changeddiagnose_crash2 fields changed
      • addedOutput schema / properties / in_game
        Added value: +{
        +  "description": "The same diagnosis inside the game, for players who crash often.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "description": "The follow-up call that gets the first suspect a build for this Minecraft version and loader, when both are known.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Addedfind_mod_download
    • Changedsearch_mods1 field changed
      • changedOutput schema / properties / mods / items / properties / id / description
        Previous value: -"Pass this to get_mod_info, get_mod_runs or check_mod_pair."New value: +"Pass this to the other tools as mod_id."
  10. 2 tool updates
    • Addedget_mod_info
    • Changedsearch_mods1 field changed
      • changedOutput schema / properties / mods / items / properties / id / description
        Previous value: -"Pass this to get_mod_runs or check_mod_pair."New value: +"Pass this to get_mod_info, get_mod_runs or check_mod_pair."
  11. 6 tool updates
    • Addedcheck_mod_pair
    • Changeddiagnose_crash2 fields changed
      • changedInput schema / properties / text / description
        Previous value: -"Crash report or latest.log, unedited."New value: +"The full crash report (crash-reports/crash-*.txt, from '---- Minecraft Crash Report ----') or logs/latest.log, unedited. Up to 4 MB."
      • changedOutput schema / properties / suspects / description
        Previous value: -"Most likely first."New value: +"Most likely first; empty when no mod is implicated."
    • Addedget_mod_runs
    • Removedmod_lab_runs
    • Removedmod_pair
    • Addedsearch_mods
  12. 3 tool updates
    • First observeddiagnose_crash
    • First observedmod_lab_runs
    • First observedmod_pair

Publisher details

Operator
Modkeel · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
None: free, no account, no API key, no OAuth. Rate limited per network. · Publisher source

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources