GitHub
GitHub API integration with managed OAuth. Access repositories, issues, pull requests, commits, branches, and users. Use this skill when users want to interact with GitHub repositories, manage issues
GitHub API integration with managed OAuth. Access repositories, issues, pull requests, commits, branches, and users. Use this skill when users want to interact with GitHub repositories, manage issues
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the GitHub REST API with managed OAuth authentication. Manage repositories, issues, pull requests, commits, branches, users, and more.
# Get authenticated user python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/github/user') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
https://gateway.maton.ai/github/{native-api-path}
Replace {native-api-path} with the actual GitHub API endpoint path. The gateway proxies requests to api.github.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your GitHub OAuth connections at https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=github&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'github'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Response:
{ "connection": { "connection_id": "83e7c665-60f6-4a64-816c-5e287ea8982f", "status": "ACTIVE", "creation_time": "2026-02-06T03:00:43.860014Z", "last_updated_time": "2026-02-06T03:01:06.027323Z", "url": "https://connect.maton.ai/?session_token=...", "app": "github", "metadata": {} } }
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If you have multiple GitHub connections, specify which one to use with the Maton-Connection header:
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/github/user') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '83e7c665-60f6-4a64-816c-5e287ea8982f') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /github/user
GET /github/users/{username}
GET /github/users?since={user_id}&per_page=30
GET /github/user/repos?per_page=30&sort=updated
Query parameters: type (all, owner, public, private, member), sort (created, updated, pushed, full_name), direction (asc, desc), per_page, page
GET /github/orgs/{org}/repos?per_page=30
GET /github/repos/{owner}/{repo}
POST /github/user/repos Content-Type: application/json { "name": "my-new-repo", "description": "A new repository", "private": true, "auto_init": true }
POST /github/orgs/{org}/repos Content-Type: application/json { "name": "my-new-repo", "description": "A new repository", "private": true }
PATCH /github/repos/{owner}/{repo} Content-Type: application/json { "description": "Updated description", "has_issues": true, "has_wiki": false }
DELETE /github/repos/{owner}/{repo}
GET /github/repos/{owner}/{repo}/contents/{path}
GET /github/repos/{owner}/{repo}/contents/{path}?ref={branch}
PUT /github/repos/{owner}/{repo}/contents/{path} Content-Type: application/json { "message": "Create new file", "content": "SGVsbG8gV29ybGQh", "branch": "main" }
Note: content must be Base64 encoded.
DELETE /github/repos/{owner}/{repo}/contents/{path} Content-Type: application/json { "message": "Delete file", "sha": "{file_sha}", "branch": "main" }
GET /github/repos/{owner}/{repo}/branches?per_page=30
GET /github/repos/{owner}/{repo}/branches/{branch}
POST /github/repos/{owner}/{repo}/branches/{branch}/rename Content-Type: application/json { "new_name": "new-branch-name" }
POST /github/repos/{owner}/{repo}/merges Content-Type: application/json { "base": "main", "head": "feature-branch", "commit_message": "Merge feature branch" }
GET /github/repos/{owner}/{repo}/commits?per_page=30
Query parameters: sha (branch name or commit SHA), path (file path), author, committer, since, until, per_page, page
GET /github/repos/{owner}/{repo}/commits/{ref}
GET /github/repos/{owner}/{repo}/compare/{base}...{head}
GET /github/repos/{owner}/{repo}/issues?state=open&per_page=30
Query parameters: state (open, closed, all), labels, assignee, creator, mentioned, sort, direction, since, per_page, page
GET /github/repos/{owner}/{repo}/issues/{issue_number}
POST /github/repos/{owner}/{repo}/issues Content-Type: application/json { "title": "Found a bug", "body": "Bug description here", "labels": ["bug"], "assignees": ["username"] }
PATCH /github/repos/{owner}/{repo}/issues/{issue_number} Content-Type: application/json { "state": "closed", "state_reason": "completed" }
PUT /github/repos/{owner}/{repo}/issues/{issue_number}/lock Content-Type: application/json { "lock_reason": "resolved" }
DELETE /github/repos/{owner}/{repo}/issues/{issue_number}/lock
GET /github/repos/{owner}/{repo}/issues/{issue_number}/comments?per_page=30
POST /github/repos/{owner}/{repo}/issues/{issue_number}/comments Content-Type: application/json { "body": "This is a comment" }
PATCH /github/repos/{owner}/{repo}/issues/comments/{comment_id} Content-Type: application/json { "body": "Updated comment" }
DELETE /github/repos/{owner}/{repo}/issues/comments/{comment_id}
GET /github/repos/{owner}/{repo}/labels?per_page=30
POST /github/repos/{owner}/{repo}/labels Content-Type: application/json { "name": "priority:high", "color": "ff0000", "description": "High priority issues" }
GET /github/repos/{owner}/{repo}/milestones?state=open&per_page=30
POST /github/repos/{owner}/{repo}/milestones Content-Type: application/json { "title": "v1.0", "state": "open", "description": "First release", "due_on": "2026-03-01T00:00:00Z" }
GET /github/repos/{owner}/{repo}/pulls?state=open&per_page=30
Query parameters: state (open, closed, all), head, base, sort, direction, per_page, page
GET /github/repos/{owner}/{repo}/pulls/{pull_number}
POST /github/repos/{owner}/{repo}/pulls Content-Type: application/json { "title": "New feature", "body": "Description of changes", "head": "feature-branch", "base": "main", "draft": false }
PATCH /github/repos/{owner}/{repo}/pulls/{pull_number} Content-Type: application/json { "title": "Updated title", "state": "closed" }
GET /github/repos/{owner}/{repo}/pulls/{pull_number}/commits?per_page=30
GET /github/repos/{owner}/{repo}/pulls/{pull_number}/files?per_page=30
GET /github/repos/{owner}/{repo}/pulls/{pull_number}/merge
PUT /github/repos/{owner}/{repo}/pulls/{pull_number}/merge Content-Type: application/json { "commit_title": "Merge pull request", "merge_method": "squash" }
Merge methods: merge, squash, rebase
GET /github/repos/{owner}/{repo}/pulls/{pull_number}/reviews?per_page=30
POST /github/repos/{owner}/{repo}/pulls/{pull_number}/reviews Content-Type: application/json { "body": "Looks good!", "event": "APPROVE" }
Events: APPROVE, REQUEST_CHANGES, COMMENT
GET /github/search/repositories?q={query}&per_page=30
Example queries:
GET /github/search/issues?q={query}&per_page=30
Example queries:
GET /github/search/code?q={query}&per_page=30
Example queries:
Note: Code search may timeout on broad queries.
GET /github/search/users?q={query}&per_page=30
GET /github/user/orgs?per_page=30
Note: Requires read:org scope.
GET /github/orgs/{org}
GET /github/orgs/{org}/members?per_page=30
GET /github/rate_limit
Response:
{ "rate": { "limit": 5000, "remaining": 4979, "reset": 1707200000 }, "resources": { "core": { "limit": 5000, "remaining": 4979 }, "search": { "limit": 30, "remaining": 28 } } }
GitHub uses page-based and link-based pagination:
GET /github/repos/{owner}/{repo}/issues?per_page=30&page=2
Response headers include pagination links:
Common pagination parameters:
Some endpoints use cursor-based pagination with since parameter (e.g., listing users).
const response = await fetch( 'https://gateway.maton.ai/github/repos/owner/repo/issues?state=open&per_page=10', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const issues = await response.json();
import os import requests response = requests.get( 'https://gateway.maton.ai/github/repos/owner/repo/issues', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, params={'state': 'open', 'per_page': 10} ) issues = response.json()
| Status | Meaning |
|---|---|
| 400 | Missing GitHub connection |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden - insufficient permissions or scope |
| 404 | Resource not found |
| 408 | Request timeout (common for complex searches) |
| 422 | Validation failed |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from GitHub API |
echo $MATON_API_KEY
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
Ensure your URL path starts with github. For example:
Correct: https://gateway.maton.ai/github/user
Incorrect: https://gateway.maton.ai/api.github.com/user
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions4,600+ AI skills, agents & workflows. Install in 60 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.