Skip to content

Commit b3a139f

Browse files
authored
Merge branch 'main' into slack-app-updates
2 parents 8732e7f + 63eefcd commit b3a139f

148 files changed

Lines changed: 6939 additions & 646 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/reference-slug-map.json

Lines changed: 1458 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
"""Verify every legacy /reference/* redirect in docs.json points at an on-disk page.
3+
4+
These redirects (generated from .github/reference-slug-map.json, the frozen
5+
ReadMe-era slug set) are inbound-only: no docs page links to /reference/*, so
6+
`mint broken-links` never walks them and a page rename/delete would dead-end
7+
their destinations silently. This check closes that gap. It must run on any
8+
PR that touches .mdx files or docs.json — a rename PR is exactly the event
9+
it exists to catch.
10+
"""
11+
import json
12+
import pathlib
13+
import sys
14+
15+
root = pathlib.Path(__file__).resolve().parents[2]
16+
docs = json.loads((root / "docs.json").read_text())
17+
18+
pages = {
19+
"/" + str(p.relative_to(root))[: -len(".mdx")]
20+
for p in root.rglob("*.mdx")
21+
if "node_modules" not in p.parts
22+
}
23+
24+
broken = []
25+
for redirect in docs.get("redirects", []):
26+
if not redirect["source"].startswith("/reference/"):
27+
continue
28+
destination = redirect["destination"].split("#")[0]
29+
if destination not in pages:
30+
broken.append(f"{redirect['source']} -> {redirect['destination']}")
31+
32+
if broken:
33+
print(f"{len(broken)} /reference/* redirect destination(s) have no matching .mdx page:")
34+
print("\n".join(broken))
35+
sys.exit(1)
36+
37+
checked = sum(1 for r in docs.get("redirects", []) if r["source"].startswith("/reference/"))
38+
print(f"OK: {checked} /reference/* redirect destinations all resolve to on-disk pages")

.github/workflows/static-docs-checks.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ jobs:
6868
if: steps.detect.outputs.openapi_changed == 'true'
6969
run: npx mint openapi-check api-reference/openapi.json
7070

71+
# Legacy /reference/* redirects are inbound-only, so `mint broken-links`
72+
# never validates their destinations. Runs on any docs change (.mdx or
73+
# docs.json) because a page rename/delete is exactly what breaks them.
74+
- name: Check legacy redirect destinations
75+
if: steps.detect.outputs.docs_changed == 'true'
76+
run: python3 .github/scripts/check_redirect_destinations.py
77+
7178
- name: Broken-links scan
7279
if: steps.detect.outputs.docs_changed == 'true'
7380
run: |

.github/workflows/update-api-spec.yml

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ jobs:
5454
- name: Generate pages for any new endpoints
5555
run: node .github/scripts/detect-new-endpoints.mjs
5656

57-
- name: Open auto-merging PR if anything changed
57+
- name: Create or update API spec PR if anything changed
5858
env:
5959
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6060
run: |
61+
set -euo pipefail
62+
6163
# Stage everything that might have changed
6264
git add api-reference docs.json
6365
@@ -88,13 +90,13 @@ jobs:
8890
TITLE="chore(api): refresh API reference"
8991
fi
9092
91-
BRANCH="auto/update-api-spec-${{ github.run_id }}"
92-
git checkout -b "$BRANCH"
93+
BRANCH="auto/update-api-spec"
94+
git checkout -B "$BRANCH"
9395
9496
git commit -m "$TITLE" \
9597
-m "Automatically fetched from https://api.checklyhq.com/openapi.json" \
9698
-m "Updated on $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
97-
git push origin "$BRANCH"
99+
git push --force-with-lease origin "$BRANCH"
98100
99101
# Build PR body
100102
BODY_FILE=$(mktemp)
@@ -105,24 +107,42 @@ jobs:
105107
echo "- New endpoint pages: $NEW_PAGES"
106108
echo "- \`docs.json\` updated: $([ "$DOCS_JSON_CHANGED" = "1" ] && echo yes || echo no)"
107109
echo ""
108-
echo "This PR will auto-merge once all required checks pass."
110+
echo "This PR reuses the \`$BRANCH\` branch so future runs update this PR instead of opening duplicates."
109111
echo ""
110112
echo "---"
111113
echo "_Run: [${{ github.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})_"
112114
} > "$BODY_FILE"
113115
114-
PR_URL=$(gh pr create \
115-
--title "$TITLE" \
116-
--body-file "$BODY_FILE" \
116+
PR_URL=$(gh pr list \
117117
--base main \
118118
--head "$BRANCH" \
119-
--label auto-generated \
120-
--label api-docs)
121-
echo "Created $PR_URL"
119+
--state open \
120+
--json url \
121+
--jq '.[0].url // ""')
122+
123+
if [ -n "$PR_URL" ]; then
124+
gh pr edit "$PR_URL" \
125+
--title "$TITLE" \
126+
--body-file "$BODY_FILE" \
127+
--add-label auto-generated \
128+
--add-label api-docs
129+
echo "Updated $PR_URL"
130+
else
131+
PR_URL=$(gh pr create \
132+
--title "$TITLE" \
133+
--body-file "$BODY_FILE" \
134+
--base main \
135+
--head "$BRANCH" \
136+
--label auto-generated \
137+
--label api-docs)
138+
echo "Created $PR_URL"
139+
fi
122140
123-
# Enable auto-merge; branch protection requires status checks to pass
124-
# before the PR is actually merged.
125-
gh pr merge "$PR_URL" --squash --auto --delete-branch
141+
# Try to enable auto-merge, but do not create another PR if GitHub
142+
# requires manual approval before pull_request workflows can run.
143+
if ! gh pr merge "$PR_URL" --squash --auto --delete-branch; then
144+
echo "::notice::Could not enable auto-merge for $PR_URL. The stable branch will be updated by the next run instead of opening another PR."
145+
fi
126146
127147
- name: Ping Checkly
128148
if: always()

.mintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
api-reference-old/**/*.mdx
2+
skills/**

API-DOCUMENTATION.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,11 @@ title: API checks
6565
If you need to update your local copy of the OpenAPI spec, run `./update-api-spec.sh`
6666

6767
That's it! Your new endpoint should be showing properly now.
68+
69+
## Legacy `/reference/*` redirects
70+
71+
The pre-Mintlify API reference lived on ReadMe.io at `developers.checklyhq.com/reference/<slug>`, where `<slug>` was the lowercased OpenAPI `operationId` (e.g. `getv1checks`). To keep those old deep links alive, `docs.json` carries redirects generated from `.github/reference-slug-map.json` — a **frozen** snapshot of the ReadMe-era slug set. Don't regenerate it from a newer spec: endpoints added after the ReadMe era never had `/reference/` URLs.
72+
73+
* One explicit redirect per historical slug maps to its endpoint page, so old bookmarks deep-link correctly.
74+
* A trailing catch-all `/reference/:slug*``/api-reference/overview` backstops slugs whose endpoints were removed after the ReadMe era. Mintlify resolves exact sources before wildcards, so the catch-all never shadows the explicit entries. **If you ever add a real docs page under `/reference/`, this catch-all will intercept it — narrow or remove it first.**
75+
* `mint broken-links` does **not** validate these destinations (nothing links to `/reference/*` in page content), so `.github/scripts/check_redirect_destinations.py` runs in the static-docs-checks workflow on every docs PR and fails if a page rename/delete breaks any of them.

ai/llms-txt.mdx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@ The [llms.txt standard](https://llmstxt.org/) provides a machine-readable index
1616
- [Adding team members to your Checkly account](https://checklyhq.com/docs/admin/team-management/adding-team-members.md): Learn how to invite team members to join your Checkly account and manage team collaboration
1717
- [Using Microsoft Entra ID for Single Sign-on in Checkly](https://checklyhq.com/docs/admin/team-management/microsoft-azure-ad.md): This page illustrates the standard procedure to follow in order to get started with Microsoft Entra ID SSO (formerly Azure AD) on Checkly.
1818
- [Multi-Factor Authentication in Checkly](https://checklyhq.com/docs/admin/team-management/multi-factor-authentication.md): Learn how to set up and manage multi-factor authentication for enhanced account security
19-
- [Using Okta for Single Sign-on in Checkly](https://checklyhq.com/docs/admin/team-management/okta.md): This page illustrates the standard procedure to follow in order to get started with Okta SSO on Checkly.
20-
- [Role Based Access Control in Checkly](https://checklyhq.com/docs/admin/team-management/rbac.md): Checkly roles and permissions for team members
21-
- [Removing team members from your Checkly account](https://checklyhq.com/docs/admin/team-management/removing-team-members.md): Learn how to remove team members from your Checkly account and understand how it affects your billing
22-
- [Using SAML for Single Sign-On in Checkly](https://checklyhq.com/docs/admin/team-management/saml-sso.md): Learn how to set up SAML-based SSO for your Checkly account with supported identity providers
23-
- [Using SCIM provisioning in Checkly](https://checklyhq.com/docs/admin/team-management/scim-provisioning.md): Learn how to set up SCIM provisioning for Checkly using your identity provider
19+
- [Admin Overview](https://checklyhq.com/docs/admin/team-management/overview.md): Comprehensive guide to managing your Checkly account, team members, security, and integrations
20+
- [SAML for Single Sign-on in Checkly](https://checklyhq.com/docs/admin/team-management/saml.md): Learn how to configure SAML SSO integration with Checkly for your organization
21+
- [Single Sign-on in Checkly](https://checklyhq.com/docs/admin/team-management/single-sign-on.md): Overview of Single Sign-On (SSO) options available in Checkly for enterprise security
2422
- [Team management in Checkly](https://checklyhq.com/docs/admin/team-management.md): Manage your team and collaborate effectively in Checkly
2523
```
2624

@@ -38,4 +36,3 @@ curl https://checklyhq.com/docs/detect/synthetic-monitoring/browser-checks/overv
3836

3937
- [Markdown Access](/ai/markdown-access)
4038
- [Checkly Skills](/ai/skills)
41-
- [Checkly Rules](/ai/rules)

ai/markdown-access.mdx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,3 @@ Based on this, how do I set up a browser check with a custom user agent?
6161
## Additional resources
6262

6363
- [Checkly Skills](/ai/skills)
64-
- [Checkly Rules](/ai/rules)

ai/mcp-server.mdx

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
---
2+
title: 'Checkly MCP Server'
3+
description: 'Connect supported AI clients to Checkly to inspect checks, test sessions, RCA, result assets, status pages, incidents, and account context.'
4+
sidebarTitle: 'Overview'
5+
---
6+
7+
The Checkly MCP Server lets supported AI clients connect to Checkly over Streamable HTTP and use Checkly tools from your conversation.
8+
9+
Use the production MCP endpoint in your client:
10+
11+
```text
12+
https://api.checklyhq.com/mcp
13+
```
14+
15+
<Warning>
16+
The Checkly MCP Server only supports Checkly-approved OAuth clients listed in setup. Clients that use Dynamic Client Registration (DCR) are rejected. See [setup requirements](/ai/mcp-server/setup) for supported clients and details.
17+
</Warning>
18+
19+
Use it when your agent needs live Checkly account context, check status, check results, test sessions, root cause analyses, result assets, status pages, incidents, account environment variables, or when it needs to trigger existing checks.
20+
21+
<Note>
22+
Use [Checkly Skills](/ai/skills) and the [Checkly CLI](/cli/overview) when your agent needs to create, edit, test, bundle, or deploy check code. The MCP server runs remotely and cannot access your local filesystem.
23+
</Note>
24+
25+
## What you can do
26+
27+
- Inspect account membership, plan, and feature entitlements.
28+
- Check which checks are passing, failing, muted, or deactivated.
29+
- Read compact check results and test-session results.
30+
- Fetch normalized result asset manifests and bounded text assets.
31+
- Start or read Rocky AI root cause analyses.
32+
- Trigger existing deployed checks on demand.
33+
- Manage account-level environment variables and secrets.
34+
- Read status pages and manage status page incidents.
35+
36+
## Quick start
37+
38+
<Accordion title="Before you begin">
39+
Before connecting an MCP client, ensure you have:
40+
41+
- A Checkly user account.
42+
- Access to the Checkly account you want the MCP client to use.
43+
- A [supported MCP client](/ai/mcp-server/setup#supported-clients).
44+
</Accordion>
45+
46+
[Add the Checkly MCP endpoint to your client](/ai/mcp-server/setup), complete the OAuth flow, then ask your client to verify the connection:
47+
48+
```text title="Prompt" wrap
49+
Use Checkly to show which accounts I can access.
50+
```
51+
52+
If you belong to more than one Checkly account, tell your client which account to use in your prompt. To always use the same account, set the `X-Checkly-Account` header when your client supports custom MCP headers.
53+
54+
See [Set up the MCP server](/ai/mcp-server/setup) for client configuration examples.
55+
56+
## Example prompts
57+
58+
Basic prompts:
59+
60+
```text title="Prompt" wrap
61+
Show me the current status of my Checkly checks.
62+
```
63+
64+
```text title="Prompt" wrap
65+
List open status page incidents.
66+
```
67+
68+
```text title="Prompt" wrap
69+
What features are available on my current Checkly plan?
70+
```
71+
72+
Advanced prompts:
73+
74+
```text title="Prompt" wrap
75+
Investigate the latest failed result for the checkout API check. If there is an error group, check whether an RCA already exists before triggering a new one.
76+
```
77+
78+
```text title="Prompt" wrap
79+
Trigger the checks tagged production-smoke, then follow the test session until results are available.
80+
```
81+
82+
```text title="Prompt" wrap
83+
Create a major status page incident for the API outage, but do not notify subscribers until I confirm the message.
84+
```
85+
86+
## MCP, Skills, and CLI
87+
88+
MCP, Checkly Skills, and the Checkly CLI are complementary. Use the MCP Server for a quick, OAuth-based connection from a supported client. Use Checkly Skills with the CLI when your agent needs to create, edit, test, or deploy code from your local project.
89+
90+
See [Skills, MCP, and the CLI](/ai/overview#skills-mcp-and-the-cli) for a full comparison of when to use each.
91+
92+
## Learn more
93+
94+
- [Set up the MCP server](/ai/mcp-server/setup)
95+
- [MCP tools reference](/ai/mcp-server/tools)
96+
- [Security and permissions](/ai/mcp-server/security-and-permissions)
97+
- [Troubleshooting](/ai/mcp-server/troubleshooting)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
title: 'MCP security and permissions'
3+
description: 'Understand how the Checkly MCP Server authenticates users, filters tools by permission, handles account context, and protects write actions.'
4+
sidebarTitle: 'Security & permissions'
5+
---
6+
7+
The Checkly MCP Server uses OAuth and Checkly account authorization together. OAuth permissions decide which tools are visible to your MCP client. Checkly account membership, role, and feature entitlements decide whether a specific tool call can operate on an account.
8+
9+
## Authentication
10+
11+
The MCP Server accepts Auth0-issued bearer tokens for `https://api.checklyhq.com/mcp`. Your MCP client completes the OAuth flow and sends the token with requests to the MCP endpoint.
12+
13+
The public MCP Server only supports OAuth clients that Checkly has approved in Auth0. Checkly rejects clients that attempt to use [Dynamic Client Registration (DCR)](https://datatracker.ietf.org/doc/html/rfc7591). See [supported clients](/ai/mcp-server/setup#supported-clients) for setup details.
14+
15+
Checkly maps the token subject to a Checkly user, then loads that user's account memberships and account context for tool calls.
16+
17+
## OAuth permissions
18+
19+
| Permission | Description |
20+
| --- | --- |
21+
| `checkly:account:read` | Read your Checkly account membership and status |
22+
| `checkly:account:invite` | Invite members to your Checkly account |
23+
| `checkly:checks:read` | List checks, their status and results |
24+
| `checkly:checks:run` | Trigger Checkly checks and on-demand test sessions |
25+
| `checkly:incidents:read` | Read your Checkly incidents |
26+
| `checkly:incidents:write` | Create and update your Checkly incidents |
27+
| `checkly:environment-variables:read` | Read your Checkly account environment variables (secret values excluded) |
28+
| `checkly:environment-variables:write` | Create, update and delete your Checkly account environment variables |
29+
| `checkly:status-pages:read` | Read your Checkly status pages |
30+
| `checkly:rca:read` | Read your Checkly root cause analyses |
31+
| `checkly:rca:run` | Run Checkly root cause analysis for your account |
32+
| `checkly:test-sessions:read` | Read your Checkly test sessions |
33+
| `checkly:assets:read` | Read your Checkly assets |
34+
35+
Tools are filtered from `tools/list` when the MCP session does not include the required permission. Tool calls are also rejected if the session lacks the required permission.
36+
37+
## Account context
38+
39+
Most tools operate on one Checkly account. You can select a specific account in your prompt or pin an account in your MCP client configuration. See [Use a specific account](/ai/mcp-server/setup#use-a-specific-account) for setup examples.
40+
41+
<Warning>
42+
Accounts that require mTLS are not available through the public MCP Server.
43+
</Warning>
44+
45+
## Role checks
46+
47+
Some tools require both an OAuth permission and a Checkly account role:
48+
49+
| Tool or action | Additional account access required |
50+
| --- | --- |
51+
| `invite-account-member` | Owner or Admin |
52+
| `create-account-environment-variable` | Write access |
53+
| `update-account-environment-variable` | Write access |
54+
| `trigger-checks` | Run access |
55+
| `trigger-root-cause-analysis` | Run access |
56+
| Status page incident writes | Access required by the underlying incident action |
57+
58+
## Write-action safety
59+
60+
Some MCP tools create side effects:
61+
62+
- `invite-account-member` sends an invite email and is not idempotent.
63+
- `trigger-checks` consumes check-run execution quota.
64+
- `trigger-root-cause-analysis` consumes RCA invocation quota.
65+
- `create-status-page-incident`, `update-status-page-incident`, and `resolve-status-page-incident` can notify subscribers and are not idempotent.
66+
- Environment variable write tools can create or replace account-level variables and secrets.
67+
68+
Review write tool calls in your MCP client before approving them.
69+
70+
## Secrets
71+
72+
MCP read tools never reveal Checkly secret values. Secret values are returned as `null`.
73+
74+
When you create or update a secret through MCP, Checkly encrypts the value and does not echo it back in the tool response.

0 commit comments

Comments
 (0)