Skip to main content
Glama

space-standards-mcp

An MCP server (and a thin optional agent) that answers questions about ECSS and NASA space standards with exact, requirement-level citations: every result names the document, issue and requirement ID, or the answer is "not covered". You bring the standards; nothing from them is stored in this repository. It is aimed at launcher and payload-fairing structures first (factors of safety, fracture control, loads, shock, vibroacoustics) and is built to grow to the whole ECSS and NASA set.

Independent project. Not affiliated with or endorsed by the European Space Agency (ESA), the ECSS Secretariat or NASA. The ECSS, ESA and NASA names and the names of their standards belong to their owners and are used here only to identify the documents the software works with.

60-second demo (invented fixtures)

The repository ships three invented demo standards and a demo handbook in tests/fixtures/ (made-up text and numbers, so you can try everything without any real document).

git clone https://github.com/manojknaikade/space-standards-mcp.git && cd space-standards-mcp
python -m venv .venv && source .venv/bin/activate      # Python 3.11+
pip install -e ".[dev]"
pytest -q                                              # fixture tests; real-document tests skip without documents/

# retrieval eval on the demo standards: expected recall@5 1.00 over 4 questions
python eval/run_retrieval_eval.py --docs tests/fixtures --questions eval/demo_questions.yaml

# the MCP server over the demo standards (stdio; an MCP client talks to it)
SPACESTD_DOCS=tests/fixtures python -m spacestd.server

Connect a client (below) to that server and ask, for example, "which factor of safety applies to a metallic fairing in DEMO-E-ST-98C?". The answer comes back with a citation such as DEMO-E-ST-98C Rev.2, 4.1.2a.

Related MCP server: RAG MCP Server

Use your own documents

No standards text is distributed here. Download the documents yourself and put them in documents/ (gitignored) or any folder you point SPACESTD_DOCS at:

  • ECSS: https://ecss.nl (free registration); Word or PDF.

  • NASA: the NASA Technical Standards System, https://standards.nasa.gov. python scripts/download_nasa_standards.py documents/nasa fetches the public ones politely (robots.txt, one request every 2 s); --dry-run only lists them.

Then:

python -m spacestd.catalogue documents      # what was found, and what is loaded
python -m spacestd.health documents         # parse every document, set its tier, write eval/CORPUS_HEALTH.md

documents/corpus.yaml selects what is loaded (doc-ID patterns with *, see ADR-0006); without it only files directly in documents/ load:

load:
  - ECSS-E-ST-32*
  - NASA-STD-5*

File naming, sidecar metadata and formats (PDF preferred; Word files need LibreOffice) are described in documents/README.md. Parsed documents are cached in documents/.spacestd-cache/. The standards remain subject to their publishers' terms of use.

Install without a clone

The package is on PyPI:

uvx space-standards-mcp
pipx install space-standards-mcp

The latest development version installs from git: pipx install git+https://github.com/manojknaikade/space-standards-mcp.

The space-standards-mcp command starts the server (stdio) and reads SPACESTD_DOCS.

Connect an MCP client

Use an absolute path to the Python that has the package installed, and to your documents folder.

With uvx, a client can start the server without a local install, e.g. in Claude Desktop: {"command": "uvx", "args": ["space-standards-mcp"], "env": {"SPACESTD_DOCS": "/abs/path/to/documents"}}.

Claude Code

claude mcp add space-standards --env SPACESTD_DOCS=/abs/path/to/documents -- /abs/path/to/.venv/bin/python -m spacestd.server

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "space-standards": {
      "command": "/abs/path/to/.venv/bin/python",
      "args": ["-m", "spacestd.server"],
      "env": { "SPACESTD_DOCS": "/abs/path/to/documents" }
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "space-standards": {
      "type": "stdio",
      "command": "/abs/path/to/.venv/bin/python",
      "args": ["-m", "spacestd.server"],
      "env": { "SPACESTD_DOCS": "/abs/path/to/documents" }
    }
  }
}

Tools

Tool

What it does

list_documents

Loaded standards and issues with family, type, discipline, parse tier, record counts and tables; filters; can also list documents present but not loaded

get_requirement

Exact record for a document and requirement ID

search_requirements

BM25 keyword search over requirements and table rows, with neighbouring records per hit; reports named standards that are not loaded

get_table

A table (e.g. factors of safety) as structured rows with labels, cell text, parsed value and footnotes

get_references

Standards and clauses a requirement points to

compare_topic

One topic searched separately in each standard, grouped ECSS / NASA, with a coverage rating per standard

get_section_outline

A standard's table of contents; for one clause its record IDs and tables (no requirement text)

Every record carries its kind (requirement, recommendation, permission, guidance, deleted) and a citation.

Optional: hybrid search and the agent

pip install -e ".[embed]" and SPACESTD_EMBED=default add embedding ranking fused with BM25 (opt-in, see eval/RESULTS.md). pip install -e ".[agent]" adds python -m spacestd_agent "<question>" --docs documents, the same tools in a tool-calling loop with a citation gate that checks each draft for invented IDs and numbers not found in the retrieved records (ADR-0005); it needs an Anthropic API key.

Parse tiers

Documents differ in how well they parse, so each carries a tier (ADR-0006):

  • verified: checked by hand against the source (requirement counts, IDs, tables).

  • checked: passes the automatic health checks (python -m spacestd.health), not reviewed by hand.

  • unchecked: parsed, but no check has passed; treat results as leads.

Records, tables and rows carry their tier and page. Numbers taken from tables of documents below verified come with a "check against the source, page N" flag, and the citation gate only accepts such a number when the answer repeats it. Always confirm a number in the source.

Evaluation and its limits

Two evals run on a 57-question set (17 numeric, 17 lookup, 7 classification, 5 compare, 11 not covered). Numbers from eval/RESULTS.md, on the 7 hand-verified standards:

Measure

Value

retrieval recall@5 / @20 (46 scored questions)

0.64 / 0.89 (0.74 at @5 counting neighbouring records)

table recall@5: row hit / reachable (10 questions)

0.50 / 0.85

answers, independent judge, plain client: correct / partial / wrong

52 / 4 / 1

answers, gated agent: correct / partial / wrong

49 / 7 / 1

invented requirement IDs

0

"not covered" questions declined without numbers

11 / 11

Limits: the question set is small and written by one author; the first 21 questions had domain review and the later additions did not; one model family answers and judges; retrieval is keyword-based and misses paraphrases (hybrid search helps only partly); and the figures say nothing about the many documents at tier checked or unchecked. Treat answers as aids for locating requirements, not as authority.

Disclaimer

  • No standards text is included. You download the standards yourself.

  • Answers are aids, not authority. They are not a substitute for the applicable standard in the issue your project is contracted to, with its tailoring. Verify any requirement, factor or test level against the source.

Project docs

Roadmap · Release plan · Project brief · Architecture · Decision records · Contributing · Security

Licence

The code is licensed under the Apache License 2.0; see also NOTICE and ADR-0007.

Available Tools

7 tools
compare_topicA
Read-only

Side-by-side search of one topic in several standards, e.g. ECSS vs NASA on factors of safety.

topic: the subject only, e.g. "ultimate design factor metallic structure" (no standard names). doc_ids: the standards to compare, e.g. ["ECSS-E-ST-32-10", "NASA-STD-5001"]; omit for all loaded. Returns one section per document, grouped by family (ECSS, NASA), with its top hits and the table rows they matched. Requested or named standards that are not loaded are listed as in search_requirements (not_loaded, in_documents_folder, not_in_documents_folder). coverage: "weak" marks a document whose best hit is far below the best hit elsewhere: it may not treat the topic — say so rather than force an equivalence. Coverage is judged on keyword matches: read the hits, and use get_requirement / get_table before comparing.

NameRequiredDescriptionDefault
limitNo
topicYes
doc_idsNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover readOnly/openWorld, and the description adds rich behavioral detail beyond them: the grouped-by-family return format, the not_loaded / in_documents_folder / not_in_documents_folder reporting, the semantics of coverage: "weak", and the caveat that coverage is judged only on keyword matches.

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

Conciseness4/5

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

Front-loaded with the purpose and example, then per-parameter guidance, then return-shape notes. Dense but nearly every clause adds operational value; the return-format paragraph is slightly long but earns its place given no output schema.

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

Completeness5/5

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

Given no output schema and 0% param coverage, the description covers everything: purpose, argument conventions, return structure, coverage semantics, and how to follow up with sibling tools. An agent could call and interpret this correctly without opening anything else.

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?

Schema coverage is 0%, so the description must carry the burden and it does: it defines topic (subject only, no standard names), doc_ids (which standards, omit for all), and the example values for each. Only limit is not explained, but the critical parameters are fully disambiguated.

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?

Specific verb+resource: 'side-by-side search of one topic in several standards', with a concrete example (ECSS vs NASA on factors of safety). Naming the ECSS/NASA pairing and the compare-across-standards scope distinguishes it clearly from search_requirements.

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?

Explicitly instructs how to build the topic argument ('the subject only... no standard names'), when to omit doc_ids ('omit for all loaded'), and what to do with weak coverage ('say so rather than force an equivalence'). It even routes post-search work to get_requirement / get_table, giving explicit alternatives.

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

get_referencesB
Read-only

List the standards and clauses that a requirement (or its notes) refers to.

NameRequiredDescriptionDefault
doc_idYes
req_idYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and closed-world scope are covered. The description adds the useful nuance that references may come from the requirement's notes as well as the requirement itself, but does not mention pagination, ordering, or output shape.

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?

A single, front-loaded sentence with zero redundant wording. Nothing to trim.

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

Completeness3/5

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

Annotations cover the safety profile and there is no output schema, so return values needn't be explained. However, with two undocumented required parameters and no output/schema detail, the description is only minimally adequate for invoking the tool correctly.

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

Parameters2/5

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

Schema description coverage is 0% for both required parameters, so the description carries the full burden. It never explains what doc_id and req_id identify or how they relate (e.g., whether req_id is scoped to doc_id).

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

Purpose4/5

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

States a specific verb (List) and resource (standards and clauses that a requirement refers to). It distinguishes itself from siblings like get_requirement by focusing on outbound references rather than the requirement itself, though it doesn't name alternatives explicitly.

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

Usage Guidelines3/5

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

Usage is implied: call this to discover what a requirement cites. There's no explicit when/when-not guidance or named alternatives, but the scope is narrow enough that the intent is reasonably clear.

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

get_requirementA
Read-only

Get the exact text of one requirement.

doc_id: e.g. "ECSS-Q-ST-80C" or "ECSS-Q-ST-80" or "NPR 7150.2". req_id: ECSS clause + letter, e.g. "5.2.1a" (DRD content: "A.2.1<5.2>a"); NASA tag, e.g. "FSR 24", or an FCR item, e.g. "FCR 11 / 7.2.1.c"; untagged NASA standards: section + item, e.g. "4.2a", "4.3(1)", or the n-th "shall" paragraph of a section, e.g. "4.4 req 1". Records carry a kind: requirement, recommendation, permission, guidance or deleted — say which when answering.

NameRequiredDescriptionDefault
doc_idYes
req_idYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this a read-only, closed-world operation. The description adds genuinely new behavioral context by disclosing the record value domain (requirement, recommendation, permission, guidance, deleted) and instructing the agent to report which kind it is — useful since no output schema exists. It says nothing about not-found or ambiguous-ID behavior.

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

Conciseness4/5

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

The one-line purpose is front-loaded, followed by compact labeled parameter examples. It is longer than the bare minimum but nearly every clause is a distinct ID-format case that earns its place.

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 two-required-parameter read operation with no output schema, the description covers inputs thoroughly and characterizes the returned content, including the record `kind` taxonomy. The only real gap is the absence of guidance on unmatched or ambiguous IDs.

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 carries the full burden, and it delivers: both doc_id and req_id are explained with concrete formats and examples across multiple naming conventions (ECSS, NASA, DRD content, FCR items, n-th "shall" paragraph). This is well above the baseline for an uncovered schema, though the grammar remains loose rather than exhaustive.

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

Purpose4/5

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

States a specific verb and resource ("Get the exact text of one requirement") with clear singular scope. It does not, however, explicitly distinguish itself from the sibling search_requirements, so an agent must infer that this is the exact-ID lookup rather than the discovery tool.

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

Usage Guidelines3/5

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

Usage is only implied: the heavy emphasis on precise ID formats signals that this tool is for when you already hold a doc_id/req_id. It never names search_requirements as the alternative, nor says what to do when exact IDs are unknown, so the agent must infer the routing.

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

get_section_outlineA
Read-only

Table of contents of one standard: clause numbers, titles and how many records (by kind) each holds.

doc_id: e.g. "ECSS-E-ST-32-01C" or "NASA-STD-5019A". clause: e.g. "7.2" to list that section and its subsections, plus the record IDs placed directly in it and the tables in it; omit for the whole document. depth: how many heading levels to list below the starting point (default 2). The outline has no requirement text: use get_requirement / get_table for anything you quote or cite.

NameRequiredDescriptionDefault
depthNo
clauseNo
doc_idYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: the outline contains no requirement text, which prevents an agent from mistakenly quoting it. It does not discuss pagination or output size for large standards.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, followed by compact per-parameter glosses and a single cautionary sentence. Given the 0% schema coverage, the parameter lines earn their place, though the text runs as one dense block rather than clearly delimited sections.

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?

There is no output schema, so the description must describe returns, and it does: clause numbers, titles, record counts by kind, the record IDs placed directly in a clause, and the tables in it. Combined with the clause/depth semantics and the pointer to text-retrieval siblings, an agent has everything needed to call it correctly.

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?

Schema description coverage is 0%, so the description must carry all parameter meaning, and it does: doc_id is given with two concrete example identifiers, clause is explained including the omit-for-whole-document behavior, and depth is defined as heading levels below the start with its default of 2. This fully compensates for the empty schema descriptions.

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 opening line states a concrete verb+resource: a table of contents for one standard, returning clause numbers, titles, and per-kind record counts. The closing sentence separates it from get_requirement and get_table by declaring that no requirement text is included, so an agent can distinguish it from siblings without opening a schema.

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

Usage Guidelines4/5

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

It clearly routes the agent to alternatives ('use get_requirement / get_table for anything you quote or cite') and explains the scope effect of the clause parameter (that section and its subsections). It lacks an explicit when-to-use versus list_documents or search_requirements, so it stops short of a full routing guide.

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

get_tableA
Read-only

Get a table (e.g. factors of safety) as structured rows, verbatim from the source.

doc_id: e.g. "ECSS-E-ST-32-10C" or "NASA-STD-5001B". table_id: e.g. "Table 4-3" or "4-3". Each row has row labels and value cells (text as printed, parsed value, footnote markers). Quote the cell text and its footnotes; 'spans_rows' marks a value printed once in a merged cell that covers several rows. The table and each row carry tier and page; below verified they also carry check ("check against the source, page N"): give every number from such a table with that flag (an answer that does not repeat it fails the citation check). Omit table_id (empty string) to list the tables of a document.

NameRequiredDescriptionDefault
doc_idYes
table_idNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only provide readOnlyHint and openWorldHint; the description adds rich behavioral detail: the row format (labels, value cells, parsed values, footnote markers), spans_rows for merged cells, tier/page/check metadata, citation-check requirements, and the empty-table_id listing mode.

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

Conciseness4/5

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

The description is information-dense and mostly front-loaded, with each sentence adding a distinct piece of behavior or parameter guidance. It is slightly long due to the necessary return-format and citation-check instructions, but not wasteful.

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

Completeness5/5

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

With no output schema and 0% schema description coverage, the description does the necessary work: it explains the return structure, special row attributes, citation rules, and the listing fallback. An agent has enough context to call and interpret the tool correctly.

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?

Schema description coverage is 0%, so the description must carry parameter meaning. It provides concrete examples for doc_id (e.g. 'ECSS-E-ST-32-10C') and table_id (e.g. 'Table 4-3' or '4-3'), and explains the empty-string default that lists a document's tables.

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

Purpose5/5

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

States a specific verb (Get), resource (table), and output form (structured rows, verbatim). It is clearly distinct from sibling tools like get_requirement and get_section_outline, which handle requirements and outlines rather than tabular data.

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

Usage Guidelines3/5

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

Usage is implied by the purpose, and the description explains that omitting table_id lists a document's tables. However, it does not explicitly say when to choose this tool over siblings like list_documents or search_requirements, nor does it state prerequisites for obtaining doc_id.

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

list_documentsA
Read-only

List the standards currently loaded: issue, title, family (ECSS / NASA), doc_type (standard, handbook, ...), discipline, record counts and parse tier ("verified": hand-checked against the source; "checked": passes the automatic parse health checks; "unchecked": parsed automatically — for both, check numbers against the source page before relying on them).

Filters (optional, case-insensitive): family "ECSS" or "NASA"; doc_type e.g. "handbook"; discipline as a code ("E-32", "Q-70", "NASA-5000") or a name ("structures"); query: words in the doc ID or title. include_not_loaded: also list standards in the user's documents folder that are not loaded (loaded: false). Their text is not available: never answer from them, but you may name one as the standard that would cover a question. Returns {"count", "documents"} (at most limit, plus "truncated" when more match).

NameRequiredDescriptionDefault
limitNo
queryNo
familyNo
doc_typeNo
disciplineNo
include_not_loadedNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover readOnly/openWorld, but the description adds substantial behavioral context: the meaning of each tier value, the warning that unchecked/checked numbers should be verified against the source page, that not-loaded documents have no available text, and that results are capped at `limit` with a `truncated` flag.

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

Conciseness4/5

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

Front-loaded with the resource and its attributes, then filters, then return shape. Dense parenthetical asides and semicolon chains make it slightly hard to scan, but nearly every clause carries information the agent needs.

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

Completeness5/5

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

With no output schema, the description supplies the return contract ('{"count", "documents"}', at most `limit`, plus `truncated`), the reliability caveats on tier, and the not-loaded semantics. An agent has everything needed to call and interpret this tool.

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?

Schema description coverage is 0%, so the description carries the full burden and does so: it documents family values, doc_type examples, discipline codes ('E-32', 'Q-70', 'NASA-5000') or names, query semantics, include_not_loaded behavior, and limit. Case-insensitivity is disclosed, which the schema does not express.

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

Purpose5/5

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

States a specific verb and resource ('List the standards currently loaded') and enumerates the concrete attributes returned (issue, title, family, doc_type, discipline, record counts, tier), so the agent knows exactly what this catalog view yields. This is clearly distinguishable from retrieval siblings like get_requirement or search_requirements.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance for every filter, tells the agent when to set include_not_loaded, and adds a hard constraint: 'never answer from them, but you may name one as the standard that would cover a question.' That is a genuine usage rule, not an implied one.

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

search_requirementsA
Read-only

Search across loaded requirements (BM25; hybrid with embeddings when the server enables it). Optionally restrict to one document.

query: REQUIRED search words, never empty, e.g. "ultimate factor of safety metallic structure" or "fracture control NASA-STD-5019". A call without search words returns no results.

Returns {"results": [...]} plus, when relevant, "not_loaded", "elsewhere" and "notes". Without doc_id, standards named in the query (e.g. "NASA-STD-5001B", "ECSS-E-ST-32-01") restrict the search to them. not_loaded lists named standards that are not loaded: never answer from them. It is split into in_documents_folder (present in the user's documents folder but not loaded, with issue and status: say so, and that they can be loaded through corpus.yaml) and not_in_documents_folder (the user does not have them). elsewhere holds stronger hits from other loaded documents when the named document matches weakly — it may not cover the topic. Table rows are searched too: a hit found through a table carries matched_table_row (table citation, row labels, cells) — take the numbers from there or from get_table, and cite both the requirement and the table. Records and rows carry tier (verified, checked, unchecked) and page; rows from tables below verified carry check: repeat it ("check against the source, page N") next to any number taken from them. Each hit may carry neighbours: the records next to it in the same clause (a requirement is often split over sibling letters). They are full records with citations; read them before concluding a clause is not covered.

NameRequiredDescriptionDefault
limitNo
queryYes
doc_idNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint; the description goes far beyond by documenting the response envelope (results, not_loaded, elsewhere, notes), the in_documents_folder vs not_in_documents_folder split with remediation via corpus.yaml, tier/check/page fields, and the neighbours mechanism. This is unusually rich behavioral disclosure, including the mandatory 'check against the source, page N' repetition rule.

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

Conciseness4/5

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

Purpose and the critical query constraint are front-loaded, and nearly every sentence carries operative instruction (citation rules, verification duties). It is dense and somewhat run-on, with backtick field names stacked across long sentences, but there is little true padding.

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 tool with no output schema and no parameter descriptions, the description supplies return shape, edge cases, and downstream citation obligations, so an agent has what it needs to interpret results correctly. The remaining gap is the unexplained limit parameter and any indication of result ordering or truncation.

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?

With 0% schema description coverage the description must carry all parameter meaning; it fully defines query (never empty, with example phrasings) and doc_id (scoping behavior, standard-name restriction semantics) far beyond the bare schema. The third parameter, limit, is never mentioned anywhere, leaving paging behavior undocumented.

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

Purpose5/5

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

States a specific verb+resource ('search across loaded requirements') and even names the retrieval mechanism (BM25, hybrid with embeddings when enabled). It is clearly distinguishable from siblings like get_requirement or compare_topic, which presuppose a citation or topic rather than a free-text query.

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?

Gives real routing guidance: restrict with doc_id or let standards named in the query scope the search, take numbers from matched_table_row or get_table, and never answer from not_loaded entries. It stops short of an explicit 'use X instead when Y' map against siblings such as get_requirement, so it is strong but not exhaustive.

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

Tool Schema Changelog

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

  1. 7 tool updatesv0.2.4
    • First observedcompare_topic
    • First observedget_references
    • First observedget_requirement
    • First observedget_section_outline
    • First observedget_table
    • First observedlist_documents
    • First observedsearch_requirements

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation4/5

Each tool targets a distinct retrieval unit (document list, single requirement, outline, table, references, cross-doc comparison), so selection is mostly unambiguous. The only mild overlap is between search_requirements and compare_topic, but the latter's multi-doc side-by-side framing and topic-only query make the boundary clear.

Naming Consistency5/5

All names follow a consistent snake_case verb_noun pattern (list_documents, get_requirement, get_table, search_requirements, compare_topic). No mixed conventions or vague verbs.

Tool Count5/5

Seven tools is well-scoped for a read-only standards corpus, with each tool earning its place by covering a different access granularity (list, search, outline, requirement, table, references, comparison). No redundancy or padding.

Completeness4/5

The surface covers the main read paths for a standards domain: discovery, search, drill-down to requirements/tables, references, and cross-standard comparison. Minor gap: no tool to load documents (only referenced via corpus.yaml), and no bulk export, but these are workable around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    B
    maintenance
    Local-first, read-only MCP server for retrieving and searching authorised CCSDS and ECSS standards, enabling citation-rich passage-level search and document access.
    3
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables document indexing and question answering with Retrieval-Augmented Generation, providing cited answers from user-supplied documents.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables retrieval and comparison of automotive regulations and standards, plus question answering where every answer must carry standard number, clause number, and original excerpt, with unsupported conclusions flagged for review. Java backends and Feishu can call it directly over MCP.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Spacecraft component specifications read from vendor datasheets (2,500+ products, 24 categories): search by engineering requirements, compare, budget mass and power, read datasheet digests and facts, find data gaps, and assemble a bus around parts you lock. Every value cites its datasheet page; missing data is named, never guessed.
    51 npm
    1
    MIT