Skip to main content
Glama

Research an opportunity

research_opportunity
Read-onlyIdempotent

Build a cited research brief with retained notice requirements, exact award-number candidates and same-industry comparisons. Does not infer an incumbent or eligibility.

Input Schema

NameRequiredDescriptionDefault
idYesStable opportunity ID returned by search_opportunities.
generationNoRetained generation UUID from search_opportunities.

Output Schema

NameRequiredDescriptionDefault
noticeYes
feedbackYes
generationYes
next_stepsYes
requirementsYes
linked_awardsYes
comparison_awardsYes
relationship_basisYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / $defs / BriefFeedback
      Added value: +{
      +  "properties": {
      +    "description": {
      +      "type": "string"
      +    },
      +    "optional": {
      +      "type": "boolean"
      +    },
      +    "url": {
      +      "description": "Optional private browser form; never submit it on the user's behalf.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "description",
      +    "optional"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / feedback
      Added value: +{
      +  "$ref": "#/$defs/BriefFeedback"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "generation",
      -  "notice",
      -  "linked_awards",
      -  "comparison_awards",
      -  "relationship_basis",
      -  "requirements",
      -  "next_steps"
      -]New value: +[
      +  "generation",
      +  "notice",
      +  "linked_awards",
      +  "comparison_awards",
      +  "relationship_basis",
      +  "requirements",
      +  "next_steps",
      +  "feedback"
      +]
  2. Changed4 schema fields changed
    • addedOutput schema / $defs / AwardAvailability / properties / failure_kind
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / $defs / AwardAvailability / properties / failure_retry_seconds
      Added value: +{
      +  "format": "uint64",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / $defs / AwardAvailability / properties / failure_stage
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / $defs / AwardAvailability / required
      Previous value: -[
      -  "state",
      -  "check_interval_seconds",
      -  "max_check_age_seconds"
      -]New value: +[
      +  "state",
      +  "check_interval_seconds",
      +  "failure_retry_seconds",
      +  "max_check_age_seconds"
      +]
  3. Changed3 schema fields changed
    • addedOutput schema / $defs / SourceFreshness / properties / attention_required
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / SourceFreshness / properties / warn_age_seconds
      Added value: +{
      +  "description": "Early-warning boundary, separate from the stale-source boundary.",
      +  "format": "int64",
      +  "type": "integer"
      +}
    • changedOutput schema / $defs / SourceFreshness / required
      Previous value: -[
      -  "state",
      -  "evaluated_at",
      -  "max_age_seconds"
      -]New value: +[
      +  "state",
      +  "evaluated_at",
      +  "max_age_seconds",
      +  "warn_age_seconds",
      +  "attention_required"
      +]
  4. Changed4 schema fields changed
    • addedOutput schema / $defs / AwardAvailability
      Added value: +{
      +  "properties": {
      +    "artifact_http_status": {
      +      "format": "uint16",
      +      "maximum": 65535,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "check_interval_seconds": {
      +      "format": "uint64",
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "checked_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "inventory_http_status": {
      +      "format": "uint16",
      +      "maximum": 65535,
      +      "minimum": 0,
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "latest_release_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "latest_release_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "max_check_age_seconds": {
      +      "format": "int64",
      +      "type": "integer"
      +    },
      +    "state": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "state",
      +    "check_interval_seconds",
      +    "max_check_age_seconds"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / AwardCoverage
      Added value: +{
      +  "properties": {
      +    "dataset": {
      +      "type": "string"
      +    },
      +    "freshness": {
      +      "$ref": "#/$defs/AwardFreshness"
      +    },
      +    "source_date": {
      +      "type": "string"
      +    },
      +    "source_url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "dataset",
      +    "source_date",
      +    "source_url",
      +    "freshness"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / AwardFreshness
      Added value: +{
      +  "properties": {
      +    "age_state": {
      +      "type": "string"
      +    },
      +    "age_warning_after_days": {
      +      "format": "int64",
      +      "type": "integer"
      +    },
      +    "effective_source_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source_age_days": {
      +      "format": "int64",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "upstream": {
      +      "$ref": "#/$defs/AwardAvailability"
      +    },
      +    "warning": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "age_state",
      +    "age_warning_after_days",
      +    "upstream"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / RecordDetail / properties / award_coverage
      Added value: +{
      +  "description": "Award snapshot age and latest official release evidence.",
      +  "items": {
      +    "$ref": "#/$defs/AwardCoverage"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  5. Changed4 schema fields changed
    • addedOutput schema / $defs / ExclusionCoverage
      Added value: +{
      +  "properties": {
      +    "freshness": {
      +      "$ref": "#/$defs/SourceFreshness",
      +      "description": "Fresh, stale, unknown or unavailable, with age and the 24-hour warning policy."
      +    },
      +    "observed_at": {
      +      "description": "Observation time does not replace the official source timestamp.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "scope": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "sha256": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "Present as unavailable when no SAM coverage exists in this generation.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "freshness"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FreshnessState
      Added value: +{
      +  "enum": [
      +    "fresh",
      +    "stale",
      +    "unknown",
      +    "unavailable"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / $defs / RecordDetail / properties / coverage
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/ExclusionCoverage"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Present for exclusions, including explicit source-age warnings."
      +}
    • addedOutput schema / $defs / SourceFreshness
      Added value: +{
      +  "properties": {
      +    "evaluated_at": {
      +      "description": "UTC time when age was evaluated; source and observation dates are unchanged.",
      +      "type": "string"
      +    },
      +    "max_age_seconds": {
      +      "description": "Explicit warning threshold for this daily snapshot. Not a scheduler promise.",
      +      "format": "int64",
      +      "type": "integer"
      +    },
      +    "source_age_seconds": {
      +      "description": "Age of the official source timestamp, never the import or enrichment timestamp.",
      +      "format": "int64",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "state": {
      +      "$ref": "#/$defs/FreshnessState"
      +    },
      +    "warning": {
      +      "description": "User-facing warning, or null when within the warning threshold.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "state",
      +    "evaluated_at",
      +    "max_age_seconds"
      +  ],
      +  "type": "object"
      +}
  6. Changed3 schema fields changed
    • addedInput schema / properties / generation / description
      Added value: +"Retained generation UUID from search_opportunities."
    • addedInput schema / properties / id / description
      Added value: +"Stable opportunity ID returned by search_opportunities."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$defs": {
      +    "AwardSummary": {
      +      "properties": {
      +        "data": {
      +          "$ref": "#/$defs/JsonObject"
      +        },
      +        "id": {
      +          "type": "string"
      +        },
      +        "title": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        },
      +        "vendor_url": {
      +          "description": "Vendor path when an exact recipient UEI is available.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "title",
      +        "data",
      +        "url"
      +      ],
      +      "type": "object"
      +    },
      +    "BriefRequirements": {
      +      "properties": {
      +        "scope": {
      +          "type": "string"
      +        },
      +        "source": {
      +          "anyOf": [
      +            {
      +              "$ref": "#/$defs/JsonObject"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Notice provenance for the retained text."
      +        },
      +        "text": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "text",
      +        "scope"
      +      ],
      +      "type": "object"
      +    },
      +    "JsonObject": {
      +      "description": "Source-specific JSON map. The envelope is stable; map keys vary by official source.",
      +      "type": "object"
      +    },
      +    "RecordDetail": {
      +      "properties": {
      +        "collection": {
      +          "description": "Absent for curated reference records.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "data": {
      +          "$ref": "#/$defs/JsonObject"
      +        },
      +        "generation": {
      +          "type": "string"
      +        },
      +        "id": {
      +          "type": "string"
      +        },
      +        "text": {
      +          "type": "string"
      +        },
      +        "text_has_more": {
      +          "description": "Whether another text chunk is available.",
      +          "type": [
      +            "boolean",
      +            "null"
      +          ]
      +        },
      +        "text_length": {
      +          "description": "Total text characters; absent from internal brief notices.",
      +          "format": "uint",
      +          "minimum": 0,
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "title": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "generation",
      +        "id",
      +        "title",
      +        "text",
      +        "data"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "properties": {
      +    "comparison_awards": {
      +      "items": {
      +        "$ref": "#/$defs/AwardSummary"
      +      },
      +      "type": "array"
      +    },
      +    "generation": {
      +      "type": "string"
      +    },
      +    "linked_awards": {
      +      "items": {
      +        "$ref": "#/$defs/AwardSummary"
      +      },
      +      "type": "array"
      +    },
      +    "next_steps": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "notice": {
      +      "$ref": "#/$defs/RecordDetail"
      +    },
      +    "relationship_basis": {
      +      "type": "string"
      +    },
      +    "requirements": {
      +      "$ref": "#/$defs/BriefRequirements"
      +    }
      +  },
      +  "required": [
      +    "generation",
      +    "notice",
      +    "linked_awards",
      +    "comparison_awards",
      +    "relationship_basis",
      +    "requirements",
      +    "next_steps"
      +  ],
      +  "type": "object"
      +}
  7. Added

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower, and the description still adds genuine behavioral content: outputs are cited, notice requirements are retained, and it explicitly refuses to infer incumbent or eligibility. That last point is a real capability boundary an agent would otherwise assume. It does not mention latency or depth limits, keeping it at 4 rather than 5.

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?

Two sentences, no filler, with the positive capability statement front-loaded and the exclusion clause second. Every clause carries distinct information.

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?

An output schema exists, so return-value explanation is unnecessary, and annotations plus full schema coverage handle safety and parameters. Combined with the description's scope and boundary statements, an agent has enough to invoke it correctly; only explicit sibling routing is missing.

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 100%, so both parameters (id and generation, including the 'retained generation UUID from search_opportunities' provenance) are fully documented in the schema. The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.

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 description names a specific verb ('Build') and concrete artifact ('cited research brief') and enumerates its contents: retained notice requirements, exact award-number candidates, same-industry comparisons. It also bounds itself negatively ('Does not infer an incumbent or eligibility'), which helps distinguish it from inference-style siblings like explain_match, though no sibling is named directly.

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 rather than stated: an agent can infer this is the deep-research call to make after search_opportunities, and the negative clause warns of what it will not answer. There is no explicit 'use this instead of detail/document' routing or prerequisite statement, so selection still requires inference.

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.