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
| URI | Description |
|---|---|
opentide://index | Full index snapshot |
opentide://rules | All rules (model dump) |
opentide://rules/{uuid} | Single rule body |
opentide://threats | All threats |
opentide://threats/{uuid} | Single threat body |
opentide://objectives | All 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://vocabularies | Vocabulary 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://platforms | Platform capability list |
When to read which
| Goal | Resource |
|---|---|
| Orient in an unfamiliar repo | opentide://index |
| Read one object in full | opentide://{rules,threats,objectives}/{uuid} |
| Check a field's allowed values | opentide://vocabularies/{name} |
| See a template before authoring | opentide://templates/{object_type} |
| Decide if a platform can validate queries | opentide://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 thesearchtool 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:
| Requested | Resolves to |
|---|---|
rule | rule::1.1 (highest registered rule schema) |
rules | rule::1.1 |
rule.1.1 | rule::1.1 |
rule::1.0 | rule::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