Tenant skills user guide

Tenant skills let you teach Tealfabric how your organization works without changing application code. Each skill is a small package of written instructions and optional capability declarations. When the package is placed in your tenant workspace, Trace AI can load it on demand during chat.

Document information
FieldValue
Canonical URL/docs/07_ai-agents-and-mcp/15_tenant-skills-user-guide
Version (published date)2026-08-20
Tagsai, agents, skills, mcp, trace-ai

Tenant skills flow from packaged instructions in the SKILLS folder through policy-checked agent behavior.

What a skill is

A skill is not a separate application. It is a portable instruction set: a named folder that tells an agent what to prioritize, how to phrase work, and which supporting actions it may request. Skills are meant for durable knowledge, such as how to triage support tickets, how to summarize documents in your house style, or which escalation rules apply in your region.

Skills complement one-off chat messages because the guidance can be loaded again in later turns until context limits trim older tool results.

Package layout

Create a top-level folder named SKILLS in your tenant workspace file storage. Inside it, add one subfolder per skill. Filenames and the folder name are case-sensitive.

SKILLS/
  invoice-review/          ← skill_id (folder name)
    SKILL.md               ← required
    skill.json             ← optional

If you manage tenant files through Workspace → Documents, create the SKILLS path there. If your operations team deploys tenant files through a release process, include the SKILLS tree in that deployment.

When you add, change, or remove a skill folder, Trace AI discovers valid packages on the next chat run that builds MCP context. Folders without SKILL.md or with an invalid folder name are skipped so one broken package does not hide the rest. A folder that is discovered but has invalid skill.json is rejected at load time (Skill manifest rejected: …).

Folder name (skill_id)

The folder name is the skill_id passed to load_tenant_skill. skill.json name does not alias or replace it.

Allowed characters: letters, digits, underscore, hyphen. Length 1–64. Pattern:

^[a-zA-Z0-9_-]{1,64}$
Valid folder namesInvalid folder names
invoice-reviewinvoice review (space)
sales_collectorsales.collector (dot)
SalesCollectorsales/contact (slash; would be nested folders)
a1empty, or longer than 64 characters

Ask Trace AI to load the folder name. If the folder is sales-collector, load sales-collector, not a display title from SKILL.md or skill.json.

Required and optional files

FileRequiredRules
SKILL.mdYesExact name. UTF-8, non-empty after trim. Not a directory.
skill.jsonNoExact name. UTF-8 JSON object (not an array). If present, every supplied field is validated.

Do not use skill.md, README.md, or Skill.json. Those names are not discovered or loaded.

Enabling skills in your environment

Use Trace AI in chat or POST /api/v1/chat/trace-ai from automation. Other agents (for example Assistant or Platform Engineer Agent) do not expose load_tenant_skill. If skills do not appear or never load, ask your platform operator whether Trace AI and tenant skills are enabled for your deployment (CHAT_TENANT_SKILLS_ENABLED).

See Trace AI Agent for endpoints, access, and examples.

The SKILL.md file

Write SKILL.md in plain Markdown. The whole file is returned to Trace AI when the skill loads (subject to normal model context budgets on tool history).

Start with a level-one heading on its own line:

# Invoice review

That heading becomes the default description when you omit description in skill.json. The heading must start with # (hash, space, then title). Headings that use ## only, or #Title with no space, are not used as the default description.

The body should read like guidance to a capable colleague. Useful sections:

  • When to use the skill, and when not to
  • Required inputs (names and types)
  • Ordered steps, including which existing MCP tools to call
  • Output format
  • Stop rules (do not invent data, do not skip steps)

Keep instructions specific enough to change behavior but general enough to age well. Name MCP tools only when they already exist in your tenant catalog. Long skills are acceptable.

Minimal valid SKILL.md:

# Invoice review

Review incoming invoices against purchase-order rules.

## Inputs
- invoice_path (required)

## Sequence
1. Read the invoice file.
2. Compare line items to the purchase order.
3. Return a table of mismatches. Do not invent line items.

## Stop
If the invoice or purchase order is missing, stop and report the gap.

The skill.json manifest (optional)

skill.json is optional. When omitted, the loader uses:

FieldDefault
nameFolder name
version1.0.0
descriptionFirst # heading in SKILL.md, or the folder name
capabilitiesEmpty prompt, resources, and tools arrays

When the file is present, it must be a JSON object. Extra keys are ignored. Missing keys still use the defaults above. Invalid values reject the skill; they are not ignored.

Field syntax

{
  "name": "invoice-review",
  "version": "1.0.0",
  "description": "Review incoming invoices against purchase-order rules.",
  "capabilities": {
    "prompt": ["Use the invoice checklist in SKILL.md"],
    "resources": [],
    "tools": ["read_file", "entity_search"]
  }
}
FieldTypeRequiredValidation
namestringNoSame pattern as the folder: ^[a-zA-Z0-9_-]{1,64}$. Should match the folder name. Spaces, dots, and slashes fail with invalid_manifest_name.
versionstringNoExactly three non-negative integers separated by dots: MAJOR.MINOR.PATCH. Pattern ^\d+\.\d+\.\d+$. Default 1.0.0.
descriptionstringNoNon-empty after trim. Default is the first # heading in SKILL.md. Empty string fails with invalid_manifest_description.
capabilitiesobjectNoMust be an object if present, not an array or string.
capabilities.promptstring arrayNoArray of strings. Omit the key, or use []. A string or object fails with invalid_manifest_capability_prompt.
capabilities.resourcesstring arrayNoOpaque hint strings for the model; not platform resource UUIDs. Same array rule as prompt.
capabilities.toolsstring arrayNoMCP tool names that already exist for your tenant. Declaring a name does not add tools. Same array rule as prompt.

Empty strings inside the arrays are dropped. Arrays may be empty.

Version format (common rejection)

invalid_manifest_version means version was present but did not match MAJOR.MINOR.PATCH with digits only.

ValidInvalid
1.0.0v1
0.0.11.0
2.10.31
1.0.0v1.0.0
1.0.01.0.0-beta

If you do not need metadata, omit skill.json entirely rather than putting a non-semver version in it.

What capabilities does and does not do

FieldEffect at load time
promptAuthoring hints. The instructions Trace AI must follow are the SKILL.md body.
resourcesHints only. Trace AI fetches data with MCP tools such as get_context_resource; these strings are not auto-fetched.
toolsNames of tools the skill intends to use. Skills cannot grant new tools or bypass guardrails.

Put the workflow in SKILL.md. Use capabilities.tools as a checklist of tool names that already appear in the MCP catalog for that chat run.

How Trace AI uses skills

Trace AI does not copy all skills into the system prompt at the start of a conversation. When a task matches a skill, the model should call load_tenant_skill with skill_id set to your folder name:

{ "skill_id": "invoice-review" }

The platform returns the full SKILL.md body wrapped as:

<Tenant_Skill id="invoice-review" version="1.0.0">
…SKILL.md contents…
</Tenant_Skill>

That content stays in the conversation as a tool result until summarization or message budgets compress older tool history.

The list of skill ids available for your tenant appears in the load_tenant_skill tool description in the MCP tool catalog for that run.

Install one skill per concern when possible. Avoid contradictory rules across skills. Load when relevant; the agent is instructed not to reload the same skill on every message.

Authoring practices that work well

Name skills after the job they support, not after a person or a project codename. Bump version in skill.json when you make material changes so operators can tell whether a deployment updated behavior. Test by asking Trace AI the same question before and after you add the folder, with realistic tenant file paths when the skill concerns documents.

Treat skills as production configuration. Use the same change control you would for guardrails or integration credentials.

In Trace AI, you can ask the agent to create or repair a package. It should load the official tenant-skill-authoring platform skill (load_platform_skill), then write SKILLS/{id}/SKILL.md and optional skill.json in your tenant workspace. That is different from load_tenant_skill, which runs a package that is already installed.

To install a published business playbook from the Library (Marketing → Support, DataPool schemas, handovers), ask Trace to use model-skill-import. Trace will search the tenant for Prerequisites (tables, in-app notification recipients) and ask when a value is missing or ambiguous. See Model skills library.

Safety and boundaries

Skills cannot override MCP guardrails, API key scopes, or tenant isolation. They declare intent; the platform enforces what is actually allowed. If a skill lists a tool that your guardrails block, that tool remains unavailable.

For guardrail schema details, see MCP guardrails configuration schema.

Example: a document review skill

Create SKILLS/document-review/SKILL.md:

# Document review

Summarize an attached or named tenant file.

## Sequence
1. Identify the file path.
2. Read the file.
3. Reply with Purpose, Risks, and Recommended actions, in that order.

Optional SKILLS/document-review/skill.json:

{
  "name": "document-review",
  "version": "1.0.0",
  "description": "Summarize a tenant document into purpose, risks, and recommended actions.",
  "capabilities": {
    "prompt": ["Keep the three section headings in SKILL.md"],
    "resources": [],
    "tools": ["read_file"]
  }
}

Open Trace AI (not Assistant) and ask it to load document-review and summarize an attached file. Replies should follow the section order you defined.

Troubleshooting

Symptom or loader reasonWhat to check
Skill never appears / unknown skill idUsing Trace AI; tenant skills enabled; folder is SKILLS/{id}/ with exact SKILL.md; skill_id equals the folder name.
invalid_manifest_versionversion must be 1.0.0-style (digits.digits.digits). Not v1, 1.0, or 1.0.0-beta. Or omit skill.json.
invalid_manifest_namename uses only A–Z, a–z, 0–9, _, -, max 64 characters.
invalid_manifest_descriptionProvide a non-empty description, or a # Title line in SKILL.md.
invalid_manifest_json / invalid_manifest_shapeFile is valid JSON and a single { … } object, not an array.
invalid_manifest_capability_prompt (or resources / tools)That field is a JSON array of strings, or omitted.
empty_skill_markdownSKILL.md has content after trim.
Wrong or empty instructionsNon-empty SKILL.md; you loaded the folder name you intended.
Tool in manifest unavailableTool must already exist in MCP tools_available; adjust guardrails with your administrator. Declaring it in skill.json does not add it.
Trace AI refuses because policy_audit.deniedNot a tenant-admin switch. Tenant skill load used to list every capabilities.tools name as denied in prompt-only mode. After a successful load, the agent should call session tools. Ask it to continue the sequence.
Skill applied once then “forgotten”Normal context trimming; ask the model to call load_tenant_skill again if needed.

See also