Convoy AI

Product Station · Dev & ops

GitHub

CommunityBuilt with LauncherTemplate

Open a pull request and comment, never push to the main branch.

The control station, in brief

This station sits between your agent and the tool. Before any call, it checks who is acting, shows only the useful tools, applies the rules below and keeps track of the task.

It can

  • Read a repository
  • Open a pull request from a branch
  • Comment

It asks a human for

  • Merge a pull request

It never has access to

  • Push to main

Scenario Replays

An agent works through the station. Simulated scenarios, no real data, no key required.

Open a pull request

What you will see: The agent proposes, a human decides: everything goes through a branch and a review.

Agent connected to the station through MCP
  1. HumanFix the typo in the README and open a PR.
  2. AgentI'll read the file, then propose the fix on a branch.
  3. MCP callreadFile(path: "README.md")
  4. StationFile read.OKRule applied: profile contributor
  5. MCP callopenPullRequest(branch: "fix/readme-typo")
  6. StationPull request opened from a branch. A human will review it before any merge.OKRule applied: branch-only
These rules are not yours?

Copy the station, change a limit or an approval step in its configuration file, and get your own station.

Copy and adapt

The configuration in detail

github.yamlRead the docs →

Everything the station does fits in this file. The replay above applies it, and a copy starts from it. The values are examples to adapt, not a recommendation.

station:
  id: github
  kind: product
  policies:
    - {policy: branch-only, at: submit}
    - {policy: human-for-merge, at: submit}

global:
  language: en
  timezone: Europe/Paris

apis:
  - id: github-repos
    operations:
      readFile:            {access: read}
      openPullRequest:     {access: write, risk: medium}
      commentOnPullRequest: {access: write, risk: low}
      mergePullRequest:    {access: write, risk: high}
    # not listed, so not available to the agent:
    # pushToMain

profiles:
  contributor:
    allow: [readFile, openPullRequest, commentOnPullRequest, mergePullRequest]

policies:
  branch-only:
    type: rule
    when: "action == openPullRequest and branch == main"
    effect: deny
    reason: "A pull request always starts from a branch, never from main."
  human-for-merge:
    type: rule
    when: "action == mergePullRequest"
    effect: needs-human
    reason: "A merge needs a human's review."

skills:
  - {id: read-file, uses: readFile}
  - {id: open-pull-request, uses: openPullRequest}
  - {id: comment-on-pull-request, uses: commentOnPullRequest}
  - {id: merge-pull-request, uses: mergePullRequest}

playbooks:
  - id: propose-a-change
    tasks: [read-file, open-pull-request, comment-on-pull-request]

Shared copies

Copies that their authors choose to share will appear here. Each one keeps a link to this original station.