Skip to main content
Glama

Save an approved review

save_experience
Idempotent

Save a review against an already-resolved stable subject type. Before saving, perform a generic subject enrichment check using authoritative or primary sources when available. This applies to any kind of subject and does not require a website, location, address or relationship. Submit the result in subject_enrichment_check. Perform routine checking and retry automatically rather than asking the user. Ask the user only when the subject identity is genuinely ambiguous. Add useful discoveries in identifiers, subject_attributes and subject_context with source provenance, while attaching the review only to what was actually experienced. A completed check requires at least one source, and every source must be reconciled: list the request paths populated from it in applied_fields, or explain in unapplied_sources why it yielded no stored discovery. Every applied path must declare a generic retrieval_uses entry explaining how it helps future identity, likely queries, location, classification, relationships, comparison or verification. Treat enrichment as preparation for future TestGraph searches: register information someone may realistically search for later, and do not store facts merely because they are available. Treat this as shared graph building: substantial discovery work for this subject becomes reusable for later searches, while this user can benefit from useful enrichment contributed for other subjects. A subject's own canonical URL is a stable identifier and must be stored in identifiers when found. If enrichment cannot be found, use unavailable with a reason and the searches attempted. Use not_applicable with a reason when external enrichment has no sensible application. Collection assessment is mandatory: declare whether the subject belongs to a wider collection, and when it does, save the collection as subject_context with its authoritative directory URL and a relationship to reviewed_subject. On first discovery, submit every member exposed by a finite authoritative directory as an unreviewed subject and connect each one to the collection. The server stores that verified manifest. On later reviews, reuse the returned collection_id and manifest_revision; do not resubmit the full member list. The server still verifies that the reviewed subject belongs to the stored manifest. Verification status and real-world coverage status are separate: only coverage_status=complete permits reuse or conclusions that a location or member is absent. Partial or unknown manifests return a warning and require refresh. Location is optional; never invent facts or silently geocode coordinates. The experience date defaults to creation time unless experienced_at is explicit. All context subject types must already be resolved. Existing globally registered fields such as rating are automatically attached to this subject type on first valid use; preserve them in structured_data and do not ask for routine confirmation or discard them into raw_text. Use your full available reasoning, web retrieval and tool capabilities as TestGraph's open-ended semantic and discovery engine. Derive useful structure from meaning and evidence instead of waiting for a domain-specific form; the server supplies stable primitives and verifies your claims. Register information someone may realistically search for later against what is saved in TestGraph. Treat enrichment as shared graph work whose cost is paid for this subject and whose useful result can be reused by later searches, just as users benefit from enrichment contributed for other subjects. Store only discoveries with a declared generic retrieval_uses purpose and likely-query examples; facts with no plausible future TestGraph use are not enrichment. For collections, do not stop at one landing page: discover the authoritative source surfaces needed to derive the complete collection and submit collection_assessment.source_manifest with complete traversal coverage and member-to-source mappings, discovery queries, exhaustion evidence and no unresolved source URLs. Every discovered collection member must be submitted. Include reviewed_subject plus every derived sibling in submitted_member_refs; the server requires it to equal discovered_count and verifies that every ref exists and is connected to the collection. unavailable is only for genuine collection-identity or authoritative-source failure and is rejected when collection evidence is known. Unreviewed status, collection size, effort, inconvenience, latency, quick-review scope and future materialisation are not omissions. When the client supports concurrent tool calls, submit independent writes concurrently in batches of up to 10. Do not batch dependent operations until their prerequisites are confirmed. Reuse the same canonical key for the same subject and derive deterministic idempotency keys from a stable run identifier, target and operation so retries and restarted conversations safely return existing writes instead of creating duplicates. WORKFLOW PRECONDITION: for an existing subject, the server checks classification before mutation. The authenticated user may always enrich a subject they own or one attached to their own non-deleted review without waiting for another AI, including while classification is disputed. Ownership is determined by the authenticated user, not the AI client; all other evidence and write validations still apply. Enrichment does not confirm or resolve classification. For other contributors, an unsettled subject returns classification_review_required or classification_resolution_required without applying the requested update. Complete the returned durable workflow, then retry the unchanged request with the same deterministic idempotency key. You must not report the update as complete when this prerequisite is returned. WORKFLOW: after every successful write, inspect workflow.workflow_action_required. When it is true, you must follow workflow.next_action with workflow.next_action_arguments and workflow.next_action_instruction for the classification decision. When independent review or dispute resolution is pending, leave that classification action pending and continue requested enrichment of the authenticated user's own subject or one attached to their own non-deleted review. Report a successful enrichment separately from the still-pending classification.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
summaryYes
headlineYes
raw_textYes
visibilityNoprivate
identifiersNo
source_modelNo
subject_nameYes
subject_typeYes
canonical_keyYes
user_approvedYes
experienced_atNo
idempotency_keyYes
structured_dataNo
subject_contextNoOptional graph enrichment discovered while identifying the reviewed subject. Use reviewed_subject as the reserved ref for the subject receiving the review.
subject_attributesNo
subject_provenanceNo
collection_assessmentYesMandatory wider-collection assessment. The first member save requires a collection name, type, authoritative directory URL, discovered count, and submitted_member_refs naming reviewed_subject plus every discovered sibling in subject_context. The server validates and stores that manifest. Later member saves should pass collection_id and manifest_revision only; the server reuses the stored manifest and verifies the reviewed subject against it. Set refresh_manifest only when deliberately replacing the stored manifest, in which case the full collection is required again. independent requires evidence_sources or search attempts. unavailable requires unavailability_kind, attempts and a reason, and is only for genuine collection-identity or authoritative-source failure. It is rejected when collection signals are already known or when the reason is size, effort, inconvenience, latency, a quick review or deferred work. ambiguous blocks the save. There is no deferred or lazy status.
subject_enrichment_checkYesGeneric pre-save check. completed requires sources; unavailable requires a reason and attempts; not_applicable requires a reason; ambiguous stops the save for clarification.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / source_model
      Added value: +{
      +  "maxLength": 160,
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • removedInput schema / properties / version_check
      Removed value: -{
      -  "description": "Required live deployment token. Call get_server_info immediately before this write and pass write_version_token unchanged. Stale or missing tokens are rejected before any write occurs.",
      -  "maxLength": 64,
      -  "minLength": 64,
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "subject_type",
      -  "subject_name",
      -  "canonical_key",
      -  "headline",
      -  "summary",
      -  "raw_text",
      -  "subject_enrichment_check",
      -  "collection_assessment",
      -  "user_approved",
      -  "idempotency_key",
      -  "version_check"
      -]New value: +[
      +  "subject_type",
      +  "subject_name",
      +  "canonical_key",
      +  "headline",
      +  "summary",
      +  "raw_text",
      +  "subject_enrichment_check",
      +  "collection_assessment",
      +  "user_approved",
      +  "idempotency_key"
      +]
  3. Changed2 schema fields changed
    • addedInput schema / properties / version_check
      Added value: +{
      +  "description": "Required live deployment token. Call get_server_info immediately before this write and pass write_version_token unchanged. Stale or missing tokens are rejected before any write occurs.",
      +  "maxLength": 64,
      +  "minLength": 64,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "subject_type",
      -  "subject_name",
      -  "canonical_key",
      -  "headline",
      -  "summary",
      -  "raw_text",
      -  "subject_enrichment_check",
      -  "collection_assessment",
      -  "user_approved",
      -  "idempotency_key"
      -]New value: +[
      +  "subject_type",
      +  "subject_name",
      +  "canonical_key",
      +  "headline",
      +  "summary",
      +  "raw_text",
      +  "subject_enrichment_check",
      +  "collection_assessment",
      +  "user_approved",
      +  "idempotency_key",
      +  "version_check"
      +]
  4. First observed

TDQS

A3.9/5.0
Behavior5/5

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

Annotations declare idempotentHint=true, readOnlyHint=false, destructiveHint=false, and the description richly complements these: it details idempotency key derivation, concurrent batching (up to 10), the mandatory enrichment check, workflow_action_required handling, and the classification ownership rules. This adds substantial behavioral context far beyond the annotations with 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.

Conciseness2/5

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

The description is a wall of text exceeding 700 words with notable repetition: shared-graph-work benefit is stated twice and enrichment purpose guidance is restated in near-identical terms. While the core purpose is front-loaded, the extreme length and redundancy undermine scannability for an agent.

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 of this complexity (18 params, nested objects, workflow integration, classification preconditions), the description is unusually thorough, covering enrichment, collection manifests, idempotency, and concurrency. The absence of an output schema is a minor gap given the server-verification focus, but overall it leaves few operational unknowns.

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

Parameters3/5

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

Schema description coverage is only 17%, so the description must compensate. It does explain several key parameters: experienced_at defaults, structured_data must preserve rating, identifiers must store canonical URL, and the complex subject_enrichment_check and collection_assessment objects. However, basic fields like headline, summary, raw_text, source_model, and visibility are left entirely to the schema, leaving meaningful gaps at this coverage level.

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?

The opening sentence 'Save a review against an already-resolved stable subject type' states a clear verb, resource, and precondition, distinguishing it from enrichment-only tools like enrich_subject and from save_assessment. It doesn't explicitly name sibling alternatives, but the core purpose is unambiguous.

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?

Provides explicit conditions: when to ask the user ('only when the subject identity is genuinely ambiguous'), when to use unavailable vs not_applicable, when to reuse collection_id vs refresh a manifest, and clear rules for classification preconditions ('For other contributors, an unsettled subject returns classification_review_required'). It lacks direct contrast with sibling tools but gives strong operational guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources