@mcp-s/connectors 0.0.20260928085734
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +22 -0
- package/dist/public/_headers +3 -0
- package/dist/public/connectors/atlassian-mcp.json +1 -0
- package/dist/public/connectors/datadog-mcp.json +1 -0
- package/dist/public/connectors/github.json +1 -0
- package/dist/public/connectors/gmail.json +1 -0
- package/dist/public/index.json +77 -0
- package/dist/schema/auth.d.ts +406 -0
- package/dist/schema/auth.js +114 -0
- package/dist/schema/catalog.d.ts +1260 -0
- package/dist/schema/catalog.js +182 -0
- package/dist/schema/common.d.ts +31 -0
- package/dist/schema/common.js +23 -0
- package/dist/schema/enums.d.ts +42 -0
- package/dist/schema/enums.js +44 -0
- package/dist/schema/parts.d.ts +123 -0
- package/dist/schema/parts.js +85 -0
- package/dist/schema/tool.d.ts +107 -0
- package/dist/schema/tool.js +60 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# connectors
|
|
2
|
+
|
|
3
|
+
Willow's unified connector catalog. Every connector — built-in API connectors
|
|
4
|
+
and remote MCP servers alike — is described by one schema and published two
|
|
5
|
+
ways:
|
|
6
|
+
|
|
7
|
+
- **npm**: [`@mcp-s/connectors`](https://www.npmjs.com/package/@mcp-s/connectors)
|
|
8
|
+
(public), bundled into db-service as the offline fallback.
|
|
9
|
+
- **CDN**: `https://connectors.withwillow.ai`, which db-service polls every 60s,
|
|
10
|
+
so a merged change is live without a deploy.
|
|
11
|
+
|
|
12
|
+
The repo is private; everything it publishes is public, so connectors must
|
|
13
|
+
never contain secrets.
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/schema/ # zod 4 schema; all types are inferred from it
|
|
19
|
+
src/connectors/ # one folder per connector: <slug>.connector.ts (+ .tools.ts, .schemas.ts)
|
|
20
|
+
src/connectors/index.ts # the list of published connectors
|
|
21
|
+
scripts/build.ts # validates every connector and writes dist/public
|
|
22
|
+
test/ # schema validation + 1:1 parity with db-service's built-ins
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Published files
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
https://connectors.withwillow.ai/index.json # every connector, light rows + content hash
|
|
29
|
+
https://connectors.withwillow.ai/connectors/{slug}.json # one full definition
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The same files ship in the npm package under `dist/public`, readable with
|
|
33
|
+
`readBundledIndex()` / `readBundledConnector(slug)`. `notes` are stripped from
|
|
34
|
+
everything published.
|
|
35
|
+
|
|
36
|
+
## Adding or changing a connector
|
|
37
|
+
|
|
38
|
+
1. Add `src/connectors/<slug>/<slug>.connector.ts` exporting a `CatalogConnector`
|
|
39
|
+
(and `.tools.ts` / `.schemas.ts` if it has them).
|
|
40
|
+
2. Register it in `src/connectors/index.ts`.
|
|
41
|
+
3. `npm test && npm run build`.
|
|
42
|
+
4. Open a PR. Once merged, it reaches every org on the `unified-connectors` beta
|
|
43
|
+
within about a minute.
|
|
44
|
+
|
|
45
|
+
Rules the build enforces:
|
|
46
|
+
|
|
47
|
+
- **No secrets.** Instant OAuth (`webrix-oauth`) declares scopes only; client
|
|
48
|
+
ids and secrets live in each deployment's `instant_connectors` table.
|
|
49
|
+
- **Unique `slug` and `id`.** `slug` is load-bearing: integrations resolve
|
|
50
|
+
through it, so never rename one that is in use.
|
|
51
|
+
- **`min_schema`** (optional): set it when a connector uses a field older
|
|
52
|
+
db-service versions don't understand. Consumers skip connectors above the
|
|
53
|
+
`CATALOG_SCHEMA_VERSION` they support and keep their bundled copy.
|
|
54
|
+
|
|
55
|
+
## Release flow
|
|
56
|
+
|
|
57
|
+
On every push to `main`:
|
|
58
|
+
|
|
59
|
+
- **GitHub Actions** (`publish.yml`) tests, builds and publishes
|
|
60
|
+
`@mcp-s/connectors@0.0.<timestamp>` to npm. db-service depends on `"*"`.
|
|
61
|
+
- **Cloudflare Workers Builds** runs `npm ci && npm run build` and
|
|
62
|
+
`npx wrangler deploy`, serving `dist/public` on `connectors.withwillow.ai`.
|
|
63
|
+
|
|
64
|
+
Pull requests run `ci.yml`: typecheck, tests, build.
|
|
65
|
+
|
|
66
|
+
## Parity fixtures
|
|
67
|
+
|
|
68
|
+
`github` and `gmail` are 1:1 ports of db-service's built-ins. The fixtures in
|
|
69
|
+
`test/fixtures` were snapshotted from db-service; to regenerate them:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cd ../db-service && npx tsx ../connectors/scripts/generate-parity-fixtures.ts
|
|
73
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CatalogConnector, type CatalogIndex } from "./schema/catalog.js";
|
|
2
|
+
export * from "./schema/common.js";
|
|
3
|
+
export * from "./schema/enums.js";
|
|
4
|
+
export * from "./schema/auth.js";
|
|
5
|
+
export * from "./schema/tool.js";
|
|
6
|
+
export * from "./schema/parts.js";
|
|
7
|
+
export * from "./schema/catalog.js";
|
|
8
|
+
/**
|
|
9
|
+
* The catalog index shipped inside this package — the offline floor a
|
|
10
|
+
* consumer serves until (or unless) it reaches the CDN.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readBundledIndex(): CatalogIndex;
|
|
13
|
+
/** A full connector definition shipped inside this package. */
|
|
14
|
+
export declare function readBundledConnector(slug: string): CatalogConnector;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { catalogConnector, catalogIndex, } from "./schema/catalog.js";
|
|
3
|
+
export * from "./schema/common.js";
|
|
4
|
+
export * from "./schema/enums.js";
|
|
5
|
+
export * from "./schema/auth.js";
|
|
6
|
+
export * from "./schema/tool.js";
|
|
7
|
+
export * from "./schema/parts.js";
|
|
8
|
+
export * from "./schema/catalog.js";
|
|
9
|
+
const publicDir = new URL("./public/", import.meta.url);
|
|
10
|
+
/**
|
|
11
|
+
* The catalog index shipped inside this package — the offline floor a
|
|
12
|
+
* consumer serves until (or unless) it reaches the CDN.
|
|
13
|
+
*/
|
|
14
|
+
export function readBundledIndex() {
|
|
15
|
+
const raw = readFileSync(new URL("index.json", publicDir), "utf8");
|
|
16
|
+
return catalogIndex.parse(JSON.parse(raw));
|
|
17
|
+
}
|
|
18
|
+
/** A full connector definition shipped inside this package. */
|
|
19
|
+
export function readBundledConnector(slug) {
|
|
20
|
+
const raw = readFileSync(new URL(`connectors/${encodeURIComponent(slug)}.json`, publicDir), "utf8");
|
|
21
|
+
return catalogConnector.parse(JSON.parse(raw));
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"atlassian","slug":"atlassian-mcp","kind":"mcp","status":"draft","applications":["jira","confluence"],"supersedes":{"connectors":["jira","confluence"],"registry":["atlassian"]},"definition":{"display":{"name":"Atlassian MCP","description":"Read and write Jira issues and Confluence pages through Atlassian's own MCP server.","icon":"atlassian","website":"https://www.atlassian.com","category":"project-management-issue-tracking","docs_url":"https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-mcp-server/"},"mcp":{"url":"https://mcp.atlassian.com/v1/sse","transport":"auto"},"auth":{"methods":{"proxy-oauth":{}},"default":"proxy-oauth"},"verification":{"type":"mcp"},"template":{"locked_fields":["mcp_proxy"],"setup":[{"title":"Connect your Atlassian site","markdown":"Authorize Willow against your Atlassian Cloud site. Atlassian registers the gateway automatically, so there is no OAuth app to create — you only need to approve the scopes and pick the site to grant access to.","field":"auth_settings"}]}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"datadog-mcp","slug":"datadog-mcp","kind":"mcp","status":"beta","applications":["datadog"],"supersedes":{"registry":["datadog"]},"definition":{"display":{"name":"Datadog MCP","description":"Query Datadog logs, metrics, traces, monitors, incidents and dashboards through Datadog's official MCP server.","icon":"datadog","website":"https://www.datadoghq.com","category":"observability-monitoring","docs_url":"https://docs.datadoghq.com/mcp_server/setup/","official":true},"mcp":{"url":"https://mcp.datadoghq.com/v1/mcp?toolsets=all","transport":"auto","url_options_label":"Datadog Site","url_options":[{"label":"US1","url":"https://mcp.datadoghq.com/v1/mcp?toolsets=all","description":"datadoghq.com"},{"label":"US3","url":"https://mcp.us3.datadoghq.com/v1/mcp?toolsets=all","description":"us3.datadoghq.com"},{"label":"US5","url":"https://mcp.us5.datadoghq.com/v1/mcp?toolsets=all","description":"us5.datadoghq.com"},{"label":"EU","url":"https://mcp.datadoghq.eu/v1/mcp?toolsets=all","description":"datadoghq.eu"},{"label":"AP1","url":"https://mcp.ap1.datadoghq.com/v1/mcp?toolsets=all","description":"ap1.datadoghq.com"},{"label":"AP2","url":"https://mcp.ap2.datadoghq.com/v1/mcp?toolsets=all","description":"ap2.datadoghq.com"}]},"auth":{"methods":{"proxy-oauth":{},"proxy-api-key":{}},"default":"proxy-oauth"},"verification":{"type":"mcp"},"template":{"locked_fields":["mcp_proxy"],"setup":[{"title":"Pick your Datadog site","markdown":"Choose the site your Datadog organization lives on. It is the domain you sign in to, e.g. `datadoghq.eu` for EU.","field":"mcp_proxy"},{"title":"Authenticate","markdown":"**OAuth** (recommended): each user signs in to Datadog; there is no app to register.\n\n**API key**: send a Datadog personal or service access token as `Authorization: Bearer <token>`, or send `DD_API_KEY` and `DD_APPLICATION_KEY` headers.","field":"auth_settings"}]}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"id":"github","slug":"github","kind":"api","status":"active","applications":["github"],"definition":{"display":{"name":"GitHub","description":"GitHub is a web-based Git repository hosting service.","icon":"github.svg","website":"https://github.com","category":"code-version-control","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/github"},"api":{"base_url":"https://api.github.com"},"auth":{"methods":{"apiKey":{"authorizationMapping":"\"Bearer \"&token","docs":{"link":"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens","steps":[{"markdown":"Go to [github.com/settings/tokens](https://github.com/settings/tokens) and click **Generate new token** → **Generate new token (classic)** or **Fine-grained token**."},{"markdown":"Give your token a name, select the scopes (permissions) you need, and click **Generate token**. Copy the token — it won't be shown again."},{"markdown":"Paste your token here:","component":"credentials"}]}},"api-key-per-user":{"authorizationMapping":"\"Bearer \"&token","docs":{"link":"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens","steps":[{"markdown":"Go to [github.com/settings/tokens](https://github.com/settings/tokens) and click **Generate new token** → **Generate new token (classic)** or **Fine-grained token**."},{"markdown":"Give your token a name, select the scopes (permissions) you need, and click **Generate token**. Copy the token — it won't be shown again."},{"markdown":"Paste your token here:","component":"credentials"}]}},"oauth":{"authUrl":"https://github.com/login/oauth/authorize","tokenUrl":"https://github.com/login/oauth/access_token","scopes":["repo","repo:status","repo_deployment","public_repo","repo:invite","security_events","admin:repo_hook","write:repo_hook","read:repo_hook","admin:org","write:org","read:org","admin:public_key","write:public_key","read:public_key","admin:org_hook","gist","notifications","user","read:user","user:email","user:follow","project","read:project","delete_repo","write:packages","read:packages","delete:packages","admin:gpg_key","write:gpg_key","read:gpg_key","codespace","workflow","read:audit_log"],"defaultScopes":["repo","gist"],"codeExchangeConfig":{"modelCredentialsMapping":"{\n \"access_token\": access_token, \n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"refresh_token_expires_at\": $fromMillis($millis() + refresh_token_expires_in * 1000),\n \"scope\": scope,\n \"token_type\": token_type\n }","externalIdMapping":"exchangeCodeData.user.id","isForm":false},"docs":{"link":"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app","steps":[{"markdown":"Go to [github.com/settings/developers](https://github.com/settings/developers) and click **New OAuth App**."},{"markdown":"Fill in the **Application name** and **Homepage URL**, then paste this URL as the **Authorization callback URL**:","component":"redirectUrl"},{"markdown":"Click **Register application**, then copy the **Client ID**. Click **Generate a new client secret**, copy the secret (shown only once), and paste both here:","component":"credentials"}]}},"webrix-oauth":{"scopes":["repo","public_repo"],"defaultScopes":["repo"]},"server-app":{"algorithm":"RS256","mode":"exchange","keyMaterial":"privateKey","ttlSeconds":300,"tokenUrlPath":"https://api.github.com/app/installations/{installationId}/access_tokens","supportScopes":false,"supportInstallationId":true,"tokenHeadersMapping":"{\n \"Authorization\": \"Bearer \"&jwt\n }"},"server-app-per-user":{"algorithm":"RS256","mode":"exchange","keyMaterial":"privateKey","ttlSeconds":300,"tokenUrlPath":"https://api.github.com/app/installations/{installationId}/access_tokens","supportScopes":false,"supportInstallationId":true,"tokenHeadersMapping":"{\n \"Authorization\": \"Bearer \"&jwt\n }","docs":{"description":"GitHub App, one per user","link":"https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app-installation","steps":[{"markdown":"Each user creates their own GitHub App at [github.com/settings/apps](https://github.com/settings/apps) → **New GitHub App**, granting it the repository permissions they need."},{"markdown":"On the app's page, note the **App ID**, then click **Generate a private key** and download the `.pem` file."},{"markdown":"Click **Install App**, install it on the account or organization you want to access, and copy the **Installation ID** from the resulting URL (`.../installations/<installationId>`)."},{"markdown":"Users enter their App ID, private key and installation ID when they connect. You can add extra guidance for them here:","component":"credentials"}]}}}},"webhook":{"verification":{"type":"hmac-sha256","signatureHeader":"x-hub-signature-256","signaturePrefix":"sha256="},"secretLabel":"Webhook secret","eventMapping":"headers.\"x-github-event\" & (body.action ? \".\" & body.action : \"\")","setupMarkdown":"1. In your repository or organization, go to **Settings → Webhooks → Add webhook**.\n2. Paste the endpoint URL above into **Payload URL**.\n3. Set **Content type** to `application/json`.\n4. Generate a strong secret, paste it into GitHub's **Secret** field and save the same value as the signing secret here.\n5. Choose the events you want to receive and click **Add webhook**.","triggers":[{"id":"push","name":"Push","description":"A commit was pushed to a branch or tag","match":"headers.\"x-github-event\" = \"push\"","sessionKey":"body.repository.full_name & \":\" & body.ref"},{"id":"pull_request.opened","name":"Pull request opened","match":"headers.\"x-github-event\" = \"pull_request\" and body.action = \"opened\"","sessionKey":"body.repository.full_name & \"#\" & $string(body.pull_request.number)"},{"id":"pull_request.merged","name":"Pull request merged","match":"headers.\"x-github-event\" = \"pull_request\" and body.action = \"closed\" and body.pull_request.merged = true","sessionKey":"body.repository.full_name & \"#\" & $string(body.pull_request.number)"},{"id":"issues.opened","name":"Issue opened","match":"headers.\"x-github-event\" = \"issues\" and body.action = \"opened\"","sessionKey":"body.repository.full_name & \"#\" & $string(body.issue.number)"},{"id":"issue_comment.created","name":"Issue comment created","match":"headers.\"x-github-event\" = \"issue_comment\" and body.action = \"created\"","sessionKey":"body.repository.full_name & \"#\" & $string(body.issue.number)"},{"id":"release.published","name":"Release published","match":"headers.\"x-github-event\" = \"release\" and body.action = \"published\"","sessionKey":"body.repository.full_name & \":release-\" & $string(body.release.id)"},{"id":"workflow_run.completed","name":"Workflow run completed","match":"headers.\"x-github-event\" = \"workflow_run\" and body.action = \"completed\"","sessionKey":"body.repository.full_name & \":workflow-\" & $string(body.workflow_run.id)"}]},"conditions":[{"id":"webhook-only-repositories","name":"Only for specific repositories","description":"Run this workflow only for events from the repositories you select.","surface":"webhook","mapping":"body.repository.full_name in variables.repositories","variables":[{"key":"repositories","label":"Repositories","description":"Only events from the repositories you select will trigger this workflow.","type":"string[]","required":true,"placeholder":"acme/api, acme/frontend","options":{"action":{"path":"/user/repos","method":"GET","mapping":{"query":"{ \"per_page\": \"100\", \"sort\": \"pushed\", \"affiliation\": \"owner,collaborator,organization_member\" }"}},"mapping":"response.{ \"value\": full_name, \"label\": full_name }","searchable":true}}]},{"id":"webhook-ignore-repositories","name":"Ignore specific repositories","description":"Skip this workflow for events from the repositories you select.","surface":"webhook","mapping":"$not(body.repository.full_name in variables.repositories)","variables":[{"key":"repositories","label":"Ignored repositories","description":"Events from the repositories you select will not trigger this workflow.","type":"string[]","required":true,"placeholder":"acme/api, acme/frontend","options":{"action":{"path":"/user/repos","method":"GET","mapping":{"query":"{ \"per_page\": \"100\", \"sort\": \"pushed\", \"affiliation\": \"owner,collaborator,organization_member\" }"}},"mapping":"response.{ \"value\": full_name, \"label\": full_name }","searchable":true}}]},{"id":"webhook-only-users","name":"Only for specific users","description":"Run this workflow only for events triggered by the GitHub usernames you list.","surface":"webhook","mapping":"body.sender.login in variables.usernames","variables":[{"key":"usernames","label":"Usernames","description":"Only events triggered by these GitHub usernames will run this workflow.","type":"string[]","required":true,"placeholder":"octocat, hubot"}]},{"id":"webhook-ignore-users","name":"Ignore specific users","description":"Skip this workflow for events triggered by the GitHub usernames you list — useful for ignoring bots.","surface":"webhook","mapping":"$not(body.sender.login in variables.usernames)","variables":[{"key":"usernames","label":"Ignored usernames","description":"Events triggered by these GitHub usernames will not run this workflow.","type":"string[]","required":true,"placeholder":"dependabot[bot], renovate[bot]"}]}],"tools":[{"name":"Create or Update File","description":"Create or update a GitHub file. Always ask the user for owner, repo, and branch. Never assume values from the prompt.","slug":"create_or_update_file","ai_risk":{"level":"medium","score":6,"reasoning":"This tool can create or update files in a GitHub repository, which is a destructive operation that can modify the repository's content.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","path","content","message","branch"],"properties":{"owner":{"type":"string","description":"Repository owner (user or organization). Must be explicitly provided by the user. Cannot be assumed."},"repo":{"type":"string","description":"Repository name. Must be explicitly provided by the user. Cannot be assumed."},"path":{"type":"string","description":"File path"},"content":{"type":"string","description":"File content as text"},"message":{"type":"string","description":"Commit message"},"branch":{"type":"string","description":"Branch name. Must be explicitly provided by the user. Cannot be assumed."},"sha":{"type":"string","description":"File SHA if updating (optional)"}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/contents/{path}","method":"PUT","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"path\": arguments.path\n }","body":"{\n \"content\": $base64encodeUtf8(arguments.content),\n \"message\": arguments.message,\n \"branch\": arguments.branch,\n \"sha\": arguments.sha\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Search Repositories","description":"Search for GitHub repositories","slug":"search_repositories","ai_risk":{"level":"low","score":1,"reasoning":"This tool is read-only and allows users to search for GitHub repositories without modifying any data.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["query","perPage"],"properties":{"query":{"type":"string","description":"Search query"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional)","default":10}}},"enabled":true,"action":{"path":"/search/repositories","method":"GET","mapping":{"query":"{\n \"q\": arguments.query,\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Repository","description":"Get details of a specific GitHub repository","slug":"get_repository","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner (user or organization)"},"repo":{"type":"string","description":"Repository name"}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Repository in Personal Account","description":"Create a new GitHub repository in your personal account","slug":"create_repository_in_personal_account","ai_risk":{"level":"medium","score":6,"reasoning":"This tool creates a new repository in a personal account, which is a destructive operation that can affect the user's account structure.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Repository name"},"description":{"type":"string","description":"Repository description"},"private":{"type":"boolean","description":"Private repository flag","default":false},"auto_init":{"type":"boolean","description":"Initialize with README","default":false}}},"enabled":true,"action":{"path":"/user/repos","method":"POST","mapping":{"body":"{\n \"name\": arguments.name,\n \"description\": arguments.description,\n \"private\": arguments.private,\n \"auto_init\": arguments.auto_init\n }"}},"annotations":{"destructiveHint":true}},{"name":"Create Repository in an Organization","description":"Create a new repository in a GitHub organization.","slug":"create_repository_in_organization","ai_risk":{"level":"medium","score":6,"reasoning":"This tool creates a new repository in an organization, which is a destructive operation that can impact organizational resources.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","name"],"properties":{"owner":{"type":"string","description":"The GitHub organization where the repository will be created."},"name":{"type":"string","description":"Repository name"},"description":{"type":"string","description":"Repository description"},"private":{"type":"boolean","description":"Private repository flag","default":false},"auto_init":{"type":"boolean","description":"Initialize with README","default":false}}},"enabled":true,"action":{"path":"/orgs/{owner}/repos","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner\n }","body":"{\n \"name\": arguments.name,\n \"description\": arguments.description,\n \"private\": arguments.private,\n \"auto_init\": arguments.auto_init\n }"}},"annotations":{"destructiveHint":true}},{"name":"Get File Contents","description":"Get the contents of a file or directory from a GitHub repository","slug":"get_file_contents","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the contents of a file or directory from a repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","path"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"path":{"type":"string","description":"File or directory path"},"branch":{"type":"string","description":"Branch, tag or commit SHA to read from (optional). Defaults to the repository's default branch, which is not always its working trunk — pass this explicitly before making claims about what a branch contains."},"ref":{"type":"string","description":"Alias for `branch`, matching the GitHub API's own parameter name. `branch` takes precedence when both are given."},"allow_binary":{"type":"boolean","description":"Return binary files (images, archives, fonts) base64-encoded in `content_base64` instead of failing. Off by default, because binary has no readable text form and its base64 is large; pass it only when the caller handles raw bytes."}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/contents/{path}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"path\": arguments.path\n }","query":"{\n \"ref\": arguments.branch ? arguments.branch : arguments.ref\n }","response":"response.type = \"file\" ? $merge([{\n \"name\": response.name,\n \"path\": response.path,\n \"sha\": response.sha,\n \"size\": response.size,\n \"type\": response.type,\n \"url\": response.url,\n \"html_url\": response.html_url,\n \"download_url\": response.download_url,\n \"ref\": $contains(response.url, \"?ref=\") ? $substringAfter(response.url, \"?ref=\") : undefined\n}, response.content ? $decodeFileContent(response.content, arguments.allow_binary) : {}]) :\n$map(response, function($v) {\n {\n \"name\": $v.name,\n \"path\": $v.path,\n \"sha\": $v.sha,\n \"type\": $v.type,\n \"url\": $v.url,\n \"html_url\": $v.html_url,\n \"download_url\": $v.download_url\n }\n})"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Issue","description":"Create a new issue in a GitHub repository","slug":"create_issue","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new issue in a repository, which is a standard write operation but can affect project management.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","title"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"title":{"type":"string","description":"Issue title"},"body":{"type":"string","description":"Issue body (optional)"},"labels":{"type":"array","items":{"type":"string"},"description":"Issue labels (optional)"},"assignees":{"type":"array","items":{"type":"string"},"description":"Issue assignees (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","body":"{\n \"title\": arguments.title,\n \"body\": arguments.body,\n \"labels\": arguments.labels,\n \"assignees\": arguments.assignees\n }"}},"annotations":{"destructiveHint":true}},{"name":"Create Pull Request","description":"Create a new pull request in a GitHub repository","slug":"create_pull_request","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new pull request, which is a standard write operation that can affect the code review process.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","title","head","base"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"title":{"type":"string","description":"PR title"},"body":{"type":"string","description":"PR description (optional)"},"head":{"type":"string","description":"Head branch"},"base":{"type":"string","description":"Base branch"},"draft":{"type":"boolean","description":"Create as draft PR (optional)"},"maintainer_can_modify":{"type":"boolean","description":"Allow maintainers to modify (optional)"}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/pulls","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","body":"{\n \"title\": arguments.title,\n \"body\": arguments.body,\n \"head\": arguments.head,\n \"base\": arguments.base,\n \"draft\": arguments.draft,\n \"maintainer_can_modify\": arguments.maintainer_can_modify\n }"}},"annotations":{"destructiveHint":true}},{"name":"Fork Repository","description":"Fork a GitHub repository to your account or specified organization","slug":"fork_repository","ai_risk":{"level":"medium","score":5,"reasoning":"This tool forks a repository, which is a destructive operation that creates a copy of the repository under the user's account.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"organization":{"type":"string","description":"Organization to fork to (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/forks","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","body":"{\n \"organization\": arguments.organization\n }"}},"annotations":{"destructiveHint":true}},{"name":"Create Branch","description":"Create a new branch in a GitHub repository.\n If the repository name (repo) is not explicitly provided, do not attempt to infer or guess it.\n Instead, ask the user which repository to use.\n Never select a repository automatically, even if multiple exist.\n Only retrieve commits or SHAs after the repository is explicitly known.","slug":"create_branch","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new branch in a repository, which is a standard write operation that can affect the development workflow.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","branch","from_branch_sha"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"This value MUST come directly from the user. LLMs are not allowed to infer or search for repositories automatically."},"branch":{"type":"string","description":"The name of the new branch to create. If not specified, use the default branch name (main or master)."},"from_branch_sha":{"type":"string","description":"The commit SHA to base the new branch on. You can retrieve it from the default branch, but only after repo is confirmed."}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/git/refs","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","body":"{\n \"ref\": \"refs/heads/\" & arguments.branch,\n \"sha\": arguments.from_branch_sha\n }"}},"annotations":{"destructiveHint":true}},{"name":"List Commits","description":"Get list of commits of a branch in a GitHub repository","slug":"list_commits","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a list of commits from a branch, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional)","default":30},"sha":{"type":"string","description":"Branch name or commit SHA (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/commits","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","query":"{\n \"page\": arguments.page,\n \"per_page\": arguments.perPage,\n \"sha\": arguments.sha\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Branches","description":"List branches of a GitHub repository. Results are paginated.","slug":"list_branches","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists branches in a repository, which is a read-only operation and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"per_page":{"type":"number","description":"The number of results per page (max 100).","default":100},"page":{"type":"number","description":"The page number of the results to fetch."}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/branches","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","query":"{\n \"per_page\": arguments.per_page,\n \"page\": arguments.page\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Issues","description":"List issues in a GitHub repository with filtering options","slug":"list_issues","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists issues in a repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"state":{"type":"string","description":"Issue state (open, closed, all)","default":"open"},"labels":{"type":"string","description":"Comma-separated list of label names"},"sort":{"type":"string","description":"Sort field (created, updated, comments)","default":"created"},"direction":{"type":"string","description":"Sort direction (asc, desc)","default":"desc"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","query":"{\n \"state\": arguments.state,\n \"labels\": arguments.labels,\n \"sort\": arguments.sort,\n \"direction\": arguments.direction\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Issue","description":"Update an existing issue in a GitHub repository","slug":"update_issue","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates an existing issue, which is a standard write operation that can affect project management.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"},"title":{"type":"string","description":"New issue title (optional)"},"body":{"type":"string","description":"New issue body (optional)"},"state":{"type":"string","description":"Issue state (open, closed)","enum":["open","closed"]},"labels":{"type":"array","items":{"type":"string"},"description":"Issue labels (optional)"},"assignees":{"type":"array","items":{"type":"string"},"description":"Issue assignees (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}","method":"PATCH","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }","body":"{\n \"title\": arguments.title,\n \"body\": arguments.body,\n \"state\": arguments.state,\n \"labels\": arguments.labels,\n \"assignees\": arguments.assignees\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Add Issue Comment","description":"Add a comment to an existing issue","slug":"add_issue_comment","ai_risk":{"level":"low","score":4,"reasoning":"This tool adds a comment to an existing issue, which is a write operation but generally low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number","body"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"},"body":{"type":"string","description":"Comment body"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}/comments","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }","body":"{\n \"body\": arguments.body\n }"}},"annotations":{"destructiveHint":true}},{"name":"Search Code","description":"Search for code across GitHub repositories","slug":"search_code","ai_risk":{"level":"low","score":1,"reasoning":"This tool searches for code across repositories, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional)","default":30}}},"enabled":true,"action":{"path":"/search/code","method":"GET","mapping":{"query":"{\n \"q\": arguments.query,\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Search Issues","description":"Search for issues and pull requests across GitHub repositories","slug":"search_issues","ai_risk":{"level":"low","score":1,"reasoning":"This tool searches for issues and pull requests, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional)","default":30}}},"enabled":true,"action":{"path":"/search/issues","method":"GET","mapping":{"query":"{\n \"q\": arguments.query,\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Search Users","description":"Search for users on GitHub","slug":"search_users","ai_risk":{"level":"low","score":1,"reasoning":"This tool searches for users on GitHub, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Search query"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional)","default":30}}},"enabled":false,"action":{"path":"/search/users","method":"GET","mapping":{"query":"{\n \"q\": arguments.query,\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Issue","description":"Get details of a specific issue in a GitHub repository","slug":"get_issue","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific issue, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Issue Comments","description":"Get the comments on a specific issue in a GitHub repository","slug":"get_issue_comments","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the comments on an issue, making it read-only and low risk.","calculated_at":"2026-08-19T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional, max 100)","default":30}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}/comments","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }","query":"{\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Issue Sub-Issues","description":"List the sub-issues (children) of a specific issue in a GitHub repository","slug":"get_issue_sub_issues","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists the sub-issues of an issue, making it read-only and low risk.","calculated_at":"2026-08-19T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional, max 100)","default":30}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}/sub_issues","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }","query":"{\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Issue Parent","description":"Get the parent issue of a sub-issue, if this issue is a sub-issue of another","slug":"get_issue_parent","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the parent issue of a sub-issue, making it read-only and low risk.","calculated_at":"2026-08-19T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}/parent","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Issue Labels","description":"Get the labels assigned to a specific issue in a GitHub repository","slug":"get_issue_labels","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the labels assigned to an issue, making it read-only and low risk.","calculated_at":"2026-08-19T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","issue_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"issue_number":{"type":"integer","description":"Issue number"},"page":{"type":"integer","description":"Page number (optional)","default":1},"perPage":{"type":"integer","description":"Results per page (optional, max 100)","default":30}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{issue_number}/labels","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"issue_number\": arguments.issue_number\n }","query":"{\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pull Request","description":"Get details of a specific pull request","slug":"get_pull_request","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves details of a specific pull request, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Pull Request","description":"Update an existing pull request's title, body, state, base branch or maintainer-edit flag. Use this rather than `update_issue` when the base branch needs to change — a PR opened against the wrong base (common where a repository's GitHub default branch is not its working trunk) can be retargeted here instead of being closed and reopened.","slug":"update_pull_request","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates an existing pull request, a standard write operation. Retargeting the base branch changes what the pull request proposes to merge.","calculated_at":"2026-08-12T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"title":{"type":"string","description":"New pull request title (optional)"},"body":{"type":"string","description":"New pull request body (optional)"},"state":{"type":"string","description":"Pull request state (optional)","enum":["open","closed"]},"base":{"type":"string","description":"Name of an existing branch to retarget the pull request at (optional). The branch must exist in the same repository."},"maintainer_can_modify":{"type":"boolean","description":"Whether maintainers may modify the pull request's head branch (optional)."}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}","method":"PATCH","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","body":"{\n \"title\": arguments.title,\n \"body\": arguments.body,\n \"state\": arguments.state,\n \"base\": arguments.base,\n \"maintainer_can_modify\": arguments.maintainer_can_modify\n }","response":"{\n \"number\": response.number,\n \"title\": response.title,\n \"state\": response.state,\n \"draft\": response.draft,\n \"base\": response.base.ref,\n \"head\": response.head.ref,\n \"maintainer_can_modify\": response.maintainer_can_modify,\n \"html_url\": response.html_url,\n \"updated_at\": response.updated_at\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"List Pull Requests","description":"List and filter repository pull requests. Results are paginated (default 30 per page, max 100). Pass page to fetch further pages; increment page until a response has fewer than perPage items.","slug":"list_pull_requests","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists pull requests in a repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"state":{"type":"string","description":"Pull request state (open, closed, all)","default":"open"},"sort":{"type":"string","description":"Sort field (created, updated, popularity, long-running)","default":"created"},"direction":{"type":"string","description":"Sort direction (asc, desc)","default":"desc"},"branch":{"type":"string","description":"Branch name (optional)"},"page":{"type":"integer","description":"Page number of results to fetch. Default is 1.","default":1},"perPage":{"type":"integer","description":"Results per page (max 100). Default is 30.","default":30}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo\n }","query":"{\n \"head\": arguments.branch ? arguments.owner & \":\" & arguments.branch : \"\",\n \"state\": arguments.state,\n \"sort\": arguments.sort,\n \"direction\": arguments.direction,\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Pull Request Review","description":"Create a review on a pull request, optionally with inline comments anchored to specific lines of the diff. Each entry in `comments` targets a file path and a line in the diff. To propose a concrete code change, put a GitHub suggestion block in the comment body:\n```suggestion\nthe replacement lines\n```\nUse Get Pull Request Files to find the file paths and line numbers that are part of the diff before commenting.","slug":"create_pull_request_review","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a review on a pull request, which is a write operation that can influence the code review process.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number","event"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"event":{"type":"string","description":"Review action (APPROVE, REQUEST_CHANGES, COMMENT)","enum":["APPROVE","REQUEST_CHANGES","COMMENT"]},"body":{"type":"string","description":"Overall review body. Required when event is REQUEST_CHANGES or COMMENT, optional for APPROVE."},"commit_id":{"type":"string","description":"SHA of the commit the review applies to (optional). Defaults to the latest commit on the pull request."},"comments":{"type":"array","description":"Inline review comments to post as part of this review (optional).","items":{"type":"object","required":["path","body","line"],"properties":{"path":{"type":"string","description":"File path the comment applies to"},"body":{"type":"string","description":"Comment text. May contain a ```suggestion``` block to propose a change."},"line":{"type":"integer","description":"Line number in the file the comment applies to. For a multi-line comment this is the last line of the range."},"side":{"type":"string","description":"Diff side the line refers to. RIGHT is the head (new) version, LEFT is the base (old) version.","enum":["LEFT","RIGHT"],"default":"RIGHT"},"start_line":{"type":"integer","description":"First line of a multi-line comment range (optional)."},"start_side":{"type":"string","description":"Diff side of start_line (optional).","enum":["LEFT","RIGHT"]}}}}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/reviews","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","body":"{\n \"event\": arguments.event,\n \"body\": arguments.body,\n \"commit_id\": arguments.commit_id,\n \"comments\": $exists(arguments.comments) ? [arguments.comments] : undefined\n }"}},"annotations":{"destructiveHint":true}},{"name":"Create Pull Request Review Comment","description":"Post a single inline review comment on a specific line of a pull request diff, without opening a full review. To propose a concrete code change, put a GitHub suggestion block in the body:\n```suggestion\nthe replacement lines\n```\nUse Get Pull Request Files to find the file paths and line numbers that are part of the diff, and Get Pull Request to find the head commit SHA.","slug":"create_pull_request_review_comment","ai_risk":{"level":"medium","score":5,"reasoning":"This tool posts an inline comment on a pull request, which is a write operation that can influence the code review process.","calculated_at":"2026-07-28T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number","body","path","commit_id"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"body":{"type":"string","description":"Comment text. May contain a ```suggestion``` block to propose a change."},"path":{"type":"string","description":"File path the comment applies to"},"commit_id":{"type":"string","description":"SHA of the commit to comment on. Use the head commit of the pull request."},"line":{"type":"integer","description":"Line number in the file the comment applies to. For a multi-line comment this is the last line of the range. Omit only when subject_type is 'file'."},"side":{"type":"string","description":"Diff side the line refers to. RIGHT is the head (new) version, LEFT is the base (old) version.","enum":["LEFT","RIGHT"],"default":"RIGHT"},"start_line":{"type":"integer","description":"First line of a multi-line comment range (optional)."},"start_side":{"type":"string","description":"Diff side of start_line (optional).","enum":["LEFT","RIGHT"]},"subject_type":{"type":"string","description":"Level the comment is attached to. Use 'file' to comment on a whole file instead of a line.","enum":["line","file"]}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/comments","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","body":"{\n \"body\": arguments.body,\n \"path\": arguments.path,\n \"commit_id\": arguments.commit_id,\n \"line\": arguments.line,\n \"side\": arguments.side,\n \"start_line\": arguments.start_line,\n \"start_side\": arguments.start_side,\n \"subject_type\": arguments.subject_type\n }"}},"annotations":{"destructiveHint":true}},{"name":"Reply to Pull Request Review Comment","description":"Reply to an existing inline review comment thread on a pull request. Use Get Pull Request Comments to find the comment ID to reply to.","slug":"reply_to_pull_request_review_comment","ai_risk":{"level":"medium","score":4,"reasoning":"This tool replies to an existing review comment thread, which is a write operation but limited to adding discussion.","calculated_at":"2026-07-28T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number","comment_id","body"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"comment_id":{"type":"integer","description":"ID of the review comment to reply to"},"body":{"type":"string","description":"Reply text"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies","method":"POST","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number,\n \"comment_id\": arguments.comment_id\n }","body":"{\n \"body\": arguments.body\n }"}},"annotations":{"destructiveHint":true}},{"name":"Update Pull Request Review Comment","description":"Edit the text of an existing inline review comment on a pull request, for example to revise a suggested change.","slug":"update_pull_request_review_comment","ai_risk":{"level":"medium","score":5,"reasoning":"This tool edits an existing review comment, which overwrites content that another user may have authored.","calculated_at":"2026-07-28T00:00:00.000Z"},"inputSchema":{"type":"object","required":["owner","repo","comment_id","body"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"comment_id":{"type":"integer","description":"ID of the review comment to update"},"body":{"type":"string","description":"New comment text. May contain a ```suggestion``` block to propose a change."}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/comments/{comment_id}","method":"PATCH","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"comment_id\": arguments.comment_id\n }","body":"{\n \"body\": arguments.body\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Merge Pull Request","description":"Merge a pull request","slug":"merge_pull_request","ai_risk":{"level":"medium","score":6,"reasoning":"This tool merges a pull request, which is a destructive operation that modifies the repository's content.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"merge_method":{"type":"string","description":"Merge method (merge, squash, rebase)","enum":["merge","squash","rebase"],"default":"merge"},"commit_title":{"type":"string","description":"Title for the commit message (optional)"},"commit_message":{"type":"string","description":"Extra detail to append to automatic commit message (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/merge","method":"PUT","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","body":"{\n \"merge_method\": arguments.merge_method,\n \"commit_title\": arguments.commit_title,\n \"commit_message\": arguments.commit_message\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Get Pull Request Files","description":"Get the list of files changed in a pull request. Results are paginated (default 30 per page, max 100; GitHub caps the total at 3000 files). Pass page to fetch further pages; increment page until a response has fewer than perPage items.","slug":"get_pull_request_files","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves the list of files changed in a pull request, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"page":{"type":"integer","description":"Page number of results to fetch. Default is 1.","default":1},"perPage":{"type":"integer","description":"Results per page (max 100). Default is 30.","default":30}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/files","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","query":"{\n \"page\": arguments.page,\n \"per_page\": arguments.perPage\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Update Pull Request Branch","description":"Update a pull request branch with the latest changes from the base branch","slug":"update_pull_request_branch","ai_risk":{"level":"medium","score":6,"reasoning":"This tool updates a pull request branch with the latest changes, which is a destructive operation that modifies the repository.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"},"expected_head_sha":{"type":"string","description":"The expected SHA of the pull request head (optional)"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/update-branch","method":"PUT","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }","body":"{\n \"expected_head_sha\": arguments.expected_head_sha\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Get Pull Request Comments","description":"Get the inline review comments on a pull request (comments anchored to specific lines of the diff). To read the general discussion comments from the PR's Conversation tab, use Get Pull Request Conversation Comments instead.","slug":"get_pull_request_comments","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves review comments on a pull request, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/comments","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pull Request Conversation Comments","description":"Get the conversation comments on a pull request (the general discussion comments shown in the PR's Conversation tab). These are issue-style comments, separate from the inline code-review comments returned by Get Pull Request Comments.","slug":"get_pr_conversation_comments","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves conversation comments on a pull request, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/issues/{pull_number}/comments","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Pull Request Reviews","description":"Get the reviews on a pull request","slug":"get_pull_request_reviews","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves reviews on a pull request, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","pull_number"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"pull_number":{"type":"integer","description":"Pull request number"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/pulls/{pull_number}/reviews","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"pull_number\": arguments.pull_number\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Compare Branches","description":"Compare two branches in a GitHub repository","slug":"compare_branches","ai_risk":{"level":"low","score":1,"reasoning":"This tool compares two branches in a repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo","base","head"],"properties":{"owner":{"type":"string","description":"Repository owner"},"repo":{"type":"string","description":"Repository name"},"base":{"type":"string","description":"Base branch"},"head":{"type":"string","description":"Head branch"}}},"enabled":false,"action":{"path":"/repos/{owner}/{repo}/compare/{base}...{head}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"base\": arguments.base,\n \"head\": arguments.head\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"List Gists","description":"List gists for the authenticated user or a specific user","slug":"list_gists","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists gists for a user, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","properties":{}},"enabled":true,"action":{"path":"/gists","method":"GET","mapping":{}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Get Gist","description":"Get a specific gist by ID","slug":"get_gist","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a specific gist by ID, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["gist_id"],"properties":{"gist_id":{"type":"string","description":"Gist ID"}}},"enabled":true,"action":{"path":"/gists/{gist_id}","method":"GET","mapping":{"params":"{\n \"gist_id\": arguments.gist_id\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Create Gist","description":"Create a new gist with one or more files","slug":"create_gist","ai_risk":{"level":"medium","score":6,"reasoning":"This tool creates a new gist, which is a destructive operation that can affect the user's gists.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["files"],"properties":{"files":{"type":"object","description":"Files to include in the gist. Object with filenames as keys and content objects as values","additionalProperties":{"type":"object","required":["content"],"properties":{"content":{"type":"string","description":"File content"}}}},"description":{"type":"string","description":"Description of the gist"},"public":{"type":"boolean","description":"Whether the gist is public","default":true}}},"enabled":true,"action":{"path":"/gists","method":"POST","mapping":{"body":"{\n \"description\": arguments.description,\n \"public\": arguments.public,\n \"files\": arguments.files\n }"}},"annotations":{"destructiveHint":true}},{"name":"Update Gist","description":"Update an existing gist","slug":"update_gist","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates an existing gist, which is a standard write operation that can modify the user's gists.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["gist_id"],"properties":{"gist_id":{"type":"string","description":"Gist ID"},"files":{"type":"object","description":"Files to update. To rename, use new filename as key with old filename in object. To delete, set content to null","additionalProperties":{"type":"object","properties":{"content":{"type":"string","description":"New file content (null to delete)"},"filename":{"type":"string","description":"New filename (for renaming)"}}}},"description":{"type":"string","description":"New description"}}},"enabled":true,"action":{"path":"/gists/{gist_id}","method":"PATCH","mapping":{"params":"{\n \"gist_id\": arguments.gist_id\n }","body":"{\n \"description\": arguments.description,\n \"files\": arguments.files\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true}},{"name":"Delete Gist","description":"Delete a gist","slug":"delete_gist","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a gist, which is a destructive operation that can remove content irreversibly.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["gist_id"],"properties":{"gist_id":{"type":"string","description":"Gist ID"}}},"enabled":true,"action":{"path":"/gists/{gist_id}","method":"DELETE","mapping":{"params":"{\n \"gist_id\": arguments.gist_id\n }"}},"annotations":{"destructiveHint":true}},{"name":"Delete File","slug":"delete-file","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a file from a repository, which is a destructive operation that modifies the repository's content.","calculated_at":"2026-05-22T10:02:22.240Z"},"action":{"path":"/repos/{owner}/{repo}/contents/{path}","method":"DELETE","mapping":{"body":"$merge([{ \"message\": arguments.message, \"sha\": arguments.sha }, arguments.branch ? { \"branch\": arguments.branch } : {}])","params":"{ \"owner\": arguments.owner, \"repo\": arguments.repo, \"path\": arguments.path }","response":"{ \"commit\": response.commit, \"content\": response.content }"}},"enabled":true,"annotations":{"readOnlyHint":false,"openWorldHint":false,"destructiveHint":true},"description":"Delete a file from a GitHub repository. This creates a commit that removes the file at the specified path. Requires the file's current SHA and a commit message. Optionally target a specific branch.","inputSchema":{"type":"object","required":["owner","repo","path","sha","message"],"properties":{"sha":{"type":"string","description":"The blob SHA of the file to delete (required). You must provide the current SHA of the file."},"path":{"type":"string","description":"Path to the file in the repository (for example: README.md or src/index.js)."},"repo":{"type":"string","description":"Repository name."},"owner":{"type":"string","description":"Repository owner (user or organization)."},"branch":{"type":"string","description":"Optional branch name to commit to. If omitted, the repository's default branch is used."},"message":{"type":"string","description":"Commit message describing the deletion."}}}},{"name":"List Workflow Runs","description":"List workflow runs for a repository. Optionally filter by a specific workflow using workflow_id (workflow file name, e.g. 'build.yml', or numeric workflow ID).","slug":"list_workflow_runs","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists workflow runs for a repository, making it read-only and low risk.","calculated_at":"2026-05-22T10:02:22.240Z"},"inputSchema":{"type":"object","required":["owner","repo"],"properties":{"owner":{"type":"string","description":"Repository owner (user or organization)"},"repo":{"type":"string","description":"Repository name"},"workflow_id":{"type":"string","description":"Optional. Workflow file name (e.g. 'build.yml') or numeric workflow ID to filter runs for a specific workflow."},"branch":{"type":"string","description":"Optional. Only return runs for this branch (the run's head_branch)."},"status":{"type":"string","description":"Optional. Filter by run status or conclusion: completed, action_required, cancelled, failure, neutral, skipped, stale, success, timed_out, in_progress, queued, requested, waiting, pending."},"event":{"type":"string","description":"Optional. Filter by the event that triggered the run (e.g. push, pull_request, schedule)."},"head_sha":{"type":"string","description":"Optional. Only return runs for this commit SHA."},"per_page":{"type":"integer","description":"Number of results per page (optional, max 100)","default":10},"page":{"type":"integer","description":"Page number (optional)","default":1}}},"enabled":true,"action":{"path":"/repos/{owner}/{repo}/actions/{workflowPath}","method":"GET","mapping":{"params":"{\n \"owner\": arguments.owner,\n \"repo\": arguments.repo,\n \"workflowPath\": arguments.workflow_id ? \"workflows/\" & arguments.workflow_id & \"/runs\" : \"runs\"\n }","query":"{\n \"branch\": arguments.branch,\n \"status\": arguments.status,\n \"event\": arguments.event,\n \"head_sha\": arguments.head_sha,\n \"exclude_pull_requests\": true,\n \"per_page\": arguments.per_page,\n \"page\": arguments.page\n }","response":"{\n \"total_count\": response.total_count,\n \"workflow_runs\": $map(response.workflow_runs, function($run) {\n {\n \"id\": $run.id,\n \"name\": $run.name,\n \"display_title\": $run.display_title,\n \"run_number\": $run.run_number,\n \"run_attempt\": $run.run_attempt,\n \"event\": $run.event,\n \"head_branch\": $run.head_branch,\n \"head_sha\": $run.head_sha,\n \"status\": $run.status,\n \"conclusion\": $run.conclusion,\n \"created_at\": $run.created_at,\n \"updated_at\": $run.updated_at,\n \"html_url\": $run.html_url\n }\n })\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}}
|