Deploy the Slack Coding Agent
You are setting up an Omnara agent for the user from agent.yaml in this
folder. The goal: a coding agent the user's team can mention in Slack, in
Discord, or on a GitHub pull request, which works on one of their GitHub
repositories and opens pull requests, and which the user has watched answer
once.
The steps below are the usual path and have the exact commands. Skip anything that's already done (for example, the token and profile exist and the user only wants a different model), follow the user's lead if they want a different order, and narrate briefly as you go.
- Start from
agent.yamlas written. If the user wants something different (the instruction, tools, or model), change it and tell them what you changed. - If the user wants the agent to read their issue tracker (Linear, Jira, and
so on), add the tracker's MCP server in an
mcp:block, store its credential withnpx omnara secrets mcp-oauth(OAuth) or as agenericsecret (API key), and add a short instruction section on how to use it. Tell the user that an OAuth connection acts as whoever approves it, so its writes appear under that person's name. - If a command fails, read the error and fix it;
npx omnara <command> --helpand docs.omnara.com have the details. If you're stuck, show the user the error.
The commands use the Omnara CLI (npx omnara) because its login handles auth
in one step; add --json when you need to read IDs from the output. They're a
reference, not a requirement: the Omnara MCP tools, the
REST API, or the SDK work
too, and the flags map directly to API fields. What matters is the result: a
secret with the GitHub token, a profile from the filled-in agent.yaml, and
the integrations the user picks in step 5. Slack and Discord setup is
simplest with the CLI; registering a GitHub App needs the Omnara dashboard.
1. Connect to Omnara
-
Run
npx omnara whoami. If it reports that you aren't logged in, runnpx omnara loginin an interactive terminal, share the approval link it prints, and wait until the user approves. -
Pick the org and project.
npx omnara whoami --jsonlists the user's orgs, andnpx omnara projects list --org <org-id> --jsonlists an org's projects.- If there's only one org and one project, use them.
- If there are several of either, ask the user which to use. Suggest the
current defaults from
npx omnara configif they're set, otherwise the project namedDefault.
Save the choice with
npx omnara config --org <org-id> --project <project-id>.
Remember the project ID; later steps need it.
2. Choose the repository and store a GitHub token
Ask which repository the agent works on (GITHUB_REPO, as owner/name). One
repository is supported as written.
The agent pushes branches and opens pull requests, so it needs a token with
write access. Recommend a
fine-grained token
limited to that repository, with Contents and Pull requests set to
read and write. Optional extras: Issues read (to read linked issues),
Actions read (to read CI logs), and Workflows read and write (only if
it should edit .github/workflows). Commits and pull requests appear under
the token owner's account, so a dedicated bot account keeps them separate
from a person's. If the repository belongs to an organization, its owners
may need to approve the token.
-
Check for an existing secret:
npx omnara secrets list --owner-kind project --owner-project-id <project-id> --name slack-coding-agent-github --json. If one exists, ask whether to reuse it. To reuse it, note itsidand skip to step 3. To change its value, have the user update it on the Secrets page of the Omnara dashboard (the ID stays the same) and skip to step 3. -
Ask the user to add the token to a
.envfile in the current directory and tell you when it's saved (pasting it in the chat also works):shAGENT_GITHUB_TOKEN=github_pat_... -
Create the secret:
shset -a && . ./.env && set +a npx omnara secrets create --owner-kind project --owner-project-id <project-id> \ --name slack-coding-agent-github --material-kind generic \ --material-value "$AGENT_GITHUB_TOKEN" --jsonNote the
id(sec_…) asGITHUB_TOKEN_SECRET_ID.
3. Pick the model and machine pool
npx omnara grant models list --json: each item hasmodel.provider_configandmodel.name. Ask the user which model to use. Suggestanthropic/claude-opus-5.5onomnara-openrouterif it's granted (agent.yamlruns it at high reasoning effort); otherwise suggest the strongest coding model on the list. Name a couple of alternatives rather than the whole list, and show everything if they ask. The choice givesMODEL_PROVIDER_CONFIGandMODEL_NAME.npx omnara grant pools list --json; each grant'smachine_pool.nameis a candidateMACHINE_POOL. Suggestdefault-poolif it's granted: its machines come withgit,gh, and common language toolchains. Otherwise use the only pool, or ask if there are several. If there are none, tell the user the project needs a machine pool; the agent can't work on code without one. On a custom pool, the image needsgitandgh.
4. Create the agent
-
Copy
agent.yamlfrom this folder to./slack-coding-agent.yamlin the current directory. If this folder isn't available locally, download https://raw.githubusercontent.com/omnara-ai/omnara/main/examples/slack-coding-agent/agent.yaml instead. -
In the copy, replace every placeholder:
Placeholder Value {{GITHUB_REPO}}from step 2 (it appears twice) {{GITHUB_TOKEN_SECRET_ID}}from step 2 {{MODEL_PROVIDER_CONFIG}}from step 3 {{MODEL_NAME}}from step 3 {{MACHINE_POOL}}from step 3 Then confirm nothing is left:
grep -n '{{' slack-coding-agent.yamlmust print nothing. -
Check for an existing profile:
npx omnara profiles list --name slack-coding-agent --json.- None:
npx omnara profiles create --name slack-coding-agent --file ./slack-coding-agent.yaml --json - Exists:
npx omnara profiles update <agent-profile-id> --file ./slack-coding-agent.yaml --json
If it rejects the reasoning effort, the chosen model doesn't support
high: remove thereasoningblock and retry. Note the profileid. - None:
5. Choose where the team reaches it
Ask where the team should mention the agent: Slack, Discord, GitHub pull requests, or any combination. Wherever it's mentioned, it answers in that thread or pull request, and replies there go to the same agent.
Slack. If npx omnara integrations list --json already has an integration
named slack-coding-agent-slack from an earlier run of this skill, reuse it
whatever its state, since names are unique in a project. If
npx omnara integrations get <integration-id> --json doesn't list this profile
under settings.launcher.profiles, add it with
npx omnara integrations profiles <integration-id> --profile-ids <agent-profile-id>;
the flag replaces the list, so repeat each profile already there. Then, if its
state is active, skip to its last step. If it's disconnected, setup didn't
finish: skip step 2, and redo step 1 only if the token in .env has expired.
-
The user creates an app configuration token at api.slack.com/apps under Your App Configuration Tokens → Generate Token. It expires after about 12 hours. Have the user add it to
.envasSLACK_APP_CONFIG_TOKEN=.... -
Create the integration with this profile in its launcher, so a mention starts this agent, and note the
itg_…ID it returns:shnpx omnara integrations create --name slack-coding-agent-slack \ --integration-kind slack_thread \ --settings '{"launcher":{"profiles":["<agent-profile-id>"]}}' --jsonThe name is permanent and names the agent's Slack tools (
int__slack-coding-agent-slack__post_message). -
Create the Slack app and connect it:
shset -a && . ./.env && set +a npx omnara integrations slack <integration-id> --app-name "Coding Agent" \ --app-configuration-token "$SLACK_APP_CONFIG_TOKEN"Ask before choosing a different app name; it's how the team mentions the bot. It opens a Slack authorization page that the user approves before it expires.
-
Tell the user to invite the bot to a channel (
/invite @Coding Agent). A private channel suits it, since threads often include internal details.
Discord. The bot answers in a new thread wherever it's mentioned in a server channel; it doesn't answer direct messages.
If an integration named slack-coding-agent-discord already exists, reuse it
the same way: add this profile if it's missing. If it's active, skip to
step 5; Omnara can't tell whether steps 5 and 6 were done in Discord, so check them
with the user. If it's disconnected, skip step 3 and do the steps that weren't
done, passing the current setup_revision from
npx omnara integrations get <integration-id> --json in step 4.
-
The user creates an application named "Coding Agent" in the Discord Developer Portal; ask before choosing a different name, since it's how the team mentions the bot. They copy the Application ID and Public Key from General Information. Under Bot, they select Reset Token to copy the bot token, turn on Message Content Intent, and turn off Public Bot so only they can add it (if Discord refuses, first set Installation → Install Link to None). Have the user add the values to
.env:shDISCORD_APPLICATION_ID=... DISCORD_PUBLIC_KEY=... DISCORD_BOT_TOKEN=... -
Store the bot token and note the
sec_…ID. If a secret namedslack-coding-agent-discord-bot-tokenalready exists (npx omnara secrets list --owner-kind project --owner-project-id <project-id> --name slack-coding-agent-discord-bot-token --json), reuse its ID; if the user has reset the token since, have them paste the new one into it on the dashboard's Secrets page (the ID stays the same). Otherwise:shset -a && . ./.env && set +a npx omnara secrets create --owner-kind project --owner-project-id <project-id> \ --name slack-coding-agent-discord-bot-token --material-kind generic \ --material-value "$DISCORD_BOT_TOKEN" --json -
Create the integration with this profile in its launcher, and note the
itg_…ID andsetup_revisionit returns:shnpx omnara integrations create --name slack-coding-agent-discord \ --integration-kind discord_thread \ --settings '{"launcher":{"profiles":["<agent-profile-id>"]}}' --jsonThe name is permanent and names the agent's Discord tools (
int__slack-coding-agent-discord__post_message). -
Connect the bot. Omnara checks the token and finds the bot's user:
shset -a && . ./.env && set +a npx omnara integrations configure <integration-id> \ --expected-setup-revision <setup-revision> \ --provider-tenant-id "$DISCORD_APPLICATION_ID" \ --credential-secret-id <secret-id> \ --provider-config "{\"public_key\":\"$DISCORD_PUBLIC_KEY\"}" --json -
Under General Information, the user sets Interactions Endpoint URL to
https://app.omnara.com/api/integrations/discord/<application-id>/interactionsand saves; the buttons on the bot's questions need it. Discord checks the URL when it's saved, so this has to come after step 4. -
The user adds the bot to their server by opening this link, which asks only for the permissions the bot needs:
https://discord.com/oauth2/authorize?client_id=<application-id>&scope=bot&permissions=309237746752&integration_type=0. A private channel suits it, since threads often include internal details; the user adds the bot to it under the channel's Permissions.
GitHub pull requests. Someone with write access mentions the GitHub App in a pull request comment, and the agent works on that pull request: it reviews it, answers in comments, or pushes fixes to its branch.
If an integration named slack-coding-agent-github already exists, reuse it
whatever its state: if npx omnara integrations get <integration-id> --json
doesn't show this profile under settings.launcher.profile, set it with the
update command below. Then skip to step 3 if it's active, since Omnara can't
tell whether it was done on GitHub, or to step 2 if it's disconnected; the
integration's page shows what's left.
-
Create the integration with this profile in its launcher, and note the
itg_…ID it returns:shnpx omnara integrations create --name slack-coding-agent-github \ --integration-kind github_pr \ --settings '{"launcher":{"trigger":"mention","profile":"<agent-profile-id>"}}' --jsonThe name is permanent and names the agent's pull request tools (
int__slack-coding-agent-github__discussion_comment)."mention"starts the agent only when someone mentions the App;"both"also starts one for every new pull request, so ask before using it. To change it later, runnpx omnara integrations update <integration-id> --settings '...'with the wholesettingsobject. -
Registering the GitHub App happens in the browser. Have the user open
https://app.omnara.com/projects/<project-id>/integrations/<integration-id>, pick the account that ownsGITHUB_REPO, and select Continue to GitHub. On GitHub they name the App. Names are unique across GitHub, so suggest one with the team's name, such as "Acme Coding Agent"; its slug (acme-coding-agent) is how the team mentions it. Back in Omnara they select Choose repositories on GitHub, grant onlyGITHUB_REPO, and then Connect integration. An organization's owners may need to approve the installation first. -
Omnara gives the App read-only access to code, so it can't push fixes yet. In the App's settings on GitHub (Settings → Developer settings → GitHub Apps → the App → Edit, under the organization's settings if an organization owns it), the user opens Permissions & events, sets Repository permissions → Contents to Read and write, and saves. Whoever installed the App then accepts the new permission on the installation's settings page; until then pushes fail. On the App's General page, also check that Webhook URL is
https://app.omnara.com/api/integrations/github/events, and correct it if not; mentions don't reach Omnara otherwise. -
Tell the user to comment on an open pull request in
GITHUB_REPO: "@acme-coding-agent summarize this PR", with their App's slug.
6. Give it a first task
Have the user mention the bot in Slack or Discord with a question that doesn't change anything:
@Coding Agent what does this repo do, and how do I run its tests?
The first reply takes a minute or two while the machine starts and clones the repository. The conversation also shows up as an agent in the Omnara console (app.omnara.com), where the user can watch every command it runs. Once the answer looks right, suggest a small real fix as the next message, such as a known bug or a typo, so they see it open a pull request. With only GitHub connected, the comment from step 5 is the first task.
7. Wrap up
Summarize what you created: the secret, the profile, and the Slack, Discord, or GitHub integrations. Then tell the user:
- Start it from elsewhere too: anything that can call the API (a Linear webhook, a CI job) can launch an agent from the profile with the task as the message; see docs.omnara.com. The instruction assumes a Slack or Discord thread or a pull request, so for those entry points adjust its Reporting Guidelines.
- Change the instruction, model, or anything else: ask a coding agent with this skill. It reuses the secret and updates the profile in place.
- Remove it: delete the Slack, Discord, and GitHub integrations, if any
(
npx omnara integrations delete <integration-id>), or, if other agents share a Slack or Discord one, rerunnpx omnara integrations profileswith only their profiles. Then runnpx omnara profiles delete <agent-profile-id>andnpx omnara secrets delete <secret-id>for each secret. Revoke the GitHub token in GitHub's settings as well, and delete the Discord application or GitHub App if there is one.


