Skip to content

GitHub

github wraps the GitHub REST API v3. One instance = one GitHub account or organisation (Personal Access Token, optional Enterprise base URL).

Operations cover the full PR-review and release loop — reading repos / issues / PRs, diffing and merging PRs, creating PRs, editing files, cutting releases, plus forks, stars, tags, formal/inline reviews, branches, labels, assignees, search, collaborators, repo management, Actions, and webhooks. Anything wick does NOT cover yet is one httprest call away.

Sourceplugins/connector/github/
Keygithub
Icon🐙
Tierplugin — install with <app> plugin install github
Health check✅ — verifies the token via GET /user

This connector is no longer compiled into the wick binary. Install it as a plugin:

bash
<app> plugin install github

Existing credential rows are preserved on upgrade — the connector reappears automatically once the plugin is installed and enabled. See Connector Plugins for the full install flow.

Configs

FieldTypeRequiredNotes
BaseURLURLLeave empty for github.com. Set to https://github.example.com/api/v3 for GitHub Enterprise.
TokensecretPersonal Access Token. Needs repo for private repos, public_repo for public-only listings. Fine-grained tokens also work — see scopes.

Health check

The connector reports a single auth check that calls GET /user. A green check means the configured Token is valid and reachable (right base URL, not expired/revoked). It does not assert per-repo permissions — a token can pass the check but still lack repo scope for a specific private repo.

Operations

owner and repo are required on every repo-scoped op unless noted. per_page caps a single page (max 100) — list ops return the first page only; paginate in your workflow. Destructive ops are opt-in per row at /manager/connectors/github/{id}.

Repositories — read

OpInputWhat it does
list_reposaffiliation, visibility, per_pageRepos visible to the token. Defaults affiliation=owner.
get_repoowner, repoFull repo metadata (default branch, visibility, counts, URLs).
list_branchesowner, repo, per_pageBranches with their head commit.
list_commitsowner, repo, sha, path, author, per_pageCommit history. Optional filters: start sha, path, author.
list_forksowner, repo, per_pageWho forked the repo.
list_stargazersowner, repo, per_pageWho starred the repo.
list_collaboratorsowner, repo, per_pageCollaborators (needs push access to see all).
get_commitowner, repo, shaOne commit with message, author, and changed files.
compare_commitsowner, repo, base, headDiff base...head — status, ahead/behind counts, commits, files.

Repositories — write (destructive)

OpInputWhat it does
create_forkowner, repo, organization, nameFork into the token's account (or organization).
star_repoowner, repoStar the repo as the authenticated user.
unstar_repoowner, repoRemove the star.
create_reponame, description, private, auto_init, orgCreate a repo for the user, or under org. Not repo-scoped.
update_repoowner, repo, name, description, private, default_branch, archivedEdit repo settings. Only provided fields change; private/archived sent only when set.
create_branchowner, repo, branch, from_branch, shaNew branch off from_branch's head (or sha). from_branch defaults to the repo default.
delete_refowner, repo, branchDelete refs/heads/{branch}.

Issues — read

OpInputWhat it does
list_issuesowner, repo, state, per_pageList issues. GitHub returns issues and PRs (PR rows have pull_request != null); filter client-side.
get_issueowner, repo, numberOne issue.
list_issue_commentsowner, repo, number, per_pageComments on an issue or PR.

Issues — write (destructive)

OpInputWhat it does
create_issueowner, repo, title, body, labelsCreate an issue. labels is comma-separated.
update_issueowner, repo, number, title, body, state, labelsEdit / close / reopen. Only provided fields change; labels replaces the set.
add_commentowner, repo, number, bodyComment on an issue or PR (PRs are issues for comments).
update_commentowner, repo, comment_id, bodyEdit a comment by its numeric ID (from list_issue_comments).
delete_commentowner, repo, comment_idDelete a comment by ID.
add_labelsowner, repo, number, labelsAdd labels (additive — unlike update_issue). labels comma-separated.
remove_labelowner, repo, number, nameRemove one label by name.
add_assigneesowner, repo, number, assigneesAssign users (comma-separated logins).

Pull requests — read

OpInputWhat it does
list_prsowner, repo, state, per_pageList pull requests.
get_prowner, repo, numberOne PR with branches, mergeable state, counts.
get_pr_diffowner, repo, number, max_bytesRaw unified diff. max_bytes > 0 truncates (returns truncated: true) — keep prompts small.
list_pr_filesowner, repo, number, per_pageChanged files with additions / deletions / status.

Pull requests — write (destructive)

OpInputWhat it does
create_prowner, repo, title, head, base, body, draftOpen a PR. head may be owner:branch for cross-fork.
update_prowner, repo, number, title, body, state, baseEdit / close / retarget. Only provided fields change.
merge_prowner, repo, number, merge_method, commit_title, commit_messageMerge. merge_method = merge (default) / squash / rebase.

Pull request reviews

OpDestructiveInputWhat it does
list_reviewsnoowner, repo, number, per_pageFormal reviews on a PR (state = APPROVED / CHANGES_REQUESTED / COMMENTED).
list_review_commentsnoowner, repo, number, per_pageInline diff comments (distinct from list_issue_comments).
create_reviewyesowner, repo, number, event, body, commit_idSubmit a review. event = APPROVE / REQUEST_CHANGES / COMMENT (default COMMENT).
create_review_commentyesowner, repo, number, body, commit_id, path, line, sideInline comment on a diff line. side = LEFT / RIGHT (default RIGHT).
request_reviewersyesowner, repo, number, reviewers, team_reviewersRequest user logins and/or team slugs (comma-separated).

Not repo-scoped — q uses GitHub search syntax. First page only.

OpInputWhat it does
search_issuesq, per_pageSearch issues and PRs (is:issue / is:pr to filter).
search_reposq, per_pageSearch repositories.
search_codeq, per_pageSearch code (needs a scoping qualifier like repo: / org:).

Actions

OpDestructiveInputWhat it does
list_workflowsnoowner, repo, per_pageWorkflows defined in the repo.
list_workflow_runsnoowner, repo, per_pageRecent workflow runs (status / conclusion).
dispatch_workflowyesowner, repo, workflow_id, ref, inputsTrigger a workflow_dispatch. workflow_id = numeric ID or filename (ci.yml); inputs is an optional JSON object.

Webhooks

OpDestructiveInputWhat it does
list_hooksnoowner, repo, per_pageRepo webhooks (needs admin access).
create_hookyesowner, repo, url, events, secret, content_typeCreate a web hook. events defaults to push; content_type = json (default) / form.

Files

OpDestructiveInputWhat it does
get_filenoowner, repo, path, refRead a text file. Base64 unwrapped automatically; binary unsupported.
create_or_update_fileyesowner, repo, path, content, message, branch, shaCreate or update a file. content is plaintext (base64-encoded for you). On update, omit sha and the connector looks it up.

Releases

OpDestructiveInputWhat it does
list_releasesnoowner, repo, per_pageList releases.
get_latest_releasenoowner, repoThe latest published (non-draft, non-prerelease) release.
get_releasenoowner, repo, release_idOne release by numeric ID.
create_releaseyesowner, repo, tag_name, name, body, target_commitish, draft, prereleaseCut a release. Creates the tag if it doesn't exist.
update_releaseyesowner, repo, release_id, tag_name, name, body, draft, prereleaseEdit a release.
delete_releaseyesowner, repo, release_idDelete a release (does not delete the git tag).

Tags & user

OpInputWhat it does
list_tagsowner, repo, per_pageList git tags with their commit SHA.
get_meThe authenticated user behind the token.

Every write op is connector.OpDestructive. The MCP layer appends a destructive warning to these ops' descriptions so the LLM confirms before calling; admins can disable individual ops per (row, op) at /manager/connectors/github/{id}.

Example: automated PR review

A workflow fetches the diff with the connector (kept off the agent prompt when large via max_bytes), lets an agent decide whether it's worth reviewing, and posts the comment back:

yaml
- id: diff
  type: connector
  module: github
  op: get_pr_diff
  args:
    owner: "{{.Event.Payload.body.repository.owner.login}}"
    repo: "{{.Event.Payload.body.repository.name}}"
    number: "{{.Event.Payload.body.pull_request.number}}"
    max_bytes: 40000
  arg_modes: { owner: expression, repo: expression, number: expression }

- id: review
  type: agent
  provider: claude
  skills: [pr-review]
  prompt: "Review this PR and, if it needs it, post a comment via github.add_comment.\n\n{{.Node.diff.diff}}"

See Workflows ▶ Anatomy for the surrounding shape.

Example: file a bug from a Slack thread

yaml
- id: file_bug
  type: connector
  module: github
  op: create_issue
  arg_modes:
    title: expression
    body: expression
  args:
    owner: abc
    repo: web
    title: "{{.Node.classify.parsed.summary}}"
    body: |
      Reported in Slack by <@{{.Node.trigger.payload.user}}>:

      {{.Node.trigger.payload.text}}
    labels: bug,from-slack

Scopes / permissions

  • Classic PAT: repo for private repos (covers read, comment, merge, edit files, releases); public_repo for public-only.
  • Fine-grained PAT: Repository permissions — Contents read/write (read diffs/files, merge, edit files, tags), Pull requests read/write (PR details, comments, create/merge), Issues read/write (issues + comments), and the auto-included Metadata read. Add Administration/Workflows only if you script those.
  • Merging respects branch protection — the token's account must satisfy required reviews/checks.

Quirks worth knowing

  • List ops return the first page only. Loop with per_page + a page param via httprest for deeper history.
  • get_pr_diff requests the application/vnd.github.v3.diff media type and returns raw text under diff; use max_bytes to cap what you feed an LLM.
  • create_or_update_file: leave sha empty to update — the connector resolves the current blob SHA first; pass branch to target a non-default branch.
  • update_issue / update_pr / update_release only send the fields you provide — empty fields are left untouched.
  • get_latest_release skips drafts and pre-releases; use list_releases to see those.
  • delete_release removes the release entry but leaves the underlying git tag in place.
  • Don't prefix labels with #; GitHub stores them without it, and unknown labels are silently ignored.
  • add_labels / add_assignees are additive; update_issue's labels field replaces the whole set.
  • create_review / create_review_comment post into the PR's review timeline (inline on a diff line); add_comment posts to the conversation timeline.
  • create_branch resolves the head SHA for you (default branch when from_branch is empty), then creates refs/heads/{branch}; pass sha to skip the lookup.
  • dispatch_workflow needs the workflow to declare on: workflow_dispatch; it returns {"ok": true} (204) and inputs must be a JSON object — invalid JSON is dropped.

See also

  • Connector Module — module contract.
  • HTTP / REST — fallback for any GitHub endpoint not typed here.
  • Slack — the natural inbound side of a "file bug from Slack" workflow.
Built with ❤️ by a developer, for developers.