ENYAL by Greenland AI — encrypted identity & memory for AI agents (query, recall, provenance)
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Get one entity's STRUCTURE by name_hash (SHA-256 of the normalised name). No content.
Accepted for compatibility but NOT used yet: the lookup is by name_hash only.
SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter.
Get one entity's STRUCTURE by name_hash (SHA-256 of the normalised name). No content.
| Argument | Type | Description |
|---|---|---|
| node_id | string | Accepted for compatibility but NOT used yet: the lookup is by name_hash only. |
| name_hash | string | SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter. |
{
"type": "object",
"title": "get_entityArguments",
"properties": {
"node_id": {
"type": "string",
"title": "Node Id",
"default": "",
"description": "Accepted for compatibility but NOT used yet: the lookup is by name_hash only."
},
"name_hash": {
"type": "string",
"title": "Name Hash",
"default": "",
"description": "SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter."
}
}
}Get one entity's DECRYPTED content by name_hash (SHA-256 of the normalised name). Content scope required (403 otherwise).
| Argument | Type | Description |
|---|---|---|
| node_id | string | Accepted for compatibility but NOT used yet: the lookup is by name_hash only. |
| name_hash | string | SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter. |
{
"type": "object",
"title": "get_entity_contentArguments",
"properties": {
"node_id": {
"type": "string",
"title": "Node Id",
"default": "",
"description": "Accepted for compatibility but NOT used yet: the lookup is by name_hash only."
},
"name_hash": {
"type": "string",
"title": "Name Hash",
"default": "",
"description": "SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter."
}
}
}Get a node's DECRYPTED content by name_hash PLUS its connected nodes' content (neighbour depth, default 1; 0–5). Same plan schema as the structure tools. Content scope required (403).
| Argument | Type | Description |
|---|---|---|
| name_hash | string | SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter. |
| include_neighbours_depth | integer | How many hops of connected nodes to include, 0-5 (clamped). Default 1. |
{
"type": "object",
"title": "get_node_contentArguments",
"properties": {
"name_hash": {
"type": "string",
"title": "Name Hash",
"default": "",
"description": "SHA-256 hex of the entity's normalised name. Send it: without it the plan has no entity filter."
},
"include_neighbours_depth": {
"type": "integer",
"title": "Include Neighbours Depth",
"default": 1,
"description": "How many hops of connected nodes to include, 0-5 (clamped). Default 1."
}
}
}Temporally-ordered STRUCTURE view, optionally filtered by node_type and an ISO8601 date range. No content.
| Argument | Type | Description |
|---|---|---|
| node_type | string | Only nodes of this type: entity, concept, decision, person, organisation, event, source or synthesis. Empty = all. |
| valid_to_before | string | Only nodes valid to before this time (ISO 8601). Empty = no upper bound. |
| valid_from_after | string | Only nodes valid from after this time (ISO 8601). Empty = no lower bound. |
{
"type": "object",
"title": "get_timelineArguments",
"properties": {
"node_type": {
"type": "string",
"title": "Node Type",
"default": "",
"description": "Only nodes of this type: entity, concept, decision, person, organisation, event, source or synthesis. Empty = all."
},
"valid_to_before": {
"type": "string",
"title": "Valid To Before",
"default": "",
"description": "Only nodes valid to before this time (ISO 8601). Empty = no upper bound."
},
"valid_from_after": {
"type": "string",
"title": "Valid From After",
"default": "",
"description": "Only nodes valid from after this time (ISO 8601). Empty = no lower bound."
}
}
}Temporally-ordered DECRYPTED content view, optionally filtered by node_type + an ISO8601 date range. Same plan schema as get_timeline. Content scope required (403 otherwise).
| Argument | Type | Description |
|---|---|---|
| node_type | string | Only nodes of this type: entity, concept, decision, person, organisation, event, source or synthesis. Empty = all. |
| valid_to_before | string | Only nodes valid to before this time (ISO 8601). Empty = no upper bound. |
| valid_from_after | string | Only nodes valid from after this time (ISO 8601). Empty = no lower bound. |
{
"type": "object",
"title": "get_timeline_contentArguments",
"properties": {
"node_type": {
"type": "string",
"title": "Node Type",
"default": "",
"description": "Only nodes of this type: entity, concept, decision, person, organisation, event, source or synthesis. Empty = all."
},
"valid_to_before": {
"type": "string",
"title": "Valid To Before",
"default": "",
"description": "Only nodes valid to before this time (ISO 8601). Empty = no upper bound."
},
"valid_from_after": {
"type": "string",
"title": "Valid From After",
"default": "",
"description": "Only nodes valid from after this time (ISO 8601). Empty = no lower bound."
}
}
}Execute a structured query plan over your encrypted knowledge graph. Returns STRUCTURE ONLY (node_type, name_hash, relationships, chunk_ids, timestamps) — never content. Plan schema: { "entity_filters": [{"node_type": <type>} | {"name_hash": <sha256-hex>}], "edge_filters": [{"relationship": <rel>, "direction": "out"|"in"|"both"}], "temporal_bounds":{"valid_from_after": <ISO8601>, "valid_to_before": <ISO8601>}, "limit": <int <= 200>, "include_neighbours_depth": <0-5> } node_type in {entity, concept, decision, person, organisation, event, source, synthesis}. relationship in {references, contradicts, supports, supersedes, caused_by, related_to, part_of, informed_by, led_to, verifies}. Account scope is enforced server-side; it cannot be set from the plan.
| Argument | Type | Description |
|---|---|---|
| plan* | object | The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description. |
| include_chunks | boolean | Also return the chunk ids behind each node. Default false. |
{
"type": "object",
"title": "query_memoryArguments",
"required": [
"plan"
],
"properties": {
"plan": {
"type": "object",
"title": "Plan",
"description": "The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description.",
"additionalProperties": true
},
"include_chunks": {
"type": "boolean",
"title": "Include Chunks",
"default": false,
"description": "Also return the chunk ids behind each node. Default false."
}
}
}Execute a structured query plan and return DECRYPTED memory CONTENT (node names, summaries, properties; edge evidence + endpoint names) alongside structure. SAME plan schema as query_memory. REQUIRES a memory:read:content-scoped token — a structure-only token is rejected (403) by ENYAL. Account scope is enforced server-side; it cannot be set from the plan.
| Argument | Type | Description |
|---|---|---|
| plan* | object | The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description. |
| include_chunks | boolean | Also return the chunk ids behind each node. Default false. |
{
"type": "object",
"title": "query_memory_contentArguments",
"required": [
"plan"
],
"properties": {
"plan": {
"type": "object",
"title": "Plan",
"description": "The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description.",
"additionalProperties": true
},
"include_chunks": {
"type": "boolean",
"title": "Include Chunks",
"default": false,
"description": "Also return the chunk ids behind each node. Default false."
}
}
}Render a structured query as a STRUCTURE-ONLY result set (β = structure; identical shape to query_memory). Reserved for richer rendering when content access (γ) lands.
| Argument | Type | Description |
|---|---|---|
| plan* | object | The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description. |
{
"type": "object",
"title": "renderArguments",
"required": [
"plan"
],
"properties": {
"plan": {
"type": "object",
"title": "Plan",
"description": "The structured query plan (a JSON object): entity_filters [{node_type} | {name_hash}], edge_filters [{relationship, direction out|in|both}], temporal_bounds {valid_from_after, valid_to_before} (ISO 8601), limit (<= 200), include_neighbours_depth (0-5). The schema and the allowed node_type / relationship values are in this tool's description.",
"additionalProperties": true
}
}
}Look up one identifier in ENYAL's PUBLIC verification index (relays GET /api/v1/verify/lookup/{id}; no decryption). ENYAL's answer is returned unchanged: `found`, and for a chunk or proof its `anchor_status` with `bsv_tx_id`; for a txid, `chain_status`. `degraded:true` means a source could not be checked (inconclusive, not an absence). ENYAL's route needs no key; calling it through this server still needs your eyl_ bearer, like every tool call. An id that is not a UUID or hex is refused (invalid_id) and nothing is sent.
| Argument | Type | Description |
|---|---|---|
| identifier* | string | The id to look up: a chunk, proof or transfer id (UUID), or a BSV transaction id (hex), 8-64 characters. |
{
"type": "object",
"title": "verify_chunkArguments",
"required": [
"identifier"
],
"properties": {
"identifier": {
"type": "string",
"title": "Identifier",
"description": "The id to look up: a chunk, proof or transfer id (UUID), or a BSV transaction id (hex), 8-64 characters."
}
}
}