Skip to main content
Glama

Theater military posture

get_military_posture
Read-onlyIdempotent

Return the seeded theater posture assessment: for each global theater (Iran, Taiwan, Baltic, Korea and others) a posture level, military risk score and the aggregated positioning and escalation signals behind it. Flagged stale after 2 hours; theater-level summaries only, no individual aircraft or vessel tracks. Seeded-cache read with no live fetch: weight 1 on API plans, included in the signed-in free allowance. theater is a case-insensitive id substring, posture_level filters one level exactly, limit caps the list (default 30, 0 for no cap).

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "get_military_posture"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNoCap the theaters list to at most this many items (default 30, pass 0 for no cap).
summaryNoReturn counts + 3-item samples instead of full lists. Useful when you only need shape/size or want to budget context before drilling in.
theaterNoFilter to one theater by id (case-insensitive substring, e.g. "iran", "taiwan", "baltic", "korea").
jmespathNoOptional JMESPath projection applied to the response. See initialize.instructions for grammar and examples.
posture_levelNoFilter to a single posture level.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "properties": {
      +      "activationUnknown": {
      +        "description": "Optional. True when an activation marker this tool consults could not be read, so `stale` was computed without knowing whether the producer has ever published. Distinguishes an unreadable marker from a producer that genuinely never ran — the same signal /api/health and /api/seed-health publish under this name.",
      +        "type": "boolean"
      +      },
      +      "cached_at": {
      +        "description": "ISO-8601 timestamp of the OLDEST contributing cache key, or null when no valid seed-meta is present.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "contentFreshnessPendingUntil": {
      +        "description": "Optional ISO-8601 deadline while a cleanly absent content-freshness block is temporarily covered by deployment-order grace.",
      +        "format": "date-time",
      +        "type": "string"
      +      },
      +      "data": {
      +        "properties": {
      +          "theater_posture": {
      +            "properties": {
      +              "theaters": {
      +                "items": {
      +                  "properties": {
      +                    "postureLevel": {
      +                      "type": "string"
      +                    },
      +                    "signals": {
      +                      "type": [
      +                        "array",
      +                        "object",
      +                        "null"
      +                      ]
      +                    },
      +                    "summary": {
      +                      "type": "string"
      +                    },
      +                    "theater": {
      +                      "type": "string"
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              }
      +            },
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "freshnessUnknown": {
      +        "description": "Optional. True when a freshness record could not be read (a cache timeout), so `stale` is true because freshness is unknown, not because the data was shown to be old. Retrying shortly will usually clear it.",
      +        "type": "boolean"
      +      },
      +      "stale": {
      +        "description": "True when any contributing cache key fails its freshness contract: fetched longer ago than its per-key maxStaleMin budget, below a declared minRecordCount, or — for keys that declare a content-age contract — carrying upstream observations older than maxContentAgeMin even though the fetch itself is recent. A recent cached_at with stale:true means the fetch is current but the underlying data has stopped advancing, so refetching will not help.",
      +        "type": "boolean"
      +      },
      +      "unreadable": {
      +        "description": "Optional. Labels of `data` sections whose cache read failed. Those sections are null because they could not be read, not because the dataset is empty. Retrying shortly will usually fill them.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "cached_at",
      +      "stale",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "projection"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "data",
      +      "_attribution"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "_budget_exceeded"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "_jmespath_error"
      +    ]
      +  }
      +]
    • removedOutput schema / properties
      Removed value: -{
      -  "activationUnknown": {
      -    "description": "Optional. True when an activation marker this tool consults could not be read, so `stale` was computed without knowing whether the producer has ever published. Distinguishes an unreadable marker from a producer that genuinely never ran — the same signal /api/health and /api/seed-health publish under this name.",
      -    "type": "boolean"
      -  },
      -  "cached_at": {
      -    "description": "ISO-8601 timestamp of the OLDEST contributing cache key, or null when no valid seed-meta is present.",
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "contentFreshnessPendingUntil": {
      -    "description": "Optional ISO-8601 deadline while a cleanly absent content-freshness block is temporarily covered by deployment-order grace.",
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "data": {
      -    "properties": {
      -      "theater_posture": {
      -        "properties": {
      -          "theaters": {
      -            "items": {
      -              "properties": {
      -                "postureLevel": {
      -                  "type": "string"
      -                },
      -                "signals": {
      -                  "type": [
      -                    "array",
      -                    "object",
      -                    "null"
      -                  ]
      -                },
      -                "summary": {
      -                  "type": "string"
      -                },
      -                "theater": {
      -                  "type": "string"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  "stale": {
      -    "description": "True when any contributing cache key fails its freshness contract: fetched longer ago than its per-key maxStaleMin budget, below a declared minRecordCount, or — for keys that declare a content-age contract — carrying upstream observations older than maxContentAgeMin even though the fetch itself is recent. A recent cached_at with stale:true means the fetch is current but the underlying data has stopped advancing, so refetching will not help.",
      -    "type": "boolean"
      -  }
      -}
    • removedOutput schema / required
      Removed value: -[
      -  "cached_at",
      -  "stale",
      -  "data"
      -]
  2. Changed1 schema field changed
    • changedOutput schema / properties / stale / description
      Previous value: -"True when any contributing cache key is older than its per-key maxStaleMin freshness budget."New value: +"True when any contributing cache key fails its freshness contract: fetched longer ago than its per-key maxStaleMin budget, below a declared minRecordCount, or — for keys that declare a content-age contract — carrying upstream observations older than maxContentAgeMin even though the fetch itself is recent. A recent cached_at with stale:true means the fetch is current but the underlying data has stopped advancing, so refetching will not help."
  3. Changed1 schema field changed
    • addedOutput schema / properties / activationUnknown
      Added value: +{
      +  "description": "Optional. True when an activation marker this tool consults could not be read, so `stale` was computed without knowing whether the producer has ever published. Distinguishes an unreadable marker from a producer that genuinely never ran — the same signal /api/health and /api/seed-health publish under this name.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / contentFreshnessPendingUntil
      Added value: +{
      +  "description": "Optional ISO-8601 deadline while a cleanly absent content-freshness block is temporarily covered by deployment-order grace.",
      +  "format": "date-time",
      +  "type": "string"
      +}
  5. First observed

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description adds meaningful behavior on top: staleness flagged after 2 hours, theater-level granularity only, no live fetch, and cost context ('weight 1 on API plans, included in the signed-in free allowance'). These are exactly the operational facts annotations cannot express.

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 purpose and output shape are front-loaded in the first sentence, followed by scoping, cost, and filter notes. It is dense with several clauses per sentence but nearly every clause carries signal; only the API-plan/allowance phrasing is slightly verbose.

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 5-param read tool with a full output schema and rich annotations, the description covers output shape, staleness, granularity, cost, and filter semantics. It stops short of noting behavior for empty/unmatched theater filters or error conditions, but nothing essential to calling it correctly 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 the schema already documents all five parameters including the case-insensitive substring match. The description restates theater/posture_level/limit semantics with minor added precision ('posture_level filters one level exactly', 'default 30, 0 for no cap'), so it is at best a mild reinforcement of what the schema provides.

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 ('Return the seeded theater posture assessment') and enumerates the returned fields: per-theater posture level, military risk score, and aggregated positioning/escalation signals. It also scopes the tool away from track-level siblings ('theater-level summaries only, no individual aircraft or vessel tracks'), so an agent can distinguish it from get_aviation_status or get_maritime_activity.

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: the seeded-cache/no-live-fetch note and the summary-parameter hint ('useful when you only need shape/size or want to budget context') suggest when it fits, but no sibling alternative is named and no explicit when-to-use/when-not rule is given. It contrasts implicitly with live-fetch tools but never routes the agent to one.

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.