Two agents, one limit, one refused.

Code integration

GitHub, in your agent's hands and under your limits.

Let an agent triage issues, review pull requests and read code without a token in its prompt. You create a token limited to the repositories it should touch, and Anlyon holds it. Closing an issue, approving a review or merging can wait for a person.

Connect

API key

bound to api.github.com

What you create

  • A fine-grained personal access token
  • Limited to the repositories you pick
  • Issues and Pull requests: Read and write; Contents: Read (Read and write to merge)
  1. 01In GitHub, open Settings, Developer settings, Personal access tokens, Fine-grained tokens, and generate a token.
  2. 02Limit it to the repositories your agent should work in, and give it Issues: Read and write.
  3. 03In Anlyon, open Actions, then Integrations, choose GitHub and paste the token.
  4. 04Anlyon checks the token with GitHub before storing it. It becomes a secret named GITHUB, bound to api.github.com.

Connecting allows nothing by itself. No API returns the credential afterwards, to you, to the console or to an agent, and Anlyon refuses to send it anywhere but api.github.com.

Operations

Each one is a named tool, off until you switch it on, and Anlyon makes every call with the credential your agent never sees. Reads return what GitHub answers and change nothing. Writes count against a limit you set, can wait for a person, and are read back from GitHub wherever it allows.

Reads

Search issues

github-search-issues

Search issues and pull requests in the repositories the token can reach, with GitHub search syntax such as `repo:acme/widgets is:issue is:open label:bug`. Returns `total_count` and up to 5 `items` per page, bodies included; pass `page` for the next page (GitHub returns at most the first 1,000 results). Include `is:issue` or `is:pr`, and `repo:owner/name` to stay in one repository; GitHub allows 30 searches a minute.

List issues

github-list-issues

List issues in one repository, newest first by default, 5 per page with bodies; pass `page` for the next page. GitHub includes pull requests in this list (they carry a `pull_request` key). Filters: state (open by default), labels (comma-separated names, all must match), assignee, creator, milestone number, and since (updated after).

Get issue

github-get-issue

Get one issue by number: title, body, state and state reason, labels, assignees, milestone and comment count. A pull request number also works here and returns the pull request as an issue (with a `pull_request` key).

List issue comments

github-list-issue-comments

List the comments on one issue or pull request conversation, oldest first, 10 per page; pass `page` for the next page. `since` returns only comments updated after that time. Comments on a pull request's diff are in list-review-comments.

List labels

github-list-labels

List the labels defined in a repository (name, color, description), 100 per page; pass `page` for the next page.

List pull requests

github-list-pull-requests

List pull requests in one repository, newest first by default, 3 per page because each one carries full head and base repository objects; pass `page` for the next page. Filters: state (open by default), base branch, and head as `owner:branch`. For a compact list of many pull requests use search-issues with `is:pr`.

Get pull request

github-get-pull-request

Get one pull request by number: title, body, state, draft, head and base branches with their SHAs, `merged`, `mergeable` (null while GitHub is still computing it; ask again shortly), requested reviewers, and commit, addition, deletion and changed-file counts.

List pull request files

github-list-pull-request-files

List the files a pull request changes, 10 per page, each with its status, addition and deletion counts and its patch; pass `page` for the next page. GitHub returns at most 3,000 files, and a page with very large patches can reach the 64 KB response cut.

List reviews

github-list-reviews

List the reviews on a pull request in the order they were submitted, 10 per page, each with its reviewer, state (APPROVED, CHANGES_REQUESTED, COMMENTED, DISMISSED or PENDING), body and commit; pass `page` for the next page.

List review comments

github-list-review-comments

List the comments left on a pull request's diff, 10 per page, each with its file path, line, diff hunk, body and the review it belongs to; pass `page` for the next page. `since` returns only comments updated after that time.

Get repository

github-get-repository

Get one repository: full name, description, visibility, default branch, topics, whether issues are enabled, and open issue count.

List branches

github-list-branches

List a repository's branches, each with its head commit SHA and whether it is protected, 50 per page; pass `page` for the next page. Set `protected` to true for protected branches only.

Get file contents

github-get-file-contents

Get one file or directory from a repository, at a branch, tag or commit (`ref`; the default branch when left out). A file comes back with its `content` in base64 and its blob `sha`; a directory comes back as a list of entries (up to 1,000). A file over about 45 KB is cut by the 64 KB response limit once encoded, and GitHub returns no content over 1 MB in this form.

List commits

github-list-commits

List commits newest first from a branch or SHA (the default branch when left out), 8 per page; pass `page` for the next page. Filter by a file path, an author login or email, and a time window (since, until).

Search code

github-search-code

Search code on the default branches of the repositories the token can reach, for example `retryCharge repo:acme/widgets path:src`. The query needs at least one search term, not only qualifiers. Returns `total_count` and up to 8 matches per page (file name, path, blob sha, repository); pass `page` for the next page. GitHub allows 10 code searches a minute and searches only files under 384 KB.

Writes

Create issue

github-create-issue

Open one issue in a repository.

ownerrepotitlebody

Read back

Read back by issue number; the title must match.

Comment on issue

github-comment-on-issue

Add one comment to an issue or a pull request conversation.

ownerrepoissue_numberbody

Read back

Read back by comment id; the text must match.

Close issue

github-close-issue

Close one issue.

ownerrepoissue_number

Read back

Read back from the issue; its state must be closed.

Reopen issue

github-reopen-issue

Reopen one closed issue.

ownerrepoissue_number

Read back

Read back from the issue; its state must be open.

Update issue

github-update-issue

Change one issue: any of title, body, state (with a state reason), milestone number, and the full lists of labels and assignees, which replace the current ones (an empty list clears them). Fields left out are not changed.

ownerrepoissue_numbertitlebodystatestate_reasonmilestonelabelsassignees

Read back

Read back from the issue; its number, title, state and body must equal what GitHub returned for this update. Limitations: labels, assignees and milestone need push access and GitHub silently drops them otherwise, so check the returned issue; a milestone cannot be removed with this action; GitHub accepts at most 10 assignees.

Add labels

github-add-labels

Add one or more labels to an issue or pull request, keeping the labels it already has; a name that does not exist yet is created in the repository. Returns every label now on the issue.

ownerrepoissue_numberlabels

Read back

Read back from the issue; the first label named must be among its labels.

Remove label

github-remove-label

Remove one label from an issue or pull request. Returns the labels left on it; GitHub answers 404 when the issue does not have that label.

ownerrepoissue_numbername

Read back

Read back from the issue; the label must no longer be among its labels.

Add assignees

github-add-assignees

Add up to 10 people as assignees of an issue or pull request, keeping the current ones. Returns the issue. GitHub silently ignores a login that cannot be assigned, so check `assignees` in the response.

ownerrepoissue_numberassignees

Read back

Read back from the issue; the first login named must be among its assignees.

Update comment

github-update-comment

Replace the text of one comment on an issue or pull request conversation.

ownerrepocomment_idbody

Read back

Read back by comment id; the text must match.

Delete comment

github-delete-comment

Delete one comment from an issue or pull request conversation. It cannot be restored.

ownerrepocomment_id

Read back

Read back by comment id; GitHub must answer 404.

Create label

github-create-label

Create one label in a repository, with a color given as six hex digits without #. GitHub refuses a name that already exists (422).

ownerreponamecolordescription

Read back

Read back by name; the id must match the new label.

Delete label

github-delete-label

Delete one label from a repository, which also removes it from every issue and pull request that has it. It cannot be restored.

ownerreponame

Read back

Read back by name; GitHub must answer 404.

Comment on pull request

github-comment-on-pull-request

Add one comment to a pull request's conversation (not to a line of its diff; use create-review for that).

ownerrepopull_numberbody

Read back

Read back by comment id; the text must match.

Create review

github-create-review

Submit one review on a pull request: APPROVE, REQUEST_CHANGES or COMMENT, with an optional list of comments on lines of the diff. A body is required to request changes or comment. GitHub refuses a review of your own pull request with APPROVE or REQUEST_CHANGES.

ownerrepopull_numbereventbodycommit_idcomments

Read back

Read back by review id; its id, state and commit must equal what GitHub returned.

Request reviewers

github-request-reviewers

Ask people (logins) or teams (slugs, organization repositories only) to review a pull request; give at least one. Returns the pull request with its requested reviewers. GitHub refuses a person who is not a collaborator, and the pull request's author.

ownerrepopull_numberreviewersteam_reviewers

Acknowledged

Sent once and acknowledged; not read back: reviewers and team_reviewers are both optional, and a read-back can only compare an input every call gives; GitHub also drops a person from the requested reviewers once they review.

Merge pull request

github-merge-pull-request

Merge one pull request with a merge commit, a squash or a rebase. `sha` must be the head commit you reviewed (head.sha from get-pull-request); GitHub refuses the merge (409) if the branch has moved since.

ownerrepopull_numbershamerge_methodcommit_titlecommit_message

Read back

Read back from the pull request; `merged` must be true and its merge commit must be the one GitHub returned. Needs the Contents: Read and write token permission. Branch protection and required checks still apply (405 when not mergeable).

Create pull request

github-create-pull-request

Open one pull request from a head branch (`branch`, or `owner:branch` for a fork) into a base branch, optionally as a draft.

ownerrepotitleheadbasebodydraftmaintainer_can_modify

Read back

Read back by number; the title and base branch must match. GitHub refuses a second open pull request for the same head and base (422), so a retry after an unknown outcome cannot open a duplicate. The head branch must already exist with at least one commit the base does not have.

The brake

Suggested limits

  • 50 issues opened a day
  • 200 comments a day
  • 50 issues closed a day
  • 50 issues reopened a day
  • 100 issues updated a day
  • 200 label additions a day
  • 200 label removals a day
  • 100 assignee additions a day
  • 100 comments edited a day
  • 50 comments deleted a day
  • 20 labels created a day
  • 10 labels deleted a day
  • 200 pull request comments a day
  • 50 reviews a day
  • 50 review requests a day
  • 20 pull requests merged a day
  • 20 pull requests opened a day

Shared by every agent, session and key in the environment. You set the number.

Suggested approvals

  • A person approves closing an issue
  • A person approves closing an issue by update
  • A person approves deleting a comment
  • A person approves deleting a label
  • A person approves approving a pull request
  • A person approves merging a pull request

Installed turned off. The reviewer sees the exact request, and the approved request is the one that runs.

Before you rely on it

  • The token decides which repositories can be reached. A policy on the owner and repo inputs narrows it further.
  • A fine-grained token expires. Paste a new one when it does.

Use it

1. Connect, from a terminal
npm install -g @anlyonhq/cli
anlyon auth login

# Shows where to create the key, then asks for it without echoing
anlyon connections add github --secret GITHUB

# From a clone of github.com/AnlyonHQ/anlyon-platform:
# see what would be installed, then switch on one operation
anlyon packs plan ./packs/github
anlyon packs install ./packs/github --action create-issue --yes
2. Call it from your agent, TypeScript
import { Client } from "@anlyonhq/sdk";

const anlyon = new Client({ apiKey: process.env.ANLYON_AGENT_KEY! });

const { data } = await anlyon.actions.invoke(
  "github-create-issue",
  {
    "owner": "acme",
    "repo": "widgets",
    "title": "Checkout fails for saved cards",
    "body": "Reported by three customers this morning."
  },
);

if (data?.pendingApproval) {
  console.log("Waiting for a person", data.approvalId);
} else {
  console.log(data?.status, data?.responseStatus);
}
Or hand it to Claude Code over MCP
# Claude Code. Sign in with the browser, no key to paste.
claude mcp add --transport http anlyon https://api.anlyon.com/mcp

# Then ask in plain words. Each operation you switched on is a tool.

Prefer to click?

The console does all of it: connect, switch operations on, set the limit, and copy the setup for your agent.

Free tier, no credit card. One command if you use Claude or Cursor.

$ claude mcp add anlyon -- npx -y @anlyonhq/mcp-server