Modkeel
Server Details
Modded Minecraft: which mod crashed, where to get a mod for your version, which mods work together.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 7 tools
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.
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.
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.
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 toolscheck_mod_listDo these mods work togetherARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mc | No | Minecraft 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_ids | Yes | Lowercase mod ids as the loader knows them, e.g. ["sodium", "iris", "create"]. The ids of a mods folder's jars work. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | No | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| mods | Yes | Distinct ids checked. |
| pairs | Yes | |
| clashes | Yes | Pairs in the list that clashed in a lab run. |
| crashed | Yes | Mods whose jar crashed in a lab run: that exact file (runs[].file). |
| verdict | Yes | |
| next_step | No | With mc and crashed mods: what to install or leave out, for the player. |
| ran_together | No | Pairs in the list seen working together. |
| untested_mods | Yes | No lab data: unknown, not broken. |
TDQS
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.
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.
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.
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.
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.
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 togetherARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mc | No | Minecraft 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_a | Yes | First 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_b | Yes | Second mod, same format, e.g. iris. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | No | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| mods | Yes | |
| runs | Yes | The runs behind the verdict; env: server, client or clash. |
| verdict | Yes | untested: no lab run, not a known conflict. |
TDQS
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.
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.
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.
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.
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.
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 MinecraftARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | 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. | |
| text | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | No | |
| kind | Yes | |
| pack | No | The installed mods checked against the lab, beyond this crash. |
| error | No | The root exception and its message. |
| guide | Yes | How to fix this kind of crash. |
| loader | No | |
| source | Yes | |
| in_game | No | The same diagnosis inside the game, for players who crash often. |
| players | No | What other players' reports of this same crash say (Modkeel Companion reports, monthly snapshot); null below 10 players. |
| replace | No | 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. |
| suspects | Yes | Most likely first; empty when no mod is implicated. |
| next_step | No | What to replace and with what, one sentence per mod; tell the user all of it. Null when the version or loader is unknown. |
| signature | No | Stable id of this crash shape. |
| confidence | Yes | How sure the first suspect is the cause. |
| description | No |
TDQS
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.
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.
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.
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.
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.
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 versionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mc | Yes | Minecraft version to install on, exactly, e.g. 1.21.1 or 26.2. | |
| loader | Yes | Mod loader of the instance: fabric, neoforge, forge or quilt. | |
| mod_id | Yes | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | Yes | |
| mod | Yes | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| ports | Yes | Ports verified by the lab; only when there is no official build. |
| loader | Yes | |
| status | Yes | |
| project | No | The mod's Modrinth project; null when none matches. |
| official | Yes | The author's build for this version and loader (a release when any). |
| next_step | Yes | What the user can do now, one sentence. |
| older_build | No | 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). |
| source_build | No | 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. |
| other_loaders | No | Loaders the author builds this version for. |
| declared_versions | No | Newest Minecraft releases the author lists. |
TDQS
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.
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.
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.
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.
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.
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 pageARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mod_id | Yes | Lab mod id (e.g. fabric_api, ferritecore) or Modrinth slug (e.g. fabric-api, sodium-extra), lowercase. Unsure? Call search_mods first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lab | Yes | |
| mod | Yes | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| found | Yes | False: on neither Modrinth nor in lab jars. |
| source | No | How the Modrinth project was matched. |
| modrinth | Yes | |
| other_projects | No | Other 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
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.
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.
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.
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.
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.
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 doARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mc | No | Minecraft 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_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | No | |
| mod | Yes | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| runs | Yes | One per jar the lab ran; env: server, client or crashes. |
| pairs | Yes | Mods it shared a run with; env: server, client or clash. |
| tested | Yes | False: the lab never ran this mod. |
TDQS
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.
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.
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.
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.
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.
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 labARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mc | No | Minecraft 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. | |
| limit | No | How many mods to return, 1 to 100. Default 25. | |
| query | No | Mod name or part of its id, e.g. "Entity Culling", "sod" or "create". Empty or omitted: list every mod the lab tested. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mc | No | |
| data | Yes | Snapshot date and license of the lab data; attribute when quoting. |
| mods | Yes | Best match first. |
| query | Yes | |
| total | Yes | Matches before the limit. |
TDQS
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.
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.
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.
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.
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.
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 tool update
- Changed
get_mod_runs1 field changed- changed
Output schema / properties / runs / items / properties / how_to_get / descriptionPrevious 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."
1 tool update
- Changed
get_mod_runs2 fields changed- added
Output schema / properties / runs / items / properties / how_to_getAdded value: +{ + "description": "For a ported build: the jar is not hosted; the command that builds it. Relay it.", + "type": "string" +} - changed
Output schema / properties / runs / items / properties / repo / descriptionPrevious 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 tool updates
- Changed
diagnose_crash1 field changed- changed
Output schema / properties / replace / items / properties / status / enumPrevious value: -[ - "official", - "port", - "older_build", - "other_loader", - "none" -]New value: +[ + "official", + "port", + "older_build", + "build_from_source", + "other_loader", + "none" +]
- Changed
find_mod_download2 fields changed- added
Output schema / properties / source_buildAdded 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" + ] +} - changed
Output schema / properties / status / enumPrevious value: -[ - "official", - "port", - "older_build", - "other_loader", - "none" -]New value: +[ + "official", + "port", + "older_build", + "build_from_source", + "other_loader", + "none" +]
- Changed
get_mod_runs5 fields changed- added
Output schema / properties / runs / items / properties / branchAdded value: +{ + "type": "string" +} - added
Output schema / properties / runs / items / properties / fileAdded value: +{ + "type": "string" +} - added
Output schema / properties / runs / items / properties / loaderAdded value: +{ + "type": "string" +} - added
Output schema / properties / runs / items / properties / repoAdded 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" +} - added
Output schema / properties / runs / items / properties / versionAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
diagnose_crash1 field changed- changed
Output schema / properties / replace / items / properties / status / enumPrevious value: -[ - "official", - "port", - "other_loader", - "none" -]New value: +[ + "official", + "port", + "older_build", + "other_loader", + "none" +]
- Changed
find_mod_download2 fields changed- added
Output schema / properties / older_buildAdded 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" + ] +} - changed
Output schema / properties / status / enumPrevious value: -[ - "official", - "port", - "other_loader", - "none" -]New value: +[ + "official", + "port", + "older_build", + "other_loader", + "none" +]
3 tool updates
- Changed
check_mod_list7 fields changed- changed
Output schema / properties / crashed / descriptionPrevious value: -"Mods whose jar crashed in a lab run."New value: +"Mods whose jar crashed in a lab run: that exact file (runs[].file)." - added
Output schema / properties / crashed / items / properties / currentAdded 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" + ] +} - added
Output schema / properties / crashed / items / properties / next_stepAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / crashed / items / properties / runs / items / properties / fileAdded value: +{ + "description": "The jar that crashed.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / crashed / items / properties / runs / items / properties / loaderAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / crashed / items / properties / runs / items / properties / versionAdded value: +{ + "description": "That jar's own version.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / next_stepAdded value: +{ + "description": "With mc and crashed mods: what to install or leave out, for the player.", + "type": [ + "string", + "null" + ] +}
- Changed
diagnose_crash4 fields changed- changed
Output schema / properties / pack / properties / crashed / descriptionPrevious 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)." - added
Output schema / properties / pack / properties / crashed / items / properties / runs / items / properties / fileAdded value: +{ + "description": "The jar that crashed.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / pack / properties / crashed / items / properties / runs / items / properties / loaderAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / pack / properties / crashed / items / properties / runs / items / properties / versionAdded value: +{ + "description": "That jar's own version.", + "type": [ + "string", + "null" + ] +}
- Changed
find_mod_download1 field changed- added
Output schema / properties / ports / items / properties / requiresAdded 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" +}
2 tool updates
- Changed
diagnose_crash2 fields changed- changed
Output schema / properties / next_step / descriptionPrevious 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." - added
Output schema / properties / replaceAdded 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" + ] +}
- Changed
find_mod_download1 field changed- changed
Input schema / properties / mod_id / descriptionPrevious 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)."
1 tool update
- Changed
diagnose_crash3 fields changed- changed
Input schema / properties / text / descriptionPrevious 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." - added
Input schema / properties / urlAdded 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" +} - removed
Input schema / requiredRemoved value: -[ - "text" -]
1 tool update
- Changed
diagnose_crash2 fields changed- added
Output schema / properties / packAdded 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" +} - added
Output schema / properties / playersAdded 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" + ] +}
4 tool updates
- Added
check_mod_list - Changed
diagnose_crash2 fields changed- added
Output schema / properties / in_gameAdded value: +{ + "description": "The same diagnosis inside the game, for players who crash often.", + "type": "string" +} - added
Output schema / properties / next_stepAdded 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" + ] +}
- Added
find_mod_download - Changed
search_mods1 field changed- changed
Output schema / properties / mods / items / properties / id / descriptionPrevious 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."
2 tool updates
- Added
get_mod_info - Changed
search_mods1 field changed- changed
Output schema / properties / mods / items / properties / id / descriptionPrevious 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."
6 tool updates
- Added
check_mod_pair - Changed
diagnose_crash2 fields changed- changed
Input schema / properties / text / descriptionPrevious 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." - changed
Output schema / properties / suspects / descriptionPrevious value: -"Most likely first."New value: +"Most likely first; empty when no mod is implicated."
- Added
get_mod_runs - Removed
mod_lab_runs - Removed
mod_pair - Added
search_mods
3 tool updates
- First observed
diagnose_crash - First observed
mod_lab_runs - First observed
mod_pair
Publisher details
- Operator
- Modkeel · Publisher source
- Operator website
- https://modkeel.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://modkeel.com/mcp · 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
The MCP server index that vets servers, not just lists them. Advisory screen before you install.
Start your own Minecraft: Java Edition server, add mods from Modrinth, and run its console.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Related MCP Servers
- FlicenseAqualityCmaintenanceProvides grounded answers for writing Minecraft mods, targeting 1.8.9 and 1.21.10+ eras with curated and live tools for mappings, APIs, and mixins.4162-
- AlicenseAqualityBmaintenanceMCP server for Minecraft modpack diagnostics, enabling mod conflict detection, log/crash analysis, and dependency lookup via Modrinth.9MIT
- AlicenseAqualityBmaintenanceContext-aware MCP server advisor. Tells you what to install for your specific project — and why.4MIT
- FlicenseBqualityDmaintenanceProvides API documentation browsing, code generation, and code review for Minecraft 1.21.1 Forge and NeoForge modding.201-
Glama MCP Gateway
Add one secure layer between your agents and this server.