Naftiko · Schema

Naftiko Ikanos Capability

Ikanos Capability Specification — describes a capability document (adapter + metadata) or a standalone shared file (consumes / exposes / aggregates / binds). A valid document must declare `ikanos` + exactly one of `capability`, `consumes`, `exposes`, `aggregates`, or `binds`. All adapter logic lives under `capability`; shared section definitions live at root.

CompanyAi DataAPI IntegrationAPI GovernanceMCPAgent SkillsOpen-SourceDeveloper ToolsAPI SpecificationSpec-Driven IntegrationCapability EngineAPI Linting

Properties

Name Type Description
ikanos string Ikanos specification version. Signals schema compatibility — always the first key in a capability file.
info object Human-readable metadata: label, description, tags, dates, stakeholders. **When to use** — Required on every capability document. The richer the `description`, the better agents can discover and reason
consumes array External HTTP API adapters declared at file scope. Each entry is either an inline `ConsumesHttp` (with `type: http`) or an `ImportEntry` (with a `from` URI). Standalone consumes files use this section
exposes array Exposed server adapters declared at file scope. Each entry is either an inline adapter (rest/mcp/skill/control) or an `ImportEntry` (with a `from` URI). Standalone exposes files use this section at ro
aggregates array Domain aggregates declared at file scope. Each entry is either an inline `Aggregate` or an `ImportEntry` (with a `from` URI). Standalone aggregates files use this section at root.
binds array External variable bindings available file-wide. Each entry is either an inline `Binding` (with a runtime `location` URI such as `vault://`, `file://`, ...) or an `ImportEntry` (with a parse-time `from
capability object Technical body of the capability: what it exposes (`exposes`), what it calls (`consumes`), and shared domain logic (`aggregates`). At least one of `exposes`, `consumes`, or `aggregates` is required. *
View JSON Schema on GitHub

JSON Schema

naftiko-ikanos-capability-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://ikanos.io/schemas/v1.0.0-beta2/ikanos.json",
  "name": "Ikanos Specification",
  "description": "Ikanos Capability Specification \u2014 describes a capability document (adapter + metadata) or a standalone shared file (consumes / exposes / aggregates / binds). A valid document must declare `ikanos` + exactly one of `capability`, `consumes`, `exposes`, `aggregates`, or `binds`. All adapter logic lives under `capability`; shared section definitions live at root.",
  "type": "object",
  "properties": {
    "ikanos": {
      "type": "string",
      "description": "Ikanos specification version. Signals schema compatibility \u2014 always the first key in a capability file.",
      "const": "1.0.0-beta5"
    },
    "info": {
      "$ref": "#/$defs/Info",
      "description": "Human-readable metadata: label, description, tags, dates, stakeholders.\n\n**When to use** \u2014 Required on every capability document. The richer the `description`, the better agents can discover and reason about this capability.\n**Format** \u2014 `created` / `modified` must be `YYYY-MM-DD`. `stakeholders[].role` is free-form (`owner`, `editor`, `reviewer`, etc.)."
    },
    "consumes": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "#/$defs/ConsumesHttp"
          },
          {
            "$ref": "#/$defs/ImportEntry"
          }
        ]
      },
      "minItems": 1,
      "description": "External HTTP API adapters declared at file scope. Each entry is either an inline `ConsumesHttp` (with `type: http`) or an `ImportEntry` (with a `from` URI). Standalone consumes files use this section at root."
    },
    "exposes": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "#/$defs/ExposesRest"
          },
          {
            "$ref": "#/$defs/ExposesMcp"
          },
          {
            "$ref": "#/$defs/ExposesSkill"
          },
          {
            "$ref": "#/$defs/ExposesControl"
          },
          {
            "$ref": "#/$defs/ImportEntry"
          }
        ]
      },
      "minItems": 1,
      "description": "Exposed server adapters declared at file scope. Each entry is either an inline adapter (rest/mcp/skill/control) or an `ImportEntry` (with a `from` URI). Standalone exposes files use this section at root."
    },
    "aggregates": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "#/$defs/Aggregate"
          },
          {
            "$ref": "#/$defs/ImportEntry"
          }
        ]
      },
      "minItems": 1,
      "description": "Domain aggregates declared at file scope. Each entry is either an inline `Aggregate` or an `ImportEntry` (with a `from` URI). Standalone aggregates files use this section at root."
    },
    "binds": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "#/$defs/Binding"
          },
          {
            "$ref": "#/$defs/ImportEntry"
          }
        ]
      },
      "minItems": 1,
      "description": "External variable bindings available file-wide. Each entry is either an inline `Binding` (with a runtime `location` URI such as `vault://`, `file://`, ...) or an `ImportEntry` (with a parse-time `from` URI to a shared binds file).\n\n**Example**:\n```yaml\nbinds:\n  - namespace: secrets\n    location: vault://my-vault/secret/data/app\n    keys:\n      API_KEY: api-key\n      DB_PASSWORD: db-password\n```\n**See also** \u2014 `capability.binds` for bindings scoped to a single capability."
    },
    "capability": {
      "$ref": "#/$defs/Capability",
      "description": "Technical body of the capability: what it exposes (`exposes`), what it calls (`consumes`), and shared domain logic (`aggregates`). At least one of `exposes`, `consumes`, or `aggregates` is required.\n\n**See also** \u2014 `info` for metadata, `binds` for secrets."
    }
  },
  "oneOf": [
    {
      "required": [
        "ikanos",
        "capability"
      ]
    },
    {
      "required": [
        "ikanos",
        "consumes"
      ],
      "not": {
        "required": [
          "capability"
        ]
      }
    },
    {
      "required": [
        "ikanos",
        "exposes"
      ],
      "not": {
        "required": [
          "capability"
        ]
      }
    },
    {
      "required": [
        "ikanos",
        "aggregates"
      ],
      "not": {
        "required": [
          "capability"
        ]
      }
    },
    {
      "required": [
        "ikanos",
        "binds"
      ],
      "not": {
        "required": [
          "capability"
        ]
      }
    }
  ],
  "additionalProperties": false,
  "$defs": {
    "ImportEntry": {
      "type": "object",
      "description": "Unified import directive shared by `consumes`, `exposes`, `aggregates`, and `binds`. Imports a single namespaced entry from another file by its `namespace`, optionally aliasing it locally via `as`. The `from` path is resolved relative to the importing file. Transitive imports are not supported \u2014 each source file must be a self-contained leaf.\n\n**Example**:\n```yaml\nconsumes:\n  - from: ./shared/notion-api.yml\n    import: notion\n    as: notion-shared\n```",
      "properties": {
        "from": {
          "type": "string",
          "description": "Path or URI to the file that contains the entry to import (e.g. `./shared/notion.yml` or `file:///shared/notion.yml`). Relative paths resolve against the directory of the importing file."
        },
        "import": {
          "$ref": "#/$defs/IdentifierKebab",
          "description": "Namespace of the entry to import from the referenced file."
        },
        "as": {
          "$ref": "#/$defs/IdentifierKebab",
          "description": "Optional local alias. When set, the imported entry's namespace becomes `as` in the importing document; this enables disambiguation when two sources expose the same name."
        },
        "description": {
          "type": "string",
          "description": "Human- and agent-readable description of this import. Helps agents reason about the imported entry."
        }
      },
      "required": [
        "from",
        "import"
      ],
      "additionalProperties": false
    },
    "Binding": {
      "type": "object",
      "description": "Declares that the capability binds to an external source of variables. Variables declared via 'keys' are injected using mustache-style expressions.",
      "properties": {
        "namespace": {
          "$ref": "#/$defs/IdentifierKebab",
          "description": "Unique identifier for this binding. Used as qualifier in expressions for disambiguation."
        },
        "description": {
          "type": "string",
          "description": "A meaningful description of the binding's purpose. In a world of agents, context is king."
        },
        "location": {
          "$ref": "#/$defs/UriLocation",
          "description": "URI identifying the value provider. The URI scheme expresses the resolution strategy (file://, vault://, github-secrets://, k8s-secret://, etc.). When omitted, values are injected by the runtime environment."
        },
        "keys": {
          "$ref": "#/$defs/BindingKeys",
          "description": "Map of variable names to keys in the resolved source. Each key is the variable name used for injection, each value is the corresponding key in the provider."
        }
      },
      "required": [
        "namespace",
        "keys"
      ],
      "additionalProperties": false
    },
    "UriLocation": {
      "type": "string",
      "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*://",
      "description": "A URI with an explicit scheme identifying the resource provider."
    },
    "BindingVariableName": {
      "type": "string",
      "pattern": "^[A-Z][A-Z0-9_]*$",
      "description": "Variable name for binding injection (SCREAMING_SNAKE_CASE). Enforced for visual distinction from declared parameters in expressions."
    },
    "BindingKeys": {
      "type": "object",
      "description": "Map of variable names (SCREAMING_SNAKE_CASE) to source keys in the provider.",
      "propertyNames": {
        "$ref": "#/$defs/BindingVariableName"
      },
      "additionalProperties": {
        "$ref": "#/$defs/IdentifierExtended"
      }
    },
    "IdentifierKebab": {
      "type": "string",
      "description": "Kebab-case identifier (alphanumeric and hyphens).",
      "pattern": "^[a-zA-Z0-9-]+$"
    },
    "IdentifierExtended": {
      "type": "string",
      "description": "Extended identifier (alphanumeric, hyphens, underscores, and wildcard).",
      "pattern": "^[a-zA-Z0-9-_*]+$"
    },
    "BinarySize": {
      "type": "string",
      "description": "A binary size with a mandatory unit (`B`, `KiB`, `MiB`, or `GiB`), e.g. `512KiB`, `5MiB`, `1GiB`. The unit is required to avoid ambiguity (a bare number has no scale).",
      "pattern": "^\\d+(\\.\\d+)?(B|KiB|MiB|GiB)$"
    },
    "CacheScope": {
      "type": "string",
      "description": "Controls whether shared intermediaries may cache the response.",
      "enum": [
        "public",
        "private"
      ]
    },
    "ConsumedInputParameter": {
      "type": "object",
      "description": "Describes a single function parameter. A unique parameter is defined by a combination of a name and location.",
      "properties": {
        "in": {
          "type": "string",
          "description": "Location of the parameter",
          "enum": [
            "query",
            "header",
            "path",
            "cookie",
            "body",
            "environment"
          ]
        },
        "value": {
          "type": "string",
          "description": "Value of the parameter. Can be a static value or an expression resolved from the execution context (e.g. $this.namespace.param)"
        }
      },
      "required": [
        "in"
      ],
      "additionalProperties": false
    },
    "ExposedInputParameter": {
      "type": "object",
      "description": "Declares an input parameter for an exposed resource or operation. Type and description are mandatory since the framework cannot infer them.",
      "properties": {
        "in": {
          "type": "string",
          "description": "Location of the parameter.",
          "enum": [
            "query",
            "header",
            "path",
            "cookie",
            "body"
          ]
        },
        "type": {
          "type": "string",
          "description": "The expected data type of the parameter.",
          "enum": [
            "string",
            "number",
            "integer",
            "boolean",
            "array",
            "object"
          ]
        },
        "description": {
          "type": "string",
          "description": "A meaningful description of the parameter. Used for agent discovery and human documentation."
        },
        "pattern": {
          "type": "string",
          "description": "Optional regex pattern for validation. Only applicable when type is 'string'."
        },
        "value": {
          "type": "string",
          "description": "Static value or expression resolved from the execution context."
        }
      },
      "required": [
        "in",
        "type",
        "description"
      ],
      "additionalProperties": false
    },
    "ConsumedOutputParameter": {
      "type": "object",
      "description": "Extracts a named value from the raw API response for use in orchestration steps.\n\n**When to use** \u2014 Declare one entry per piece of data you need from the response. The `value` JsonPath expression is evaluated against the parsed response body.\n**Usage** \u2014 Extracted values are referenced by their key in step `with` mappings and `MappedOutputParameter` definitions.\n**Tip** \u2014 For array responses, use JsonPath wildcards (e.g. `$.results[*].id`) to extract a list.",
      "properties": {
        "type": {
          "type": "string",
          "description": "Expected type of the extracted value. Used for type-checking in step mappings.",
          "enum": [
            "string",
            "number",
            "boolean",
            "object",
            "array"
          ]
        },
        "value": {
          "type": "string",
          "description": "JsonPath expression evaluated against the parsed response body to extract this parameter. Examples: `$.id`, `$.results[*].name`, `$.meta.total`."
        }
      },
      "required": [
        "type",
        "value"
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameterBase": {
      "type": "object",
      "description": "Base for an inline-mapped output parameter with recursive typing and JsonPath extraction.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "object",
            "array"
          ]
        },
        "mapping": {
          "type": "string",
          "description": "JsonPath expression to extract the value. E.g. $.properties.Name.title[0].text.content"
        },
        "const": {
          "description": "Schema-level constant for validation and linting. Not used at runtime for value injection \u2014 use 'value' instead.",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "array"
            },
            {
              "type": "object"
            }
          ]
        },
        "value": {
          "type": "string",
          "description": "Static value injected at runtime. When provided, takes precedence over mapping."
        }
      },
      "required": [
        "type"
      ]
    },
    "MappedOutputParameterString": {
      "allOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "string"
            },
            "mapping": true,
            "const": true,
            "value": true
          },
          "oneOf": [
            {
              "required": [
                "mapping"
              ]
            },
            {
              "required": [
                "value"
              ]
            }
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameterNumber": {
      "allOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "number"
            },
            "mapping": true,
            "const": true,
            "value": true
          },
          "oneOf": [
            {
              "required": [
                "mapping"
              ]
            },
            {
              "required": [
                "value"
              ]
            }
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameterBoolean": {
      "allOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "boolean"
            },
            "mapping": true,
            "const": true,
            "value": true
          },
          "oneOf": [
            {
              "required": [
                "mapping"
              ]
            },
            {
              "required": [
                "value"
              ]
            }
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameterObject": {
      "allOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "object"
            },
            "mapping": true,
            "const": true,
            "value": true,
            "properties": {
              "type": "object",
              "description": "A map of named properties. Each key is a property name, each value is a typed output parameter.",
              "additionalProperties": {
                "$ref": "#/$defs/MappedOutputParameter"
              }
            }
          },
          "required": [
            "properties"
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameterArray": {
      "allOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "array"
            },
            "mapping": true,
            "const": true,
            "value": true,
            "items": {
              "$ref": "#/$defs/MappedOutputParameter"
            }
          },
          "required": [
            "items"
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "MappedOutputParameter": {
      "description": "Inline-mapped output parameter (simple mode). Used when the exposed operation has a single call + with.",
      "oneOf": [
        {
          "$ref": "#/$defs/MappedOutputParameterString"
        },
        {
          "$ref": "#/$defs/MappedOutputParameterNumber"
        },
        {
          "$ref": "#/$defs/MappedOutputParameterBoolean"
        },
        {
          "$ref": "#/$defs/MappedOutputParameterObject"
        },
        {
          "$ref": "#/$defs/MappedOutputParameterArray"
        }
      ]
    },
    "OrchestratedOutputParameterBase": {
      "type": "object",
      "description": "Base for a named output parameter whose value is populated by step mappings during orchestration.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "object",
            "array"
          ]
        }
      },
      "required": [
        "type"
      ]
    },
    "OrchestratedOutputParameterScalar": {
      "allOf": [
        {
          "$ref": "#/$defs/OrchestratedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "enum": [
                "string",
                "number",
                "boolean"
              ]
            }
          }
        }
      ],
      "unevaluatedProperties": false
    },
    "OrchestratedOutputParameterArray": {
      "allOf": [
        {
          "$ref": "#/$defs/OrchestratedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "array"
            },
            "items": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/$defs/OrchestratedOutputParameter"
              },
              "minProperties": 1
            }
          },
          "required": [
            "items"
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "OrchestratedOutputParameterObject": {
      "allOf": [
        {
          "$ref": "#/$defs/OrchestratedOutputParameterBase"
        },
        {
          "properties": {
            "type": {
              "const": "object"
            },
            "properties": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/$defs/OrchestratedOutputParameter"
              }
            }
          },
          "required": [
            "properties"
          ]
        }
      ],
      "unevaluatedProperties": false
    },
    "OrchestratedOutputParameter": {
      "description": "Named output parameter (orchestrated mode). Used when the exposed operation has steps with mappings/lookups.",
      "oneOf": [
        {
          "$ref": "#/$defs/OrchestratedOutputParameterScalar"
        },
        {
          "$ref": "#/$defs/OrchestratedOutputParameterArray"
        },
        {
          "$ref": "#/$defs/OrchestratedOutputParameterObject"
        }
      ]
    },
    "MockOutputParameter": {
      "type": "object",
      "description": "Named output parameter with a static or template value for mock mode (no call or steps). The value field supports Mustache templates resolved against input parameters at runtime.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean"
          ]
        },
        "value": {
          "type": "string",
          "description": "Static value or Mustache template resolved against input parameters at runtime."
        }
      },
      "required": [
        "type",
        "value"
      ],
      "unevaluatedProperties": false
    },
    "Hostname": {
      "type": "string",
      "description": "Valid hostname",
      "pattern": "^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
    },
    "IPv4": {
      "type": "string",
      "description": "Valid IPv4 address",
      "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
    },
    "IPv6": {
      "type": "string",
      "description": "Valid IPv6 address (simplified)",
      "pattern": "^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$"
    },
    "Address": {
      "description": "hostname or IP for the exposition",
      "anyOf": [
        {
          "$ref": "#/$defs/Hostname"
        },
        {
          "$ref": "#/$defs/IPv4"
        },
        {
          "$ref": "#/$defs/IPv6"
        }
      ]
    },
    "Info": {
      "type": "object",
      "description": "Information about the capability",
      "properties": {
        "display": {
          "type": "string",
          "description": "The display name of the capability"
        },
        "description": {
          "type": "string",
          "description": "A description of the capability (the more meaningful, the easier for agents discovery)"
        },
        "tags": {
          "type": "array",
          "description": "List of tags to help categorize the capability. It can be used for discovery and filtering purposes.",
          "items": {
            "type": "string"
          }
        },
        "created": {
          "type": "string",
          "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
          "description": "The date when the capability was created"
        },
        "modified": {
          "type": "string",
          "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
          "description": "The date when the capability was last modified"
        },
        "version": {
          "type": "string",
          "description": "The version of the capability"
        },
        "stakeholders": {
          "type": "array",
          "description": "List of stakeholders related to this capability. It can be used for discovery and filtering purposes.",
          "items": {
            "$ref": "#/$defs/Person"
          }
        }
      },
      "required": [
        "display",
        "description"
      ],
      "additionalProperties": false
    },
    "Person": {
      "type": "object",
      "description": "A person related to the capability",
      "properties": {
        "role": {
          "type": "string",
          "description": "The role of the person in relation to the capability. E.g. owner, editor, viewer"
        },
        "fullName": {
          "type": "string",
          "description": "The full name of the person"
        },
        "email": {
          "type": "string",
          "pattern": "^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$",
          "description": "The email address of the person"
        }
      },
      "required": [
        "role",
        "fullName"
      ],
      "additionalProperties": false
    },
    "Capability": {
      "type": "object",
      "description": "Capability technical configuration",
      "properties": {
        "binds": {
          "type": "array",
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/Binding"
              },
              {
                "$ref": "#/$defs/ImportEntry"
              }
            ]
          },
          "minItems": 1,
          "description": "External sources the capability binds to for variable injection. Inline `Binding` entries or `ImportEntry` references to a shared binds file."
        },
        "exposes": {
          "type": "array",
          "description": "List of exposed server adapters. Inline adapters (rest/mcp/skill/control) or `ImportEntry` references to a shared exposes file.",
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/ExposesRest"
              },
              {
                "$ref": "#/$defs/ExposesMcp"
              },
              {
                "$ref": "#/$defs/ExposesSkill"
              },
              {
                "$ref": "#/$defs/ExposesControl"
              },
              {
                "$ref": "#/$defs/ImportEntry"
              }
            ]
          },
          "minItems": 1
        },
        "consumes": {
          "type": "array",
          "description": "Consumed client adapters. Inline `ConsumesHttp` entries or `ImportEntry` references to a shared consumes file.",
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/ConsumesHttp"
              },
              {
                "$ref": "#/$defs/ImportEntry"
              }
            ]
          },
          "minItems": 1
        },
        "aggregates": {
          "type": "array",
          "description": "Domain aggregates defining reusable functions that adapters can reference via ref. Inline `Aggregate` entries or `ImportEntry` references to a shared aggregates file.",
          "items": {
            "oneOf": [
              {
                "$ref": "#/$defs/Aggregate"
              },
              {
                "$ref": "#/$defs/ImportEntry"
              }
            ]
          },
          "minItems": 1
        }
      },
      "anyOf": [
        {
          "required": [
            "exposes"
          ]
        },
        {
          "required": [
            "consumes"
          ]
        },
        {
          "required": [
            "exposes",
            "consumes"
          ]
        }
      ],
      "additionalProperties": false
    },
    "Aggregate": {
      "type": "object",
      "description": "A domain aggregate grouping reusable flows. Adapters reference these flows via ref.",
      "properties": {
        "display": {
          "type": "string",
          "description": "Human-readable name for this aggregate (e.g. 'Forecast')."
        },
        "namespace": {
          "$ref": "#/$defs/IdentifierKebab",
          "description": "Machine-readable qualifier for this aggregate. Used as the first segment in ref values. Must match the map key."
        },
        "flows": {
          "type": "object",
          "propertyNames": {
            "$ref": "#/$defs/IdentifierKebab"
          },
          "additionalProperties": {
            "$ref": "#/$defs/AggregateFlow"
          },
          "description": "Reusable callable flows within this aggregate, keyed by flow name.",
          "minProperties": 1
        }
      },
      "required": [
        "display",
        "flows"
      ],
      "additionalProperties": false
    },
    "AggregateFlow": {
      "type": "object",
      "description": "A reusable callable flow within an aggregate. Adapter units reference it via ref: aggregate-namespace.flow-name.",
      "properties": {
        "description": {
          "type": "string",
          "description": "A meaningful description of the flow."
        },
        "tags": {
          "type": "array",
          "description": "Arbitrary string tags for filtering and discovery.",
          "items": {
            "type": "string"
          }
        },
        "semantics": {
          "$ref": "#/$defs/Semantics"
        },
        "outputMediaType": {
          "type": "string",
          "description": "Contract-level media type advertised by this flow to downstream `exposes`. Independent of `outputRawFormat`, which is always inherited from the underlying consumed operation (call:) or the terminal step (steps:). Overrides the consumed op's `outputMediaType` for advertisement only; never changes how the entity is parsed."
        },
        "inputParameters": {
          "type": "object",
          "propertyNames": {
            "pattern": "^[a-zA-Z0-9-_*]+$"
          },
          "additionalProperties": {
            "$ref": "#/$defs/McpToolInputParameter"
          },
          "description": "Function input parameters, keyed by parameter name."
        },
        "call": {
          "type": "string",
          "description": "Reference to the consumed operation. Format: {namespace}.{operationId}.",
          "pattern": "^[a-zA-Z0-9-]+\\.[a-zA-Z0-9-]+$"
        },
        "with": {
          "$ref": "#/$defs/WithInjector"
        },
        "steps": {
          "type": "object",
          "propertyNames": {
            "$ref": "#/$defs/IdentifierKebab"
          },
          "additionalProperties": {
            "$ref": "#/$defs/OperationStep"
          },
          "description": "Orchestration steps, keyed by step name.",
          "minProperties": 1
        },
        "mappings": {
          "type": "array",
          "description": "Maps step outputs to the function's output parameters.",
          "items": {
            "$ref": "#/$defs/StepOutputMapping"
          }
        },
        "outputParameters": true
      },
      "required": [
        "description"
      ],
      "anyOf": [
        {
          "required": [
            "call"
          ],
          "type": "object",
          "properties": {
            "outputParameters": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/MappedOutputParameter"
              }
            }
          }
        },
        {
          "required": [
            "steps"
          ],
          "type": "object",
          "properties": {
            "mappings": true,
            "outputParameters": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/$defs/OrchestratedOutputParameter"
              }
            }
          }
        },
        {
          "required": [
            "outputParameters"
          ],
          "type": "object",
          "properties": {
            "outputParameters": {
              "type": "object",
              "additionalProperties": {
                "$ref": "#/$defs/MockOutputParameter"
              },
              "minProperties": 1
            }
          }
        }
      ],
      "additionalProperties": false
    },
    "Semantics": {
      "type": "object",
      "description": "Transport-neutral behavioral metadata for an invocable unit. Used for design-time tooling and adapter derivations (e.g. MCP hints).",
      "properties": {
        "safe": {
          "type": "boolean",
          "description": "If true, the function does not modify state. Default: false."
        },
        "idempotent": {
          "type": "boolean",
          "description": "If true, repeating the call has no additional effect. Default: false."
        },
        "cacheable": {
          "type": "boolean",
          "description": "If true, the result can be cached. Default: false."
        }
      },
      "additionalProperties": false
    },
    "ExposesRest": {
      "type": "object",
      "description": "REST exposition configuration",
      "properties": {
        "type": {
          "type": "string",
          "const": "rest"
        },
        "address": {
          "$ref": "#/$defs/Address"
        },
        "port": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65535
        },
        "namespace": {
          "$ref": "#/$defs/IdentifierKebab",
          "description": "Unique identifier for this exposed API"
        },
        "authentication": {
          "$ref": "#/$defs/Authentication",
          "description": "Authentication required on incoming requests to this REST adapter. Protects all resources and operations under this adapter. Supports `basic`, `apikey`, `bearer`, `digest`, and `oauth2` (JWT/introspection)."
        },
        "maxBinarySize": {
          "$ref": "#/$defs/BinarySize",
          "description": "Maximum allowed binary response size before 

# --- truncated at 32 KB (104 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/naftiko/refs/heads/main/json-schema/naftiko-ikanos-capability-schema.json

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/naftiko-ikanos-capability"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.