Praetorium

io.github.richardsolomouPublished by GitHub account richardsolomouv1.3.0Updated Nov 12, 2026

Public Warhammer 40K rules, datasheets, points and missions; sign in to manage rosters and battles.

VerifiedStreamable HTTPWeb executable

Overview

Praetorium's hosted MCP server (praetorium.gg); no sign-in required; Streamable HTTP; 43 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Endpoint
praetorium.gg
Last checked

Installation

In SourceWeft

  1. Open Praetorium in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.richardsolomou%2Fpraetorium/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "praetorium": {
      "type": "http",
      "url": "https://praetorium.gg/mcp"
    }
  }
}

README

[Praetorium logo]

Praetorium

Warhammer 40,000 army building and game tracking, from setup to final score.

praetorium.gg · Discord

[Build] [License]

Product

Praetorium is a free, open source Warhammer 40,000 army builder and battle tracker. Build and share lists, browse the community catalogue, and compare units in the combat simulator. Play 1v1, 2v1, or 2v2 games with friends, or run a practice game. Track setup, turns, turn times, scoring, and casualties.

Anyone can watch battles and see the leaderboard. Groups keep a running leaderboard for people who play together, and tournaments have everyone seal a list in secret before playing from a shared results table, in open play or Swiss rounds.

Scope

Praetorium does not provide matchmaking, chat, or rules written by this project. An account is required to start a battle or to keep a list, though not to play as an invited guest, watch a battle, read the leaderboard, or try the roster builder.

This repository contains source pins and authored correction patches in catalogue/, but no fetched upstream catalogues, copied rules prose, or generated snapshots. The service uses verified snapshots from the configured community sources.

Use

praetorium.gg is the supported service and the easiest way to use Praetorium. It keeps the community rules data current and saves your rosters and battles.

The public reference is available without an account: faction datasheets, missions, and rules. Each page reads the service's verified community data snapshot.

The docs explain how to use each part of Praetorium.

The source is open so anyone can inspect the product and contribute to it. Contributing covers running a local development copy.

Development

See Contributing to run the app and its checks, Architecture for code placement, and AGENTS.md for coding-agent rules.

Data and trademarks

Catalogue definitions come from BSData. Rules and mission data come from Game Datacards. See catalogue/sources.json for all sources.

Warhammer 40,000 and related marks belong to Games Workshop. Praetorium is unofficial and is not endorsed by Games Workshop.

Praetorium is licensed under the GNU Affero General Public License v3.0.

Source: README.md at commit ebce8e7

Tools

43

list_my_rosters

List my saved rosters

Lists the rosters saved to the signed-in Praetorium account. Requires mcp:read.

Takes no parameters.

get_my_roster

Read my saved roster

Returns one roster owned by the signed-in player, by an id from list_my_rosters. summary names each unit with its points, models, wargear, enhancements, Warlord and attachments, and gives the total and any problems that stop the list being fielded; it is null while army data is unavailable. roster holds the saved choices by catalogue id, the shape save_roster takes. Requires mcp:read.

Parametersidrequired

list_my_battles

List my battles

Lists the signed-in player's battles, newest first, up to 25 a page, narrowed and ordered as the battles page is. Each battle has its url, status, your result, ending, size, mission and one entry per seat (you, side, army, faction, detachments, score with its primary and secondary halves, rating change). A filtered page can come back short or empty while nextCursor is set; keep paging until nextCursor is null. Requires mcp:read.

Parametersorderbeforefilter

get_my_stats

Read my battle statistics

Returns the signed-in player's record as their profile shows it, over their latest 200 finished battles except practice games, optionally narrowed. record: battles, won, lost, drawn, rate (win rate 0 to 1, a draw counting half), going first and second, average points, streaks, command points, stratagems and secondary cards used, primary missions, opposing factions and opponents. performance: the same split per detachment, primary mission and battle size. facets: the values each filter takes, with battle counts. rankings: leaderboard places from rated public battles, overall and per faction, unaffected by the filters. List the battles themselves with list_my_battles. Requires mcp:read.

ParameterslimitfactiondetachmentopponentIdmissionPackIdopponentFactionopponentDetachment

save_roster

Create or edit my roster

Saves a complete roster. Pass its id to edit an owned roster; omit id to create one. limit is the battle size (1000, 2000 or 3000 points, or 600 for King of the Colosseum), which sets detachment points, enhancement and unit limits. pointsBudget optionally replaces only its points total (500 to 10000, not King of the Colosseum); omit it to keep a saved budget, or send null for the standard total. Requires mcp:write.

ParametersidnamerequiredpreprequiredlimitrequiredpicksrequiredsourcevisibilitycatalogueIdrequireddispositionrequiredwaivedRulespointsBudgetdetachmentIdsrequired+2 more

set_roster_visibility

Change my roster visibility

Changes the visibility of an owned roster. Requires mcp:write.

Parametersidrequiredvisibilityrequired

list_my_opponents

List who I can play

Lists who the signed-in player can seat in create_battle: friends (kind friend) and practice opponents run with one of your own rosters (kind practice), by id. Someone without an account is not listed: seat them with guestNames instead. Requires mcp:read.

Takes no parameters.

create_battle

Create a battle

Creates a battle in setup, as New battle on the site does, and returns its token. opponentId seats one opponent from list_my_opponents for a duel; opponentIds seats one or two, and allyId seats a friend on your side, for a 2v1 or doubles; guestNames seats one or two opponents without an account by name. limit is the battle size in points (1000, 2000, 3000, or 600 for King of the Colosseum); omit it to take the size from the rosters. missionPackId is a mission pack id from list_reference. casual: true plays it outside a tournament both players are entered in. manual: true tracks by hand without mission cards, stratagems or CP automation. groupToken counts it for a group both players are in, and fixture names that group's league fixture. Then set it up with submit_battle_action, following get_my_battle's next. Requires mcp:write.

ParameterslimitallyIdcasualmanualfixturegroupTokenguestNamesopponentIdopponentIdsmissionPackId

get_my_battle

Read one of my battles

Returns the signed-in player's seated view of a battle (battle) and what it expects next (next). next says what the battle expects: in setup, each step in table order with done and the command that answers it, the battlefields and secondary cards on offer, and begin.refusal until begin-battle would be accepted; in play, the round, phase, active player, a pending settlement of the previous turn, cards scoring now, the turn commands allowed now and why advance is refused, stratagems usable now per side, and the undoable seq. Requires mcp:read.

Parameterstokenrequired

submit_battle_action

Record a battle action

Appends one command to a battle's log, only when expectedSeq equals the battle's current seq from get_my_battle. The answer's result.outcome is appended, stale (someone recorded first: read the battle again) or refused with the reason. Any seated player may record for any seat with playerId, as at a shared table. Each command kind says when it is used; follow get_my_battle's next for the order. Requires mcp:write.

ParameterstokenrequiredcommandrequiredexpectedSeqrequired

get_my_battle_report

Read my battle report

Returns a battle's log as its report reads it, oldest first and 200 entries a page: each entry's seq, round, phase, the player id that recorded it (by) and a sentence saying what happened. Pass nextAfter as after for the next page. Totals and the result are in get_my_battle. Requires mcp:read.

Parametersaftertokenrequired

delete_battle

Delete my battle

Permanently deletes a battle the signed-in player created, for every player in it, with its result. Only the creator can. Confirm with the player first. Requires mcp:write.

Parameterstokenrequired

search_reference

Search the Praetorium game reference

Searches Praetorium’s missions, force dispositions, deployments, terrain, rules, detachments, and datasheets by name, number, keyword, and value. Returns bounded excerpts with canonical URLs, source revisions, and attribution. Rules text is not included; records point to it upstream.

Parameterspackkindslimitqueryrequiredcursorfactiondocument

get_reference

Read one Praetorium reference result

Reads the complete bounded document returned by search_reference, with its revisions and attribution. A section that withholds rules text lists textSources: the pinned upstream file and record id to fetch if you need the wording.

Parametersidrequired

get_reference_record

Read structured Praetorium reference data

Returns the structured record behind a search result, including mission cards, force dispositions (missions by opposing disposition, detachments that offer them), deployments, terrain geometry, detachments, and datasheets. Records that withhold rules text carry textSources pointing at the pinned upstream file and record id.

Parametersidrequired

list_factions

List factions in the Praetorium reference

Lists the factions that can be used to narrow reference searches.

Takes no parameters.

list_reference

List the Praetorium reference catalogue

Discovers available factions, mission packs, rule documents, reference kinds, and active source revisions.

Takes no parameters.

list_units

List compact faction units for roster planning

Returns every pickable unit in one bounded response with unit-size costs, composition, attachment relationships, roster limits, roles, keywords, and links. Without a detachment it also lists every detachment the faction can take, with its detachment points, Force dispositions, rule names and enhancement costs, so you can compare them before choosing. Include a detachment, including one a chapter takes from its codex, to list only the units it allows and receive its rules, enhancements, upgrades, and stratagems by name, cost, and timing without opening every unit page. Their rules text is at each record’s textSources. A unit’s points is what its smallest size costs in this battle size and detachment, including any wargear or enhancement the detachment makes it take; costs is the Munitorum Field Manual table for every size. Legends and Crucible datasheets are left out unless nonMatchedPlay is true. A large faction such as a Space Marine chapter can exceed what an assistant reads at once, so pass query to list only the units whose name or keywords contain it; a query nothing contains lists the units whose names are close to it, so a misspelt name still finds its unit.

ParametersqueryfactionrequiredbattleSizedetachmentnonMatchedPlay

get_mission_matchup

Resolve a mission matchup

Resolves a pack and two force dispositions to the primary mission each side plays (its card: scoring awards, caps, actions, timing), the terrain layouts and deployments for the pairing, and canonical URLs and reference ids for each. Pass each value by id, slug, or name; an unknown or ambiguous value is refused with the valid options. Rules text is withheld; cards point to it through textSources.

ParameterspackrequiredyourDispositionrequiredopponentDispositionrequired

simulate_combat

Estimate combat between two units

Runs Praetorium's exact combat simulator for one attacking unit, with any attached leaders, against one defending unit: shooting, melee, and shooting followed by melee. Returns expected models destroyed, expected wounds lost, the chance to destroy the unit, cumulative odds, weapons used, the wargear each unit fielded, the rule and weapon-mode choices each side can change, datasheet citations, and a simulator link. Each unit takes its default loadout unless given choices and spreads; to field a unit from get_my_roster, pass its pick's entryId as unit with the pick's models, choices and spreads, its attached picks under attached, and the roster's detachment. Units start at full strength unless modelsLost or woundsLost say otherwise. Passive datasheet rules apply by default; stratagems and conditional rules, including below-strength ones, stay off until chosen in rules. A modifier never chooses a rule: charged and heavy change only weapon abilities such as [LANCE] and [HEAVY], so a rule whose option needs the unit to have charged or remained stationary must also be chosen. Rules the simulator cannot calculate are never approximated: a phase it cannot estimate has status refused with its reasons, and recognised rules it leaves out are listed under notCalculated, so explain those gaps rather than retrying. Errors are reserved for unknown factions or units, illegal unit sizes, wargear, attachments, enhancements, or losses, and unavailable reference data. A weapon choice left out of weaponModes takes the option that does most against this defender. A side fields a detachment's rules and offers its stratagems only when its detachment is named, an enhancement applies only when named for its unit or among its choices, and another unit's aura applies only when that unit is listed in nearby and its rule chosen. The simulator link keeps loadouts but opens every unit at full strength.

ParametersattackerrequireddefenderrequiredmodifiersweaponModes

optimize_loadout

Find the best loadout against a unit

Searches the attacking unit's legal wargear, with any attached leaders, for the loadout most likely to destroy the defender, then the most models destroyed, then the most wounds, as the simulator's Optimize does. Takes the same sides as simulate_combat; the attacker's choices and spreads are where the search starts, and model counts, enhancements and detachment upgrades stay fixed. mode ranks shooting followed by melee (combined), or one phase. Returns best and current, each with every attacking unit's choices and spreads ready for a roster pick or simulate_combat (a group left out keeps its default), its wargear by name, the weapon modes it used, and its odds; better says whether best beats current. exhaustive is true only when every legal loadout was checked; otherwise notes say why a better one may exist. Loadouts with rules the simulator cannot estimate are left out and named in notes. Takes up to about 20 seconds.

Parametersmodeattackerrequireddefenderrequiredmodifiers

list_data_updates

List game-data updates

Lists the points and datasheet updates the installed army data recorded, newest first, as the /data-updates pages show them. Each update has its UTC time, url, total change count and omitted (changes past its stored bound). Without faction, each update lists only the factions it reached with their change counts. With faction, it lists that faction's changes in groups: kind (datasheet-points, datasheet-added, datasheet-removed, detachment-points, detachment-added, detachment-removed, enhancement-points, enhancement-added, enhancement-removed), name, points from and to (per models row for datasheets; null where none), and the url of the page describing it now, or null when it no longer exists. Pass older as before for the next page; null means no older updates.

Parametersbeforefaction

check_roster

Check a roster

Prices a roster and lists every problem that stops it being fielded, without saving it or needing an account: the same summary get_my_roster gives a saved list. summary names each unit with its points, models, wargear, enhancements, Warlord and attachments, and gives the total; problems is empty when the list is legal.

Parametersrosterrequired

grade_roster

Grade a roster

Grades what a roster can do on the table, as the roster builder's grades do: score 0 to 100 and grade A to D overall and per category (board control, mobility, damage against reference targets, durability), placed among tournament lists of the same battle size and of comparedWith's armies. A typical tournament list scores about 70. missing names the reference targets nothing in the list can take half of alone. It measures units at full strength with passive rules only, from the exact simulator; it never predicts who wins. Each row's notCalculated names units or rules it could not measure. Takes a few seconds; check the list with check_roster first, since a list that cannot be fielded still grades.

Parametersrosterrequired

get_unit_options

Read unit options for a roster

Lists what each named unit lets a roster pick set, with names first and the ids a pick takes beside them: its sizes, its toggles (key of the Warlord toggle: set toggles {key: 1} on exactly one CHARACTER), and every choice group (wargear, enhancement, detachment upgrade, unit composition) with its options' ids, points, how many the default loadout takes (taken), and per-option min and max. A choice whose set is choices takes {key: optionId}; omit an optional one to decline it. One whose set is spreads takes {key: {optionId: count}}, counts within each option's min and max, totalling no more than room and at least least; for 'every model one option' give the whole room to one option. A group whose key extends another's key and option id applies only while that option is taken. Enhancements and detachment upgrades appear only with a detachment, at their cost; a list takes each enhancement once, on a CHARACTER that is not an Epic Hero. roster gives the catalogueId, detachmentIds and dispositions a save_roster or check_roster roster takes. Leave out a choice to keep the default; check the finished list with check_roster.

ParametersunitsrequiredfactionrequiredbattleSizedetachment

compare_rosters

Compare two rosters in combat

Runs every unit of one roster, with its attached units, against every unit of another in Praetorium's exact combat simulator, as the simulator's whole-roster table does: one call instead of a simulate_combat call per pairing. attackers and defenders list the units in roster order, entries giving their 1-based roster entries as check_roster numbers them. Each phase's cells[attacker][defender] holds the measures in the order measures names, or null when that pairing could not be calculated; notCalculated groups those by phase and reason. bestTargetOf[attacker] lists the defenders that attacker does most to, and bestAttackerOf[defender] the attackers that do most to that defender, by rankBy; each is judged alone, ignores pairings it could not calculate, and is empty while any pairing in its row or column is unfinished or nothing does damage. Units start at full strength in default conditions: passive rules apply, while stratagems, conditional rules, cover and range bonuses stay off, and each weapon choice takes the option that does most against that target. A partial status means the table stopped early, as stoppedBy says; its finished pairings stand. Two 2,000-point lists take a second or two, and the table stops after 30 seconds. Drill into one pairing with simulate_combat to choose rules, modifiers or losses.

ParametersphasesrankByattackerrequireddefenderrequiredmeasures

import_roster

Import an army list

Reads a pasted army list into a roster draft without saving it or needing an account, as the site's import does. Takes the whole text export from the official Warhammer 40,000 app, New Recruit, BattleBase, ListForge, Warscribe, WTC layouts or Praetorium, or a Praetorium exchange code (PR1./PR2.). draft is the list in the shape check_roster and save_roster take, or null when no faction matched. review is what the importing player sees: matchedEntries of sourceEntries, the points the text reported against currentPoints at the selected rules version, notImported (units, detachments or lines left out, each with why) and builtByDatasheet (units that imported but keep their datasheet defaults for the choices named, each with why). Tell the player about every row in both before relying on the draft. When battleSizeStated is false the draft uses 2000 points; ask the player. Anything the import had to assume, such as a unit's god, is named in builtByDatasheet; nothing is substituted silently.

Parametersfilerequired

export_roster

Export a roster as text

Writes a roster as the site's text export, the official app's layout that tournament organisers and other list builders read, without saving it or needing an account. Takes the shape save_roster takes, such as import_roster's draft or get_my_roster's roster. text is the export; code is a Praetorium exchange code that carries the exact list into Praetorium, or null when the list is too large for one. omittedUnitCount counts entries the current army data no longer prices, which the text leaves out. A name is required. Fails while the army data is unavailable.

Parametersrosterrequired

delete_roster

Delete my roster

Permanently deletes one of the signed-in player's saved rosters, by an id from list_my_rosters, and ends any loan of it to a friend. Battles it was fielded in keep their own record. It cannot be undone, so confirm the roster's name with the player first; set_roster_archived hides a list without losing it. Requires mcp:write.

Parametersidrequired

copy_roster

Copy a roster

Saves a copy of a roster to the signed-in player's account: one of their own from list_my_rosters, or a public or unlisted one they can open. variant true keeps the copy grouped with the original as an alternative version, which only works on their own rosters; false makes a standalone copy. The copy takes the player's default visibility, which is public unless they changed it, whatever the original's. Returns the new roster's id, url and visibility: tell the player when it is public, and offer set_roster_visibility. Requires mcp:write.

Parametersidrequiredvariant

set_roster_archived

Archive or restore my roster

Archives one of the signed-in player's saved rosters, which moves it out of their main roster list without deleting it, or restores it with archived false. Requires mcp:write.

Parametersidrequiredarchivedrequired

get_my_collection

Read my model collection

Returns the models the signed-in player owns, as their collection page keeps them, grouped by faction. Each entry's id and slug are the datasheet's, the same as list_units gives, with the models owned, how many are built and painted, and countsAs: other datasheets the player says those models can also be fielded as. A datasheet the current army data no longer has is named "A datasheet from earlier rules". Pass faction to read one army; a collection of more than 200 datasheets without one returns only each faction's totals. Requires mcp:read.

Parametersfaction

list_my_events

List my groups and tournaments

Lists the signed-in player's groups, tournaments and hidden-list games (a group's game where everyone seals a list in secret before the reveal), each with its token, url, dates and your place in it: membership, entry status, whether you sealed a list, and the size you seal at. Pass includeOpen to also list public groups and tournaments you could join. Read one with get_my_group or get_my_event. Requires mcp:read.

ParametersincludeOpen

get_my_group

Read one of my groups

Returns a group as its page shows it to the signed-in player: members (ids for create_battle's opponentIds), the leaderboard, recent finished games and your unfinished ones, its current hidden-list games, and its league with the table and your fixtures. An open fixture's start is the create_battle input that plays it for the league. A private group shows only its name until you are a member. Requires mcp:read.

Parameterstokenrequired

get_my_event

Read a tournament or hidden-list game

Returns a tournament or hidden-list game as the signed-in player may see it: rules (format, size, points, what lists may break), dates, entrants with whether each sealed, your entry, Swiss rounds with your table and opponent, standings once lists are revealed, your battles in it, and todo: what you still need to do. Before the reveal nobody's list is shown but your own name for it. Requires mcp:read.

ParameterstokenrequiredeventToken

join_group

Join a group

Joins a group by its token, as its invite link does. A group whose organizers approve each member answers pending until they let you in. Requires mcp:write.

Parameterstokenrequired

join_league

Join a group's league

Joins the draft league of a group you are a member of. Nobody can join once an organizer publishes its fixtures. Requires mcp:write.

Parameterstokenrequired

join_event

Join a tournament or hidden-list game

Enters the signed-in player in a tournament by its token, as its invite link does, or in a hidden-list game of a group they belong to. A tournament whose organizer approves each player answers pending until they let you in. Closed once lists are revealed or the roster deadline passes. Requires mcp:write.

ParameterstokenrequiredeventToken

submit_event_roster

Seal my roster for a tournament

Seals one of the signed-in player's saved rosters for a tournament or hidden-list game, or replaces the list sealed before, with the site's checks: battle size, points, the event's house rules, a Warlord, and the roster deadline. Sealing stores a copy; later edits to the saved roster don't change it. Before the reveal only you and an assigned ally can read it. Check the roster with get_my_roster first, and seal only after the player confirms. Requires mcp:write.

ParameterstokenrequiredrosterIdrequiredeventToken

check_in_event

Check in to a tournament

Marks the signed-in player as arrived at a Swiss tournament, or not, before round 1 is paired; an organizer may drop players who haven't checked in. Requires mcp:write.

ParameterstokenrequiredcheckedIneventToken

start_event_battle

Start my tournament battle

Starts the battle for a revealed tournament or hidden-list game with both sealed lists attached, as Start battle on its page does, and returns its token for get_my_battle and submit_battle_action. In Swiss rounds omit opponentId to play your current table; Swiss refuses anyone else. Otherwise name the opponent from get_my_event's entrants, and for a team game the ally and second opponent too. For a league fixture use create_battle with the fixture's start instead. Requires mcp:write.

ParameterstokenrequiredallyIdeventTokenopponentIdmissionPackIdsecondOpponentId

report_table_result

Report my table’s score

Records the final score of the signed-in player's Swiss table, for a game not tracked on Praetorium, and finishes its battle; it counts for the tournament's standings but not the leaderboard. Report only a score both players agree. Defaults to your table this round. A result locks once the next round is paired; then only the organizer can reopen it. Requires mcp:write.

ParametersroundtokenrequiredyourScorerequiredeventTokenmissionPackIdopponentScorerequired

get_skill

Read a Praetorium skill

Returns step-by-step guidance for a task, including the Warhammer 40,000 knowledge and tool order it needs. Read the matching skill before starting the task. Skills: answer-a-rules-question: Answer a Warhammer 40,000 rules question from Praetorium's reference, citing the source. Use when someone asks how a rule, ability, stratagem, keyword, datasheet value or mission works. build-a-roster: Plan a Warhammer 40,000 army list from Praetorium's current units, points and detachments, weigh what each detachment gives a unit, and save the list to the player's Praetorium account when they ask. Use when someone wants to build, draft, improve, cost or save an army or roster, choose a detachment, or asks how a unit fits a list. choose-secondaries: Help a Warhammer 40,000 player choose between Tactical and Fixed secondary missions for a mission and opponent, from the secondary cards in Praetorium's reference. Use when someone asks which secondaries to take, or whether to go fixed or tactical. compare-units: Compare two Warhammer 40,000 units with Praetorium's combat simulator and explain the expected result. Use when someone asks how one unit does against another, which of two options hits harder, which wargear is best against a target, or what the odds are of destroying a target. explain-a-mission-matchup: Explain which primary missions, deployments and terrain two Warhammer 40,000 force dispositions get in a mission pack, from Praetorium. Use when someone asks what mission they play against an opponent's disposition, or how to set up a game in the current pack. grade-a-roster: Grade a Warhammer 40,000 army list with Praetorium, explain what it does well and lacks, and tune it with tested swaps. Use when someone asks how good their list is, what it is missing, how to improve it, or before handing over a list you built. import-a-list: Bring an army list from the official Warhammer 40,000 app, New Recruit, BattleBase or another builder into Praetorium, report what didn't match,

Parametersnamerequired

Version history

4
  1. v1.3.0LatestNov 12, 2026
  2. v1.2.0Oct 8, 2026
  3. v1.1.0Sep 29, 2026
  4. v1.0.0Sep 29, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts