Skip to main content
Glama

Tank Fight MCP — the game spec as a service

An MCP server that serves the canonical specification for Tank Fight: field and window size, tank and bullet stats, spawn rules, scoring, controls, menu behaviour, AI strategies, the difficulty ramp, and a destructible maze per level.

It runs as a local service on a port. Any MCP client can connect, ask what tools it offers, and query the specification — while building the game in Java, in TypeScript, or in anything else.

What it's for

Two jobs, and the second matters more than it first looks.

1. Keep independent implementations in agreement. Two builds of the same game, written separately, drift the moment they need a number nobody wrote down. Both asking the same service how big a tank is removes the guesswork.

2. Stop the model inventing requirements. Every detail a spec leaves out is a place where an AI coding assistant quietly picks something plausible and moves on — do bullets stop at walls? can allies shoot each other? what happens when a player is destroyed mid-round? It rarely mentions that it decided. Each of those is answered here, so the question becomes a lookup instead of a guess, and open_questions names what genuinely isn't decided, so the honest answer is "ask a human" rather than a confident invention.

Related MCP server: 17-0 MCP Server

Run it

Requires uv.

uv sync
uv run server.py

That serves the specification at http://127.0.0.1:8082/mcp. Use --port to listen elsewhere, --host to bind another interface, and --stdio for clients that only speak stdio.

Connect a client

Any MCP client, any number of them at once. For Claude Code:

claude mcp add --transport http tank-spec http://localhost:8082/mcp

Add --scope project to record it in the repository you're building in, so everyone working on that build gets the same specification. Then /mcp to confirm the connection, and the client can ask the server what tools exist and how to call them — nothing here needs configuring per client.

Tools

Tool

Answers

list_sections()

What's in the spec, one line each — start here

get_spec(section)

One section, or a dotted path like entities.bullet.damage

search_spec(query)

"Does X happen?" — finds the rule that decides it

resolve_level(level)

What level N means: total enemies, max concurrent, spawn interval, which maze

get_maze(level)

That level's brick layout, expanded into tiles, with an ASCII picture

propose_spec(path, question, …)

Files a gap a client hit — a question for a human, not an answer

list_proposals(status)

What's been raised and not yet ruled on

open_questions()

What the spec deliberately hasn't decided, plus the pending queue

What this server deliberately does not do

It has no idea who is connected or what they are building, and that is on purpose. It knows about the specification; clients know about the server. Nothing points the other way.

So checking whether an implementation still matches the spec is the client's job. A client can read the values out of its own code and compare them against what these tools return — it is sitting in that repository and the server is not. A server that reached into a checkout to inspect it would have to know the language, the file layout and the path, and would need updating every time another implementation appeared.

The same reasoning is why the spec is served rather than shipped as a file:

  • It's outside every implementation. A session working in one repository can't read another's files, but it can call a service.

  • It's queried, not dumped. search_spec("friendly fire") returns one rule. Loading the whole specification into a model's context to answer one question is exactly the waste this avoids.

  • Some answers are computed, not stored. Levels are generated from a ramp formula — level 6 exists in no file. resolve_level is the only correct way to ask, and its integer truncation is load-bearing: a floating-point version disagrees at four of the eight levels.

When the spec doesn't cover it

A specification is never finished, and the gaps are where an assistant quietly invents something. propose_spec gives that impulse somewhere to go that isn't the source of truth:

propose_spec(
  path      = "rules.tank_reverse",
  question  = "Can a tank reverse without turning to face the new direction?",
  suggestion= "It cannot — movement always turns the tank first",
  rationale = "A build with free rotation would answer this differently",
)

The proposal lands in proposals/ as its own file, marked pending. It does not become part of the specification, and the tool says so in its result, in its description, and in the server's connection instructions — a client that files one is expected to tell the user and ask, not to build on it.

Deliberate limits, all of them the same limit:

  • Clients propose; only a person ratifies. Accepting means a human editing spec/game-spec.yaml. If clients could answer their own questions, two of them would answer differently and you would be back to the drift the spec exists to prevent — except now it would look authoritative.

  • Proposing against something already specified is recorded as a challenge and returns the current value. Until a human agrees, the current value stands.

  • A second proposal on the same path is refused, and returns the first, so a question gets asked once rather than by every client that trips over it.

  • Pending proposals surface in open_questions so other clients can see the question has been raised — clearly marked as carrying no authority.

proposals/README.md covers the human side: accept, decline, or leave it pending, which is itself an answer.

Destructible brick and per-level mazes

Everything inside the border is brick, and brick can be shot away — by both sides, since sides matter for tanks and never for walls. A tile is 20x20 and takes 40 damage, so two standard bullets open a hole that tanks then drive through. The border itself is immune.

Each level has its own maze, so the level number is the only difficulty knob: it sets how many enemies arrive, how fast, and the terrain they arrive into. Level 1 is nearly open; level 8 is dense enough that shooting a path is usually faster than finding one.

get_maze(level) returns the rectangles, the expanded tile list, and a picture:

########################################
#EE................EE................EE#
#EE................EE................EE#
#......................................#
#......BBBBBBBBBBB....BBBBBBBBBBB......#
...
#.............AA...AA...AA.............#
########################################

Use the expanded tiles rather than expanding the rectangles yourself — that step, and the rule for which tile a bullet damages when it straddles two, are where two builds most easily end up digging different holes from the same shots.

Adding a maze is just adding rectangles under mazes.levels in the YAML. The test suite then holds it to the invariants that make a level playable: tile-aligned, inside the area, non-overlapping, spawn and ally boxes clear, and every entry point reachable on foot without destroying anything — digging is a shortcut, never a requirement.

Editing the spec

spec/game-spec.yaml is the whole thing, and it's meant to be edited by hand — that's the point. The server re-reads it on every call, so a change takes effect immediately without restarting anything.

The specification was seeded from a working implementation and is independent of it from that point on. It leads: change a value here first, then make the implementations follow.

Tests

uv run pytest

tests/test_spec.py pins the spec's values and holds every maze to the playability invariants. tests/test_server.py drives the server through an MCP client — discover the tools, read their descriptions, call them. tests/test_http.py starts the real process on a port and connects to it over HTTP, the way a client does. tests/test_proposals.py covers the queue, including the property that matters most: a proposal never changes what the specification says.

Layout

spec/game-spec.yaml   the specification — the actual source of truth
server.py             MCP server: tool definitions, their descriptions, and the transport
tank_spec/spec.py     loading, searching, level maths, maze expansion
tank_spec/proposals.py  the proposal queue — questions clients raised, never answers
proposals/            one file per proposal, awaiting a human decision
tests/                spec and maze invariants, proposals, MCP integration, HTTP transport

Available Tools

6 tools
get_mazeA

Get a level's brick layout: the rectangles, and those rectangles expanded into the exact 20x20 tiles the level starts with.

Every level has its own maze, and all of the brick in it is destructible — bullets from either side chew through it, so the terrain changes as a round is played. Border walls are separate and indestructible.

Use the expanded tile list rather than expanding the rectangles yourself: that expansion is the step two implementations most easily get subtly different, and a one-tile disagreement changes which shots open a route.

Args: level: The level number. Out-of-range values are clamped. ascii_map: Include a picture of the layout — '#' border, 'B' brick, 'E' enemy entry point, 'A' ally start. Useful for checking a build renders the level you think it does; set false to save context.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelYes
ascii_mapNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses that all bricks are destructible and terrain changes during play, and that border walls are indestructible. It also notes that out-of-range level values are clamped, which is a behavioral trait. However, it doesn't mention the return format or any potential side effects, but given the tool is a read operation, this is adequate.

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?

The description is well-structured with a clear opening, a rationale for using the expanded tiles, and a concise Args section. Every sentence adds value, and it's appropriately sized for the tool's complexity.

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?

Given the tool has an output schema (not shown but mentioned), the description doesn't need to explain return values. It covers the key aspects: what the tool returns, why to use it, parameter semantics, and behavioral notes. The description is complete for an agent to select and invoke the tool correctly.

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 0%, so the description must compensate. It explains the 'level' parameter (level number, out-of-range clamped) and 'ascii_map' (include a picture, useful for checking build, set false to save context). This adds meaning beyond the schema's basic types and defaults.

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 clearly states the tool's purpose: to get a level's brick layout as rectangles and expanded 20x20 tiles. It specifies the resource (level maze) and the action (get), and distinguishes it from siblings by focusing on the brick layout, while siblings like list_sections and get_spec handle other aspects.

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?

The description explicitly advises using the expanded tile list rather than expanding rectangles manually, explaining the risk of subtle differences. It also provides guidance on when to set ascii_map to false to save context, and mentions that border walls are separate and indestructible, which helps the agent understand the tool's output.

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

get_specA

Return one section of the Tank Fight specification as JSON.

Use this to get the authoritative numbers and rules before implementing a feature — screen size, tank and bullet stats, wall layout, controls, AI parameters, and so on. Do not infer these values from an existing implementation and do not invent them; this file is what the implementations are supposed to agree with.

Args: section: A section name from list_sections, or a dotted path to go straight to a value, e.g. "entities.bullet" or "ai.enemy.turn_chance_per_tick".

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It adds crucial context: the spec is authoritative, and it explicitly warns against inferring values from existing implementations. However, it does not mention error handling or behavior for invalid section names, so it's not fully transparent on edge cases.

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?

The description is compact and front-loaded, with a clear one-sentence summary followed by usage guidance and a well-formatted Args section. Every sentence adds value, and the formatting makes it easy to scan.

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 simple single-parameter tool with an output schema, the description is complete: it explains the purpose, parameter format, and authoritative nature of the data. It appropriately references list_sections for valid section names and provides examples of dotted paths. No additional return-value details are needed given the output schema.

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

Parameters5/5

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

The input schema only declares 'section' as a string with no description, so the description provides all parameter semantics. It explains that the value can be a section name from list_sections or a dotted path, with concrete examples like 'entities.bullet'. This is essential information not available from the schema alone.

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 opens with 'Return one section of the Tank Fight specification as JSON,' which is a specific verb+resource statement. It also explains the use case ('before implementing a feature') and distinguishes itself from sibling tools by focusing on retrieving a named section of the specification.

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

Usage Guidelines4/5

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

It clearly states when to use the tool ('before implementing a feature') and warns against inferring or inventing values, which provides strong context. However, it does not explicitly name alternative tools or exclusions beyond referencing list_sections for section names, so it stops short of the explicit alternative guidance found in a 5.

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

list_sectionsA

List the sections of the Tank Fight specification, with a one-line summary of each, so you can fetch only the part you need.

Start here when you don't yet know where a rule lives. Fetching the whole spec is rarely necessary and wastes context.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden. It clearly discloses that the tool returns a section list with summaries rather than full content, and frames itself as a navigation helper. For a simple read-only listing tool, this is sufficient behavioral context.

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?

The description is two sentences long, front-loaded with the core purpose, and every phrase earns its place. It avoids filler while adding practical usage context.

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 zero-parameter listing tool with an output schema, the description is complete: it says what the tool returns, why to use it, and when to start with it. It sufficiently covers the low-complexity context.

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?

The tool has zero parameters and schema coverage is effectively 100%, so no parameter explanation is needed. The baseline of 4 applies because there is no param information to compensate for.

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 clearly identifies the action ('List the sections'), the resource ('Tank Fight specification'), and the output form ('with a one-line summary of each'). It also differentiates from siblings by positioning this as the starting point for locating rules before fetching a specific part.

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

Usage Guidelines4/5

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

It gives explicit guidance: 'Start here when you don't yet know where a rule lives' and warns that 'Fetching the whole spec is rarely necessary and wastes context.' It lacks an explicit contrast with search_spec, which is a sibling that may be a better alternative when users know search terms.

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

open_questionsA

List the design decisions the specification deliberately has NOT made.

Check this before inventing an answer to something the spec is silent on. If your question is here, the honest answer is "not decided yet" — say so and ask, rather than picking something and moving on. Anything on this list is a place where two implementations will otherwise diverge.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

The description adds behavioral context: the tool returns a list of open items and hints that these are places where implementations diverge. However, no annotations are provided, so the description carries the burden. It does not state whether the list is static or generated, or any caching/rate limits, but for this kind of read-only tool, it is adequate. No contradiction.

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?

Four short paragraphs, each earning its place: purpose, timing, action on hit, consequence. No fluff, front-loaded with the core action.

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

Completeness4/5

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

For a simple zero-parameter tool, the description fully explains when and how to use it and what it returns. It doesn't describe output format, but an output schema exists, so that's not needed. It is complete for its complexity.

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?

The tool has zero parameters and schema coverage is 100%, so the description has little to add. The description explains what the output represents (open design decisions), adding semantic meaning beyond the empty schema. Baseline for 0 params is 4, and it meets that.

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 clearly states the tool lists design decisions left open by the specification. It uses specific verb 'List' and resource 'design decisions', and distinguishes it from sibling tools like list_sections or get_spec by focusing on unresolved questions.

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?

Provides explicit guidance: check this tool before inventing an answer, and what to do if a question is here (say 'not decided yet' and ask). It implies when not to use (when question is not listed, it may be intentionally handled elsewhere).

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

resolve_levelA

Resolve what a level number actually means: how many enemy tanks the round fields in total, how many may be alive at once, and how often they arrive.

Levels are GENERATED from a ramp formula, not stored anywhere, so this cannot be answered by reading a file — call this tool instead of computing it yourself, because the formula truncates with integer division and a floating-point version disagrees at several levels.

The result also names the level's maze; call get_maze for its actual layout.

Args: level: The level number. Out-of-range values are clamped to the supported range rather than rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals important traits: integer division with truncation, potential disagreement with floating-point calculations, and clamping behavior for out-of-range values. It also states what the result includes without exposing unnecessary details. This goes beyond a generic description and provides genuinely useful edge-case information.

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?

The description is appropriately concise, with a clear lead sentence, a paragraph explaining rationale, and a compact Args section. Every sentence earns its place—no filler or redundancy. The structure (purpose, why, related tool, parameter details) is logical and easy to scan.

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?

Given the tool's simplicity (one parameter) and the presence of an output schema, the description covers all necessary aspects: what it computes, why it's needed, how parameters behave, and what the output references (maze). It does not omit critical context and does not need to detail return types because an output schema is provided.

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

Parameters5/5

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

The schema has no description for the 'level' parameter (0% coverage), so the description must compensate. The Args section does this effectively by explaining the parameter's meaning and its clamping behavior, which is not present in the schema. This fully addresses potential confusion and guides correct usage.

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 clearly states the tool's purpose with a specific verb ('Resolve') and a detailed resource ('what a level number actually means: how many enemy tanks the round fields in total, how many may be alive at once, and how often they arrive'). It distinguishes itself from siblings by mentioning get_maze for maze layout and contrasting with reading a file. This is more than just a restatement of the name—it provides concrete capabilities.

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?

The description explicitly tells when to use this tool instead of alternatives: 'Levels are GENERATED from a ramp formula, not stored anywhere, so this cannot be answered by reading a file — call this tool instead of computing it yourself'. It also directs to a sibling ('call get_maze for its actual layout'). This gives clear decision guidance, exceeding basic when-to-use.

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

search_specA

Search the specification for the rule or value that answers a question.

Use this whenever you are about to assume how the game behaves — "do bullets stop at walls?", "can allies shoot each other?", "how fast is a bullet?", "what happens when a player is destroyed?". Searching costs far less context than loading whole sections, and the answer is authoritative.

If the search comes back empty, the spec may genuinely not cover it: check open_questions() before deciding anything yourself.

Args: query: Plain words describing what you need, e.g. "friendly fire" or "spawn interval" or "health bar colour".

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden. It explains the tool is a read-only search ('costs far less context than loading whole sections') and the behavior on empty results (spec may not cover it, check open_questions). This adds transparency about the search's scope and fallback, though it doesn't detail return format or limits.

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?

The description is appropriately concise, using a short intro, a usage guideline paragraph, and a parameter explanation. Every sentence adds value, and it is front-loaded with the core purpose.

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?

The tool is simple (one parameter) and the description covers purpose, usage, fallback behavior, and parameter semantics. The output schema exists, so return values don't need explanation. It is complete for a search tool.

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 0%, so the description must compensate. It explains the 'query' parameter with examples: 'Plain words describing what you need, e.g. "friendly fire" or "spawn interval" or "health bar colour".' This adds meaningful guidance beyond the schema's bare string type.

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 clearly states the tool's purpose: 'Search the specification for the rule or value that answers a question.' It uses a specific verb ('search') and resource ('the specification'), and provides concrete examples of questions it answers, distinguishing it from sibling tools like list_sections or get_spec.

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?

The description explicitly guides when to use this tool: 'Use this whenever you are about to assume how the game behaves'. It contrasts with alternatives by noting that searching costs less context than loading whole sections. It also provides a clear fallback: if the search comes back empty, check open_questions() before deciding anything yourself.

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. 6 tool updatesv0.1.0
    • First observedget_maze
    • First observedget_spec
    • First observedlist_sections
    • First observedopen_questions
    • First observedresolve_level
    • First observedsearch_spec

TDQS

A4.7/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a distinct purpose: listing sections, getting a section, searching the spec, resolving level semantics, retrieving maze layouts, and listing open questions. No overlaps or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (list_, get_, search_, resolve_, open_), making the API predictable and easy to navigate.

Tool Count5/5

Six tools is well-scoped for a specification server, covering all necessary access patterns without unnecessary redundancy or bloat.

Completeness5/5

The tool set fully covers the domain: discovering, retrieving, searching, interpreting, and visualizing spec details, plus handling open questions. No obvious gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    A read-only MCP server for navigating OpenAPI / Swagger specifications, enabling agents to search endpoints, retrieve parameters and schemas, and inspect authentication without loading the full spec into context.
    9
    19 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Exposes the canonical 17-0 knowledge surface including game rules, roster constraints, and entry points for the NFL roster strategy game to MCP-compatible AI clients.
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Read-only, deterministic MCP server for the WebAssembly core specification, enabling querying of instructions, types, sections, proposals, and spec text via tools like instruction_get, section_get, and spec_search.
    9
    31 npm
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Read-only MCP server exposing the 20-0 NFL perfect season game knowledge surface, including game modes, roster picks, scenarios, FAQ, and official links to AI clients.
    2
    MIT