secure-github-ops
Provides tools for managing GitHub issues, pull requests, and comments with an approval workflow for safe automation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@secure-github-ops create an issue in myorg/myrepo titled 'Fix login bug'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Secure GitHub Ops MCP Server
Created by Aaron Murillo
An MCP server that makes GitHub automation actually safe. Every write operation needs approval before it runs, so you never have to worry about runaway scripts creating 100 issues while you're grabbing coffee.
What This Does
You know how most automation just... does stuff immediately? This flips that. When you (or an AI) try to create an issue, open a PR, or add a comment, it goes into a pending queue. Then someone with admin access reviews and approves it. Only then does it actually hit GitHub.
Two roles:
Operators can request actions
Admins can approve, deny, and see what's pending
Everything gets logged so you have a full audit trail.
Related MCP server: GitHub MCP Server
Getting Started
You'll need Node 18+ and a GitHub token.
cd secure-github-ops
npm install
cp .env.example .envOpen .env and fill in your stuff:
GITHUB_TOKEN=ghp_your_token_here
ADMIN_API_KEYS=some-secret-admin-key
OPERATOR_API_KEYS=some-secret-operator-keyThen run it:
npm run build
npm startFor dev mode with hot reload:
npm run devUsing with Claude Desktop
Add this to your Claude Desktop config:
{
"mcpServers": {
"secure-github-ops": {
"command": "node",
"args": ["/path/to/secure-github-ops/dist/index.js"],
"env": {
"GITHUB_TOKEN": "ghp_your_token",
"ADMIN_API_KEYS": "your-admin-key",
"OPERATOR_API_KEYS": "your-operator-key"
}
}
}
}The Tools
For operators and admins:
github.issues.create - request to create an issue
github.pr.open - request to open a PR
github.comment.add - request to add a comment
Admin only:
admin.approve_action - approve and run a pending action
admin.deny_action - reject a pending action
admin.list_pending_actions - see what's waiting
How It Works
Say an operator wants to create an issue:
// Operator requests it
{
"tool": "github.issues.create",
"arguments": {
"_authToken": "operator-key",
"owner": "myorg",
"repo": "myrepo",
"title": "Fix the login bug"
}
}
// Returns a pending action with an IDNothing happened on GitHub yet. Now an admin checks what's pending:
{
"tool": "admin.list_pending_actions",
"arguments": { "_authToken": "admin-key" }
}
// Shows the pending issue requestAdmin approves it:
{
"tool": "admin.approve_action",
"arguments": {
"_authToken": "admin-key",
"actionId": "the-uuid-from-before"
}
}
// NOW the issue gets createdConfig Options
GITHUB_TOKEN (required) - Your GitHub PAT with repo access
ADMIN_API_KEYS (required) - Comma-separated admin keys
OPERATOR_API_KEYS (optional) - Comma-separated operator keys
ALLOWED_REPOS (optional) - Lock it down to specific repos like owner/repo1,owner/repo2
LOG_LEVEL (optional) - debug, info, warn, error
About the STDIO Transport
This uses STDIO, which means it talks through stdin/stdout. All the logs go to stderr so they don't mess with the protocol. If you're wondering why there's no console.log anywhere, that's why.
Want HTTP instead? That's on the roadmap. The core code stays the same, just swap the transport.
Running Tests
npm test26 tests covering auth, config, and the pending store.
Docker
docker build -t secure-github-ops .
docker run -e GITHUB_TOKEN=... -e ADMIN_API_KEYS=... secure-github-opsWhat's Next
Eventually adding HTTP transport so you can host this as a service. Also thinking about persistent storage for the pending actions (right now they live in memory).
Available Tools
6 toolsadmin.approve_actionA
Approve and execute a pending action (v1.0.0). Admin role required. This is the ONLY way to execute GitHub write operations.
Inputs: actionId (required).
admin.deny_actionA
Deny a pending action (v1.0.0). Admin role required.
Inputs: actionId (required), reason.
admin.list_pending_actionsB
List pending actions (v1.0.0). Admin role required.
Inputs: status, tool.
github.comment.addA
Add a comment to a GitHub issue or pull request (v1.0.0). Creates a pending action that requires admin approval.
Inputs: owner (required), repo (required), issueNumber (required), body (required).
github.issues.createA
Create a GitHub issue (v1.0.0). Creates a pending action that requires admin approval before executing.
Inputs: owner (required), repo (required), title (required), body, +2 more.
github.pr.openA
Open a GitHub pull request (v1.0.0). Creates a pending action that requires admin approval before executing.
Inputs: owner (required), repo (required), title (required), head (required), +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool has a distinct purpose: admin tools handle approval/denial/pending, while github tools target unique actions (comment, create issue, open PR). No overlap exists.
Tool names follow a domain.subdomain.action pattern, but admin tools use verb_noun (e.g., approve_action) while github tools use noun.verb (e.g., comment.add) and an abbreviation (pr.open). This minor inconsistency is manageable.
6 tools is well-scoped for a secure approval workflow with limited GitHub write operations. Each tool serves a necessary role without bloat.
The set covers creation and commenting but lacks update, delete, or merge operations for GitHub resources. Admin tools are complete for approval, but the overall surface feels incomplete for typical GitHub write needs.
Related MCP Connectors
Preventive human-approval write-gate for AI agents: writes commit only after a human approves.
Freeze and unfreeze merges across a GitHub organization, with an audit trail.
Set up human approval for your AI agents' tool calls.
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables controlled AI-agent access to enterprise-shaped tools with a deny-by-default gated write path, human approval, dry-run execution, and append-only audit logging.1-
- AlicenseNot gradedqualityCmaintenanceSecurely connects LLMs to the GitHub API, enabling safe retrieval of repositories, issues, and pull requests while requiring human approval for staged write actions.ISC
- FlicenseNot gradedqualityCmaintenanceEnables AI coding agents to request bounded GitHub changes through a default-deny policy, independent human approval, one-time execution with a GitHub App credential, and verifiable receipts.1-
- AlicenseBqualityCmaintenanceEnables AI agents to safely manage GitHub issues, inspect discussions, create pull requests, and audit GitHub Actions CI status through strict branch-protection guards.61MIT