> **Building with AI coding agents?** If you're using an AI coding agent, install the official Scalekit plugin. It gives your agent full awareness of the Scalekit API — reducing hallucinations and enabling faster, more accurate code generation.
>
> - **Claude Code**: `/plugin marketplace add scalekit-inc/claude-code-authstack` then `/plugin install <auth-type>@scalekit-auth-stack`
> - **GitHub Copilot CLI**: `copilot plugin marketplace add scalekit-inc/github-copilot-authstack` then `copilot plugin install <auth-type>@scalekit-auth-stack`
> - **Codex**: run the bash installer, restart, then open Plugin Directory and enable `<auth-type>`
> - **Skills CLI** (Windsurf, Cline, 40+ agents): `npx skills add scalekit-inc/skills --list` then `--skill <skill-name>`
>
> `<auth-type>` / `<skill-name>`: `agentkit`, `full-stack-auth`, `mcp-auth`, `modular-sso`, `modular-scim` — [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Github

**Authentication:** OAuth 2.0
**Categories:** Developer Tools
## What you can do

Connect this agent connector to let your agent:

- **Read repositories** — fetch repo metadata, files, commits, branches, and tags
- **Manage issues** — create, update, close, and comment on issues
- **Work with pull requests** — open PRs, post reviews, and merge changes
- **Search code** — search across repositories by keyword, language, or file path
- **Trigger workflows** — dispatch GitHub Actions workflow runs

## Authentication

This connector uses **OAuth 2.0**. Scalekit acts as the OAuth client: it redirects your user to Github, obtains an access token, and automatically refreshes it before it expires. Your agent code never handles tokens directly — you only pass a `connectionName` and a user `identifier`.

You supply your Github **Connected App** credentials (Client ID + Secret) once per environment in the Scalekit dashboard.

Before calling this connector from your code, create the Github connection in **AgentKit** > **Connections** and copy the exact **Connection name** from that connection into your code. The value in code must match the dashboard exactly.

## Set up the connector

Register your Scalekit environment with the GitHub connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

1. ### Set up auth redirects

    - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **GitHub** and click **Create**.

    - Click **Use your own credentials** and copy the redirect URI. It looks like `https:///sso/v1/oauth//callback`.

      > Image: Copy redirect URI from Scalekit dashboard

    - Go to [GitHub Developer Settings](https://github.com/settings/developers) and open your OAuth app.

    - Under **General**, paste the copied URI into the **Authorization callback URL** field and click **Save application**.

      > Image: Add callback URL in GitHub OAuth app settings

2. ### Get client credentials

    In [GitHub Developer Settings](https://github.com/settings/developers), open your OAuth app:

    - **Client ID** — listed on the app's main settings page
    - **Client Secret** — click **Generate a new client secret** if you don't have one

3. ### Add credentials in Scalekit

    - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** and open the connection you created.

    - Enter your credentials:
      - Client ID (from your GitHub OAuth app)
      - Client Secret (from your GitHub OAuth app)

      > Image: Add credentials for GitHub in Scalekit dashboard
    - Click **Save**.

## Code examples

Connect a user's GitHub account and make API calls on their behalf — Scalekit handles OAuth and token management automatically.

## Proxy API Calls

  ### Node.js

```typescript

const connectionName = 'github'; // get your connection name from connection configurations
const identifier = 'user_123';  // your unique user identifier

// Get your credentials from app.scalekit.com → Developers → Settings → API Credentials
const scalekit = new ScalekitClient(
  process.env.SCALEKIT_ENV_URL,
  process.env.SCALEKIT_CLIENT_ID,
  process.env.SCALEKIT_CLIENT_SECRET
);
const actions = scalekit.actions;

// Authenticate the user
const { link } = await actions.getAuthorizationLink({
  connectionName,
  identifier,
});
console.log('🔗 Authorize GitHub:', link);
process.stdout.write('Press Enter after authorizing...');
await new Promise(r => process.stdin.once('data', r));

// Make a request via Scalekit proxy
const result = await actions.request({
  connectionName,
  identifier,
  path: '/user',
  method: 'GET',
});
console.log(result);
```

  ### Python

```python

from dotenv import load_dotenv
load_dotenv()

connection_name = "github"  # get your connection name from connection configurations
identifier = "user_123"     # your unique user identifier

# Get your credentials from app.scalekit.com → Developers → Settings → API Credentials
scalekit_client = scalekit.client.ScalekitClient(
    client_id=os.getenv("SCALEKIT_CLIENT_ID"),
    client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
    env_url=os.getenv("SCALEKIT_ENV_URL"),
)
actions = scalekit_client.actions

# Authenticate the user
link_response = actions.get_authorization_link(
    connection_name=connection_name,
    identifier=identifier
)
# present this link to your user for authorization, or click it yourself for testing
print("🔗 Authorize GitHub:", link_response.link)
input("Press Enter after authorizing...")

# Make a request via Scalekit proxy
result = actions.request(
    connection_name=connection_name,
    identifier=identifier,
    path="/user",
    method="GET"
)
print(result)
```

## Tool list

Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.

## Tool list

### `github_branch_create`

Create a new branch in a GitHub repository. Requires the SHA of the commit to branch from (typically the HEAD of main).

Parameters:

- `branch_name` (`string`, required): Name of the new branch to create
- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `sha` (`string`, required): The SHA of the commit to branch from. Use the HEAD SHA of the base branch (e.g. main).

### `github_branch_get`

Get details of a specific branch in a GitHub repository. Returns the branch name, latest commit SHA, and protection status.

Parameters:

- `branch` (`string`, required): The name of the branch to retrieve
- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository

### `github_branches_list`

List all branches in a GitHub repository. Returns branch names, commit SHAs, and protection status. Supports pagination.

Parameters:

- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `page` (`integer`, optional): Page number of results to return (default 1)
- `per_page` (`integer`, optional): Number of results per page (max 100, default 30)
- `protected` (`boolean`, optional): Filter to only protected branches

### `github_file_contents_get`

Get the contents of a file or directory from a GitHub repository. Returns Base64 encoded content for files.

Parameters:

- `owner` (`string`, required): The account owner of the repository
- `path` (`string`, required): The content path (file or directory path in the repository)
- `repo` (`string`, required): The name of the repository
- `ref` (`string`, optional): The name of the commit/branch/tag

### `github_file_create_update`

Create a new file or update an existing file in a GitHub repository. Content must be Base64 encoded. Requires SHA when updating existing files.

Parameters:

- `content` (`string`, required): The new file content (Base64 encoded)
- `message` (`string`, required): The commit message for this change
- `owner` (`string`, required): The account owner of the repository
- `path` (`string`, required): The file path in the repository
- `repo` (`string`, required): The name of the repository
- `author` (`object`, optional): Author information object with name and email
- `branch` (`string`, optional): The branch name
- `committer` (`object`, optional): Committer information object with name and email
- `sha` (`string`, optional): The blob SHA of the file being replaced (required when updating existing files)

### `github_issue_create`

Create a new issue in a repository. Requires push access to set assignees, milestones, and labels.

Parameters:

- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `title` (`string`, required): The title of the issue
- `assignees` (`array`, optional): GitHub usernames to assign to the issue
- `body` (`string`, optional): The contents of the issue
- `labels` (`array`, optional): Labels to associate with the issue
- `milestone` (`number`, optional): Milestone number to associate with the issue
- `type` (`string`, optional): The name of the issue type

### `github_issues_list`

List issues in a repository. Both issues and pull requests are returned as issues in the GitHub API.

Parameters:

- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `assignee` (`string`, optional): Filter by assigned user
- `creator` (`string`, optional): Filter by issue creator
- `direction` (`string`, optional): Sort order
- `labels` (`string`, optional): Filter by comma-separated list of label names
- `milestone` (`string`, optional): Filter by milestone number or state
- `page` (`number`, optional): Page number of results to fetch
- `per_page` (`number`, optional): Number of results per page (max 100)
- `since` (`string`, optional): Show issues updated after this timestamp (ISO 8601 format)
- `sort` (`string`, optional): Property to sort issues by
- `state` (`string`, optional): Filter by issue state

### `github_public_repos_list`

List public repositories for a specified user. Does not require authentication.

Parameters:

- `username` (`string`, required): The GitHub username to list repositories for
- `direction` (`string`, optional): Sort order
- `page` (`number`, optional): Page number of results to fetch
- `per_page` (`number`, optional): Number of results per page (max 100)
- `sort` (`string`, optional): Property to sort repositories by
- `type` (`string`, optional): Filter repositories by type

### `github_pull_request_create`

Create a new pull request in a repository. Requires write access to the head branch.

Parameters:

- `base` (`string`, required): The name of the branch you want the changes pulled into
- `head` (`string`, required): The name of the branch where your changes are implemented (format: user:branch)
- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `body` (`string`, optional): The contents of the pull request description
- `draft` (`boolean`, optional): Indicates whether the pull request is a draft
- `maintainer_can_modify` (`boolean`, optional): Indicates whether maintainers can modify the pull request
- `title` (`string`, optional): The title of the pull request

### `github_pull_requests_list`

List pull requests in a repository with optional filtering by state, head, and base branches.

Parameters:

- `owner` (`string`, required): The account owner of the repository
- `repo` (`string`, required): The name of the repository
- `base` (`string`, optional): Filter by base branch name
- `direction` (`string`, optional): Sort order
- `head` (`string`, optional): Filter by head branch (format: user:ref-name)
- `page` (`number`, optional): Page number of results to fetch
- `per_page` (`number`, optional): Number of results per page (max 100)
- `sort` (`string`, optional): Property to sort pull requests by
- `state` (`string`, optional): Filter by pull request state

### `github_repo_get`

Get detailed information about a GitHub repository including metadata, settings, and statistics.

Parameters:

- `owner` (`string`, required): The account owner of the repository (case-insensitive)
- `repo` (`string`, required): The name of the repository without the .git extension (case-insensitive)

### `github_user_repos_list`

List repositories for the authenticated user. Requires authentication.

Parameters:

- `direction` (`string`, optional): Sort order
- `page` (`number`, optional): Page number of results to fetch
- `per_page` (`number`, optional): Number of results per page (max 100)
- `sort` (`string`, optional): Property to sort repositories by
- `type` (`string`, optional): Filter repositories by type


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
