workspace.yml is the configuration file at the root of every Friday space. It defines agents, jobs, signals, memory stores, and MCP server connections. Friday Studio reads this file at startup and applies it live when you save changes.
The annotated example below is drawn from the GitHub Digest starter space — a scheduled job that summarizes open PRs and review requests every Monday and Thursday.
Complete annotated example
Field reference
version
| Field | Type | Required | Description |
|---|---|---|---|
version | string | Yes | Always "1.0". |
workspace
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name shown in Friday Studio. |
description | string | No | One-line description of what the space does. |
signals
Each entry under signals is a named trigger. The key becomes the signal id referenced in job triggers and FSM states.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | Yes | Human-readable description. |
provider | string | Yes | One of: schedule, http, fs-watch, slack, telegram, discord, whatsapp, teams. (system is reserved for internal signals.) |
config | object | Yes | Provider-specific config. See Signal providers. |
| Field | Type | Description |
|---|---|---|
schedule | string | Standard 5-field cron expression. |
timezone | string | IANA timezone string, e.g. America/Los_Angeles. |
| Field | Type | Description |
|---|---|---|
path | string | URL path that triggers the webhook, e.g. /hooks/my-trigger. The method is always POST. |
timeout | duration | Optional timeout for signal processing. |
jobs
Each entry under jobs is a named job. Jobs are FSM (finite state machine) definitions that describe which agent runs in which state and what transitions to make.
| Field | Type | Required | Description |
|---|---|---|---|
description | string | No | Human-readable description. |
triggers | array | No | List of { signal: signalId } objects. Omit for jobs invoked only from chat or run manually. |
fsm | object | Yes* | FSM definition. *A job specifies exactly one of fsm (shown here) or execution, an agent-pipeline alternative. |
fsm.initial | string | Yes | Name of the starting state. |
fsm.states | object | Yes | Map of state name to state definition. |
| Type | Fields | Description |
|---|---|---|
agent | agentId, prompt?, outputTo? | Invoke a configured agent. outputTo saves the result as a named artifact. |
llm | provider, model, prompt, tools?, outputTo? | Run an inline LLM step without defining a named agent. |
emit | event | Emit a named event to drive a state transition. |
notification | message, communicators? | Send a message to configured communicators (Slack, Telegram, …). |
agents
Each entry under agents is a named agent. The key is the agentId referenced in job FSM entry actions.
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | One of: llm, atlas, user, system. |
description | string | Yes | Human-readable description. |
config | object | Varies | Agent-specific config. Required for llm; optional for system; atlas and user take top-level agent/prompt instead. |
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | Inference provider. Common values: anthropic, openai, gemini, groq. |
model | string | Yes | Model identifier, e.g. claude-sonnet-4-6. |
prompt | string | Yes | System prompt for the agent. |
tools | array | No | MCP tool allowlist in serverId/toolName format. Omit to allow all tools from all enabled servers. |
| Field | Type | Required | Description |
|---|---|---|---|
agent | string | Yes | Atlas Agent ID from the registry, e.g. web, gh, slack, hubspot. |
prompt | string | Yes | Task-specific context layered on the bundled agent’s behavior. |
config | object | No | Agent-specific configuration passed to the agent. |
env | object | No | Environment variables. Values can be literals or a Link reference ({ from: link, … }). |
tools.mcp
| Field | Type | Description |
|---|---|---|
client_config.timeout.progressTimeout | duration | How long to wait between tool call progress updates before timing out. |
client_config.timeout.maxTotalTimeout | duration | Maximum total time for a single tool call. |
servers | object | Map of server id to server config. |
| Field | Type | Description |
|---|---|---|
transport.type | string | http or stdio. |
transport.url | string | For http transport: the MCP server URL. |
transport.command | string | For stdio transport: the command to run. |
transport.args | array | For stdio transport: command arguments. |
auth.type | string | bearer (the only supported value). Omit the entire auth block for servers that need no auth. |
auth.token_env | string | Name of the env var holding the bearer token. |
env | object | Env var definitions. Values can be literals or a Link reference: { from: link, key, … } with either provider (e.g. github) or a specific credential id. |
memory
| Field | Type | Description |
|---|---|---|
own | array | Memory stores owned by this space. Each entry: { name, type, strategy? }. |
mounts | array | Cross-space memory mounts. Each entry: { name, source, mode, scope, scopeTarget? }. |
| Field | Values | Description |
|---|---|---|
type | short_term, long_term, scratchpad | Retention policy. |
strategy | narrative | How entries are written and retrieved. Optional; narrative is the only value. |
| Field | Values | Description |
|---|---|---|
source | string | {spaceId}/narrative/{storeName} path to the source store. |
mode | ro, rw | Read-only or read-write access. Defaults to ro. |
scope | workspace, job, agent | How broadly the mount is visible within this space. |
scopeTarget | string | Required when scope is job or agent — the id of the job or agent to scope the mount to. Omit for scope: workspace. |
More examples
Browse the Friday Studio Examples repo for a dozen ready-made spaces with completeworkspace.yml files covering email, GitHub, Telegram, Google Sheets, price monitoring, and more.
