opentide

MCP resources

opentide:// resource URIs for catalogue indexes, objects, schemas, templates, and vocabularies.

Read-only JSON resources registered on the opentide MCP server.

URI catalogue

URIDescription
opentide://indexFull index snapshot
opentide://rulesAll rules (model dump)
opentide://rules/{uuid}Single rule body
opentide://threatsAll threats
opentide://threats/{uuid}Single threat body
opentide://objectivesAll objectives
opentide://objectives/{uuid}Single objective body
opentide://schemas/{object_type}JSON Schema for rule, threat, or objective
opentide://templates/{object_type}Template metadata for object type
opentide://vocabulariesVocabulary index: {name: {metadata, entry_count, uri}} — entries are not inlined
opentide://vocabularies/{+name}Named vocabulary: {metadata, entries}. {+name} keeps the & in att&ck literal
opentide://platformsPlatform capability list

When to read which

GoalResource
Orient in an unfamiliar repoopentide://index
Read one object in fullopentide://{rules,threats,objectives}/{uuid}
Check a field's allowed valuesopentide://vocabularies/{name}
See a template before authoringopentide://templates/{object_type}
Decide if a platform can validate queriesopentide://platforms

Prefer a single-object URI (.../rules/{uuid}) over the collection URI when you only need one — the collection resources return every object and can be large.

opentide://vocabularies lists which vocabularies exist and how many entries each has; follow its uri to read the entries of the one you need. The bundled entries together are several megabytes, so the index deliberately leaves them out.

Response format

All resources return indented JSON strings suitable for agent context windows.

Missing objects return:

{ "error": "Rule <uuid> not found" }

Size and performance

  • Collection resources (opentide://rules, opentide://threats, opentide://objectives, opentide://index) dump every object and grow with the repo. On large catalogues they can be big — read a single-object URI, or use the search tool to narrow, before pulling a full collection into context.
  • There is no pagination; resources return the full payload. If a collection is too large for your context window, use search (tool) and then fetch specific objects by UUID.
  • Resources reflect the runtime index built at Opentide.initialise(). If they look empty or stale, regenerate schemas (opentide generate schemas) and restart the server.

platforms resource shape

[
  {
    "name": "sentinel",
    "enabled": true,
    "can_deploy": true,
    "can_validate": true
  }
]

Use this resource to decide whether validate_query is applicable before calling the tool.

Schema and template resources

The registry keys generated schemas by schema id (rule::1.0, threat::1.0, objective::1.0, visibility::1.0). The resource accepts any of these forms and resolves them to the highest matching version:

RequestedResolves to
rulerule::1.1 (highest registered rule schema)
rulesrule::1.1
rule.1.1rule::1.1
rule::1.0rule::1.0 when that schema file is in the index

When nothing matches, the resource returns a diagnostic rather than an empty object:

{
  "error": "No JSON Schema generated for 'rule'",
  "available": [],
  "hint": "run 'opentide generate schemas'"
}

Resources reflect the runtime index after Opentide.initialise() — run opentide generate schemas in the client repo if schemas are empty.

opentide://templates/{object_type} accepts the same forms. Templates are rendered from the current model, so a versioned id resolves only when it names the current schema version: rule::1.1 returns the rule template, rule::1.0 and rule::9.9 return an error with the available templates. Run opentide generate templates if the template list is empty. Generated files still include rule.1.0.template.yaml for objects that stay on rule::1.0.

Vocabulary resources

Vocabularies are model_dump()-ed to JSON objects, not repr() strings:

{
  "actors": {
    "metadata": { "name": "Threat Actors", "field": "actors", "…": "…" },
    "entries": { "att&ck::G0006": { "…": "…" } }
  }
}

An unknown name returns { "error": "Unknown vocabulary '…'", "available": [...] }.

SDK equivalent

from opentide import Opentide

Opentide.initialise()
Opentide.Index
Opentide.JsonSchemas.Index
Opentide.Vocabularies.Index
Opentide.Platforms.items()

See SDK registry.

Source

src/opentide/mcp_server/resources.py

On this page