Put your coding agent behind Anlyon
Claude Code and Cursor do real work in GitHub and your database. Give them named actions instead of your tokens: a merge or a migration waits for a person, and every call leaves a receipt.
- 1action_github-get-pull-request
- 2action_github-merge-pull-request
- approval apr_… pending
- 3wait_for_approval
- approved, request as reviewed
- merged, read back: confirmed
Your coding agent holds a token that can do everything. A wrong turn runs with all of it.
To work in GitHub or a database, the agent needs a credential in its environment, where any tool it runs can read it. Text in an issue, a file or a web page reaches the same agent. Nothing between the model and the API asks whether this merge or this query should run.
Without Anlyon
A merge nobody reviewed
A comment tells the agent the checks are fine. GitHub sees a valid token and a valid request.
A query against the wrong database
The connection string in its environment decides what it reaches. Run a drop against it and the rows are gone.
No record of who allowed it
Afterwards you have a commit and a shell history. You can't say what was asked for, who said yes, or what came back.
One turn of the agent. The read runs. The merge waits for a person.
The agent sees your actions as tools. A gated call sends nothing until an approver decides, and the request that runs is the one they reviewed.
list_actionsLists the actions you allow and says which need approval.
runsaction_github-get-pull-requestA read. It changes nothing, so it comes straight back.
runsaction_github-merge-pull-requestGated by your rule, so nothing is sent. The tool answers: Awaiting human approval. Call wait_for_approval with approvalId=apr_...
waitswait_for_approvalHolds up to 120 seconds a call. An approver decides in Slack, in the console or from their own connection, and never the connection that asked.
waitsstatus: approvedAnlyon ran the exact request that was reviewed. If it is denied or expires, nothing was sent.
ran
In GitHub
From the GitHub pack. These writes are read back from GitHub.
action_github-create-pull-requestRuns under a limitaction_github-merge-pull-requestWaits for approvalaction_github-close-issueWaits for approval
In your database
From the remote MCP server in front of it, registered here as db. A tool you skip does not exist for the agent.
action_db-list_tablesRunsaction_db-run_migrationWaits for approvaldrop_tableNot adopted
What the merge leaves behind. A receipt, graded by what GitHub says now.
After the merge, Anlyon reads the pull request back. The grade is confirmed only when GitHub reports it merged at the commit it returned. See every call in the console, or with anlyon effects list.
{ "id": "inv_01JABCDEF", "actionName": "github-merge-pull-request", "actionVersionId": "acv_01JABCDEF", "status": "succeeded", "grade": "confirmed", "effectId": "eff_01JABCDEF", "endUserId": null, "responseStatus": 200, "approvalId": "apr_01JABCDEF", "error": null, "retryOf": null}Why it pays. Less risk, less cost, less effort.
Less risk
The token stays with Anlyon, so nothing in the agent's environment can leak it. The calls you mark wait for an approver, and the connection that asked can never decide.
Less cost
No MCP server of your own to host, patch and wire to each provider's API. One address serves every action you allow.
Less effort
Your agent can run the setup itself, and anything that loosens a rule waits for a person.
Set it up. Or paste one line into the agent.
Anlyon governs the calls routed through it, so once it is connected, take the GitHub token and the database URL out of the agent's environment. That leaves this as its only way in.
# Your agent can run this, and follow what it printsnpx @anlyonhq/cli init# Or by hand: connect GitHubanlyon connections add github --secret GITHUB# In the console, open Integrations, then GitHub, and switch on# get-pull-request and merge-pull-request. Approval rules install# turned off: turn on "github: approve merging a pull request".# Then give it to Claude Codeclaude mcp add --transport http anlyon https://api.anlyon.com/mcp# Cursor: .cursor/mcp.json{ "mcpServers": { "anlyon": { "url": "https://api.anlyon.com/mcp" } } }Go deeper
