# TestGraph (io.github.BBCBasic/testgraph): tool descriptions scored

- tools/list taken: 2026-11-02 (UTC)
- From: [Official MCP Registry](https://registry.modelcontextprotocol.io/v0/servers/io.github.BBCBasic%2Ftestgraph/versions/latest)
- Connected to: https://testgraph.21dle.co.uk/mcp-v2
- Repository: https://github.com/BBCBasic/TestGraph
- Scoring rules: v2
- Tools: 37
- Average: 51.9 / 100 (Cloudy)
- Near-identical pairs: 4

This page shows how TestGraph (io.github.BBCBasic/testgraph)'s tool descriptions scored, the issues found and the names of its tools and parameters. The descriptions are the server's own: read them where the copy came from.

Forecall asked the URL this server lists in the official MCP Registry for its tools/list once, on the date above, without calling any tool. The server may have changed since.

## Across the server

- Minor: 37 tools. Above 25, models start to tell tools apart less well.
- Minor: The server's instructions are 6673 characters. Claude Code reads only the first 2,048 by default (Codex 0.154.0 reads them whole). Put what the server is for first.

## Tools

- `retire_type_relationship`: 31 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: source_type, relationship, target_type, reason.
  - Minor: String arguments with no constraint or example: source_type, target_type.
  - Minor: Says nothing about what it returns.
- `resolve_subject_type`: 32 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: term.
  - Minor: String arguments with no constraint or example: term.
  - Minor: Says nothing about what it returns.
- `fetch`: 34 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: id.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: id. Name the tool or the place that returns it, or models look it up first.
- `resolve_location_assertion`: 34 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: assertion_id, decision, rationale, user_approved, idempotency_key.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: The meaning of the boolean argument user_approved is unclear.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: assertion_id. Name the tool or the place that returns it, or models look it up first.
- `reopen_subject_classification`: 36 / 100
  - Major: Arguments without a description: subject_id, trigger, reason, evidence, user_approved.
  - Minor: The meaning of the boolean argument user_approved is unclear.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `claim_deliberation`: 37 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: deliberation_id, source_model, idempotency_key.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: deliberation_id. Name the tool or the place that returns it, or models look it up first.
- `get_subject_classification`: 39 / 100
  - Major: Arguments without a description: subject_id.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `list_my_workflows`: 39 / 100
  - Major: Arguments without a description: limit.
  - Minor: No `required` list, so every argument is optional.
  - Minor: Says nothing about what it returns.
- `get_location_assertions`: 41 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: subject_id.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `list_my_mcp_interactions`: 41 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: limit.
  - Minor: No `required` list, so every argument is optional.
- `get_deliberation`: 42 / 100
  - Major: Arguments without a description: id, canonical_key.
  - Minor: No `required` list, so every argument is optional.
  - Minor: Says nothing about what it returns.
- `list_open_deliberations`: 42 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: unclaimed_only, limit.
  - Minor: No `required` list, so every argument is optional.
  - Minor: The meaning of the boolean argument unclaimed_only is unclear.
  - Minor: Says nothing about what it returns.
- `record_resolution`: 44 / 100
  - Major: Arguments without a description: deliberation_id, resolution, rationale, accepted_contribution_ids, unresolved_points, user_approved, idempotency_key.
  - Minor: String arguments with no constraint or example: rationale.
  - Minor: The meaning of the boolean argument user_approved is unclear.
  - Minor: Says nothing about what it returns.
- `set_review_visibility`: 44 / 100
  - Major: Says nothing about when to use it, or when not to.
  - Major: Arguments without a description: experience_id, visibility.
  - Minor: Required identifiers whose description does not say where the value comes from: experience_id. Name the tool or the place that returns it, or models look it up first.
- `register_field`: 47 / 100
  - Major: Arguments without a description: canonical_name, json_schema, description, aliases, subject_types.
  - Minor: String arguments with no constraint or example: canonical_name, description.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: Says nothing about what it returns.
- `submit_contribution`: 47 / 100
  - Major: Arguments without a description: deliberation_id, contribution_type, content, evidence, confidence, unresolved_points, responds_to_contribution_ids, source_model, idempotency_key.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: deliberation_id. Name the tool or the place that returns it, or models look it up first.
- `resolve_subject`: 48 / 100
  - Major: Arguments without a description: subject_type, canonical_key, name, identifier_value, identifier_key, limit.
  - Minor: String arguments with no constraint or example: subject_type.
  - Minor: No `required` list, so every argument is optional.
  - Minor: Says nothing about what it returns.
- `create_deliberation`: 52 / 100
  - Major: Arguments without a description: canonical_key, title, question, context, constraints, acceptance_criteria, idempotency_key.
  - Minor: Says nothing about what it returns.
- `delete_experience`: 52 / 100
  - Major: Arguments without a description: id, delete_orphan_subject, confirm_deletion, idempotency_key.
  - Minor: The description mentions none of its 3 or more arguments.
  - Minor: The meaning of the boolean argument delete_orphan_subject is unclear.
  - Minor: The meaning of the boolean argument confirm_deletion is unclear.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: id. Name the tool or the place that returns it, or models look it up first.
- `register_subject_type_alias`: 52 / 100
  - Major: Arguments without a description: subject_type, alias.
  - Minor: String arguments with no constraint or example: subject_type, alias.
  - Minor: Says nothing about what it returns.
- `affirm_subject_classification`: 53 / 100
  - Major: Arguments without a description: subject_id, reason, evidence, evidence_fingerprint.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `list_reviews_by_visibility`: 57 / 100
  - Major: Arguments without a description: visibility.
- `propose_subject_reclassification`: 57 / 100
  - Major: Arguments without a description: subject_id, target_subject_type, reason, evidence, evidence_fingerprint.
  - Minor: Says nothing about what it returns.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `list_root_subject_types`: 58 / 100
  - Major: Arguments without a description: limit, cursor, relationship.
  - Minor: String arguments with no constraint or example: cursor.
  - Minor: No `required` list, so every argument is optional.
- `list_child_subject_types`: 59 / 100
  - Major: Arguments without a description: parent, limit, cursor, relationship.
  - Minor: String arguments with no constraint or example: cursor.
  - Minor: Required identifiers whose description does not say where the value comes from: parent. Name the tool or the place that returns it, or models look it up first.
- `set_type_relationship`: 59 / 100
  - Major: Arguments without a description: source_type, relationship, target_type, peer_decision, peer_decision.decision, peer_decision.reason.
  - Minor: String arguments with no constraint or example: source_type, target_type.
  - Minor: Says nothing about what it returns.
- `assert_location`: 61 / 100
  - Major: Arguments without a description: subject_id, predicate, object_place, object_place.subject_id, object_place.name, object_place.canonical_key, object_place.identifiers, object_place.place_kind, value, qualifiers, source, observed_at, valid_from, valid_to, visibility, idempotency_key.
  - Minor: String arguments with no constraint or example: object_place.name, object_place.canonical_key, object_place.place_kind.
  - Minor: Required identifiers whose description does not say where the value comes from: subject_id. Name the tool or the place that returns it, or models look it up first.
- `search`: 61 / 100
  - Major: Arguments without a description: query, subject_type, include_related, limit.
  - Minor: String arguments with no constraint or example: subject_type.
  - Minor: No `required` list, so every argument is optional.
  - Minor: The meaning of the boolean argument include_related is unclear.
- `resolve_subject_hierarchy`: 62 / 100
  - Major: Arguments without a description: terms, peer_decisions, peer_decisions[].term, peer_decisions[].decision, peer_decisions[].existing_type, peer_decisions[].reason, peer_decisions[].term, peer_decisions[].decision, peer_decisions[].reason.
  - Minor: Says nothing about what it returns.
- `correct_subject_fact`: 64 / 100
  - Major: Arguments without a description: subject_id, field_root, expected_value, corrected_value, evidence_sources, reason, idempotency_key.
- `get_subject_type_path`: 64 / 100
  - Major: Arguments without a description: subject_type, relationship.
- `save_assessment`: 64 / 100
  - Major: Arguments without a description: experience_id, assessment_type, evidence, analysis, conclusion, confidence, source_model, idempotency_key.
  - Minor: String arguments with no constraint or example: assessment_type, conclusion, source_model.
  - Minor: Required identifiers whose description does not say where the value comes from: experience_id. Name the tool or the place that returns it, or models look it up first.
- `get_induction`: 68 / 100
  - Minor: No `required` list, so every argument is optional.
- `vocabulary_index`: 69 / 100
  - Minor: Says nothing about what it returns.
- `get_server_info`: 74 / 100
- `save_experience`: 77 / 100
  - Minor: The description is long (884 words). It helps selection but costs steps and tokens.
  - Major: Arguments without a description: subject_type, subject_name, canonical_key, source_model, identifiers, subject_attributes, subject_provenance, subject_enrichment_check.status, subject_enrichment_check.sources, subject_enrichment_check.attempts, subject_enrichment_check.reason, subject_enrichment_check.candidate_identities, collection_assessment.status, collection_assessment.collection_id, collection_assessment.manifest_revision, collection_assessment.refresh_manifest, collection_assessment.collection_name, collection_assessment.collection_type, collection_assessment.directory_url, collection_assessment.discovered_count, collection_assessment.submitted_member_refs, collection_assessment.source_manifest.coverage_method, collection_assessment.source_manifest.declared_source_count, collection_assessment.source_manifest.source_pages, collection_assessment.source_manifest.source_pages[].url, collection_assessment.source_manifest.source_pages[].source_kind, collection_assessment.source_manifest.source_pages[].sequence, collection_assessment.source_manifest.source_pages[].member_refs, collection_assessment.source_manifest.source_pages[].next_url, collection_assessment.source_manifest.source_pages[].terminal, collection_assessment.source_manifest.discovery_queries, collection_assessment.source_manifest.exhaustion_evidence, collection_assessment.source_manifest.unresolved_source_urls, collection_assessment.evidence_sources, collection_assessment.attempts, collection_assessment.reason, collection_assessment.candidate_collections, collection_assessment.checked_at, headline, summary, raw_text, structured_data, experienced_at, subject_context.subjects, subject_context.subjects[].ref, subject_context.subjects[].subject_type, subject_context.subjects[].name, subject_context.subjects[].canonical_key, subject_context.subjects[].identifiers, subject_context.subjects[].attributes, subject_context.subjects[].provenance, subject_context.relationships, subject_context.relationships[].source_ref, subject_context.relationships[].relationship, subject_context.relationships[].target_ref, subject_context.relationships[].provenance, visibility, user_approved, idempotency_key.
  - Minor: String arguments with no constraint or example: subject_type, subject_name, canonical_key, headline, summary, subject_context.subjects[].subject_type, subject_context.subjects[].name, subject_context.subjects[].canonical_key, subject_context.relationships[].source_ref, subject_context.relationships[].relationship, subject_context.relationships[].target_ref.
  - Minor: The meaning of the boolean argument collection_assessment.refresh_manifest is unclear.
  - Minor: The meaning of the boolean argument collection_assessment.source_manifest.source_pages[].terminal is unclear.
  - Minor: The meaning of the boolean argument user_approved is unclear.
- `enrich_subject`: 78 / 100
  - Minor: The description is long (536 words). It helps selection but costs steps and tokens.
  - Major: Arguments without a description: subject_type, canonical_key, source_model, identifiers, attributes, provenance, subject_context.subjects, subject_context.subjects[].ref, subject_context.subjects[].subject_type, subject_context.subjects[].name, subject_context.subjects[].canonical_key, subject_context.subjects[].identifiers, subject_context.subjects[].attributes, subject_context.subjects[].provenance, subject_context.relationships, subject_context.relationships[].source_ref, subject_context.relationships[].relationship, subject_context.relationships[].target_ref, subject_context.relationships[].provenance, idempotency_key, subject_enrichment_check.status, subject_enrichment_check.sources, subject_enrichment_check.attempts, subject_enrichment_check.reason, subject_enrichment_check.candidate_identities, collection_assessment.status, collection_assessment.collection_id, collection_assessment.manifest_revision, collection_assessment.refresh_manifest, collection_assessment.collection_name, collection_assessment.collection_type, collection_assessment.directory_url, collection_assessment.discovered_count, collection_assessment.submitted_member_refs, collection_assessment.source_manifest.coverage_method, collection_assessment.source_manifest.declared_source_count, collection_assessment.source_manifest.source_pages, collection_assessment.source_manifest.source_pages[].url, collection_assessment.source_manifest.source_pages[].source_kind, collection_assessment.source_manifest.source_pages[].sequence, collection_assessment.source_manifest.source_pages[].member_refs, collection_assessment.source_manifest.source_pages[].next_url, collection_assessment.source_manifest.source_pages[].terminal, collection_assessment.source_manifest.discovery_queries, collection_assessment.source_manifest.exhaustion_evidence, collection_assessment.source_manifest.unresolved_source_urls, collection_assessment.evidence_sources, collection_assessment.attempts, collection_assessment.reason, collection_assessment.candidate_collections, collection_assessment.checked_at.
  - Minor: String arguments with no constraint or example: subject_type, canonical_key, subject_context.subjects[].subject_type, subject_context.subjects[].name, subject_context.subjects[].canonical_key, subject_context.relationships[].source_ref, subject_context.relationships[].relationship, subject_context.relationships[].target_ref.
  - Minor: The meaning of the boolean argument collection_assessment.refresh_manifest is unclear.
  - Minor: The meaning of the boolean argument collection_assessment.source_manifest.source_pages[].terminal is unclear.

Is your server listed here and you would rather it were not? Email support@forecall.dev, and we will take it off within 7 days.

[All scored servers](https://forecall.dev/en/servers)
