/docs / agents/configuration

agent.json Reference

agent.json holds everything about an employee that is not prose: the capabilities it requires, the questions it asks the owner, how its memory is kept, which operations always need approval, and the workflows it runs. Every field is optional.

Example

{
  "requires": {
    "interfaces": ["ledger", "mail"],
    "plugins": [],
    "tools": []
  },
  "skills": ["@example/skills/receipt-capture"],
  "inputs": [
    {
      "key": "invoice_mailbox",
      "label": "Mailbox that receives vendor invoices",
      "type": "text",
      "id": "finance.ap.invoice_mailbox",
      "scope": "company",
      "required": true,
      "missing": "Ask the owner which mailbox to watch before processing invoices."
    }
  ],
  "memory": {
    "mode": "separate",
    "topics": [
      { "slug": "vendor", "description": "A supplier: terms, usual amounts, contacts, open disputes" }
    ]
  },
  "subscribes": ["finance.ap.*"],
  "ceiling": { "ledger.bill.create": "approval" },
  "workflows": {
    "invoice-intake": {
      "trigger": { "type": "watch", "plugin": "mail", "event": "email.new" },
      "activities": [
        { "id": "record", "intent": "If the message in _watch_payload is a vendor invoice, record it as a bill." }
      ]
    }
  }
}

Fields

FieldTypeMeaning
requires.interfaceslist of stringsCapabilities the role needs, such as mail or ledger. Granted at hire; each approval-gated operation stays an approval item. See Capabilities and Approvals.
requires.pluginslist of stringsPlugins installed with the employee. Use only when the role truly depends on one plugin; prefer a capability.
requires.toolslist of stringsTools loaded into the employee’s session from its first turn. This never bypasses approval.
skillslist of stringsMarketplace skills to install and use: @org/skills/name, optionally @version, or a SKIL- code. Skills in the package’s own skills/ folder need no entry.
inputslistQuestions the owner answers at hire. See Inputs.
memoryobjectHow conversations and memory are kept. See Persona and Memory.
subscribeslist of stringsCompany fact areas the employee re-reads when they change, such as finance.ar.*.
ceilingmapOperation to "approval". That operation always asks the owner for this employee. No other value is accepted.
workflowsmapWorkflow name to workflow. See Workflows.
toolslistHTTP tools served by an app’s sidecar. See Sidecar tools.
scopesmapNamed groups of tools, skills and plugins. A scope’s plugins are described to the employee when that scope is active.

Inputs

An input is a question the owner answers when hiring. Answers appear to the employee under "Configured Inputs" and fill {{key}} placeholders in watch and folder triggers.

{
  "key": "close_day",
  "label": "Business day to finish the close",
  "type": "select",
  "options": [
    { "value": "3", "label": "Third business day" },
    { "value": "5", "label": "Fifth business day" }
  ],
  "default": "5",
  "scope": "company",
  "id": "finance.close.day"
}
FieldDefaultMeaning
keyrequiredName used in placeholders. name is accepted as a fallback.
labelfrom keyThe question shown to the owner.
typetexttext, textarea, number, select, checkbox or radio.
requiredfalseMarks the question as one the owner must answer.
defaultnonePre-filled answer. Not allowed on a money question.
placeholder, descriptionnoneHelp text.
optionsnoneFor select and radio: {value, label} objects or plain strings.
idnoneA stable, dotted name for the fact, such as finance.ap.invoice_mailbox, so other employees can share it.
scopecompanycompany: a shared company fact. seat: this hire only.
missingnoneWhat the employee does while the question is unanswered.
moneyfalseMarks a money amount. A money question cannot have a default.

Sidecar tools

An app with a sidecar exposes HTTP endpoints to its employee as tools. Nebo registers each entry as app__<app>__<name> and sends calls to the sidecar at method and path. See App Sidecar.

"tools": [
  {
    "name": "list_entries",
    "description": "List journal entries for a date range.",
    "method": "GET",
    "path": "/entries",
    "input_schema": { "type": "object", "properties": { "from": { "type": "string" } } }
  }
]

Workflows

Each key under workflows names one workflow; the name is its identifier. The full format is on Workflows, Triggers and Activities.