synauth-mcp
Enables biometric-approval-gated API calls to DigitalOcean with credentials stored securely in the SynAuth vault.
Enables biometric-approval-gated API calls to GitHub with credentials stored securely in the SynAuth vault.
Enables biometric-approval-gated API calls to OpenAI with credentials stored securely in the SynAuth vault.
Enables biometric-approval-gated API calls to Stripe with credentials stored securely in the SynAuth vault.
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., "@synauth-mcp approve sending an email to the team about the meeting"
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.
SynAuth MCP Server
Biometric authorization for AI agent actions. Every sensitive action your AI agent takes — sending emails, making purchases, accessing data, signing contracts — goes through Face ID verification on your iPhone.
This is the MCP (Model Context Protocol) server. It works with Claude, Cursor, and any MCP-compatible agent. For direct Python integration, see the SynAuth SDK.
Install
pip install synauth-mcpRelated MCP server: io.github.oleg-vdv/kepil
Configure
Add to your Claude configuration (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"synauth": {
"command": "synauth-mcp",
"env": {
"SYNAUTH_API_KEY": "aa_your_key_here"
}
}
}
}Restart Claude. The agent now has access to SynAuth tools.
Setup: From Zero to First Approval
1. Get the SynAuth iOS app. Download from the App Store. Create an account.
2. Get your API key. The app generates an API key when you create your account. Copy it — this is what connects your agent to your phone.
3. Configure your agent. Add the MCP config above with your API key.
4. (Optional) Store credentials in the vault. In the SynAuth app, go to the Vault tab and add your API credentials (OpenAI, GitHub, Stripe, etc.). This enables the vault execution model — your agent can use these services without ever seeing the keys.
5. Try it. Ask your agent to do something that requires approval — "send an email to team@company.com" or "check my OpenAI usage." Your iPhone will light up with a Face ID prompt.
How It Works
Your Agent (Claude, Cursor, etc.)
│
├─ request_approval("Send email to team@co.com")
│ │
│ ▼
│ SynAuth Backend ──── push notification ───▶ iPhone
│ │ │
│ │ Face ID ✓
│ │ │
│ ◀──────────── approved ──────────────────┘
│
├─ (Approval-only mode) Agent executes the action itself
│
└─ (Vault mode) execute_api_call("openai", "POST", "https://api.openai.com/...")
│
▼
SynAuth injects stored credential, makes the API call
│
▼
Response returned to agent (agent never saw the API key)There are two modes:
Approval-only — The agent asks permission, then acts with its own credentials. Good for actions where the agent already has access but needs human sign-off.
Vault execution — The agent asks permission, then SynAuth executes using stored credentials. The agent never touches the real API keys. This is structural enforcement — the agent can't bypass what it can't access.
Why This Exists
Most agent approval systems work like this: agent has your API keys, agent asks "can I use them?", you click a button in Slack. If the agent ignores the answer — or if someone else clicks the button — it still has the keys.
SynAuth works differently:
Face ID, not buttons. Proves the authorized person approved it — not just someone with Slack access.
Vault execution. The agent doesn't have your API keys. SynAuth does. After biometric approval, SynAuth makes the API call and returns the result. The agent gets the output without ever seeing the credential.
Audit trail with identity proof. Every action is logged with biometric verification — not a click timestamp.
SynAuth | Slack/Email Buttons | |
Verification | Face ID (biometric) | Click a button (anyone with access) |
Credential safety | Agent never sees keys | Agent often has direct key access |
Audit trail | Every action logged with biometric proof | Click timestamp at best |
Compliance | Proves physical identity of approver | Proves someone had Slack access |
Usage Examples
Approve an email
Your agent decides to send an email. It requests approval, waits for your Face ID, then proceeds:
Agent: I'll send the quarterly report to investors@company.com.
Let me get approval first.
→ request_approval(
action_type: "communication",
title: "Send quarterly report to investors@company.com",
description: "Q4 2025 financial results and outlook",
risk_level: "low"
)
← { "id": "req_abc123", "status": "pending" }
→ wait_for_approval(request_id: "req_abc123")
[Your iPhone buzzes. You glance, see "Send quarterly report
to investors@company.com", verify with Face ID.]
← { "id": "req_abc123", "status": "approved", "resolved_by": "face_id" }
Agent: Approved. Sending now.Make a purchase (with spending limits)
Before buying something, the agent checks spending limits, then requests approval:
Agent: You asked me to buy DigitalOcean credits. Let me check the budget.
→ get_spending_summary()
← { "summaries": [
{ "period": "monthly", "limit": 500.00, "spent": 120.00,
"remaining": 380.00, "utilization_pct": 24.0 }
] }
Agent: You have $380 remaining this month. Requesting approval for $49.99.
→ request_approval(
action_type: "purchase",
title: "Purchase DigitalOcean credits",
amount: 49.99,
recipient: "DigitalOcean",
risk_level: "medium"
)
→ wait_for_approval(request_id: "req_def456")
[Face ID prompt on your iPhone shows: "Purchase DigitalOcean
credits — $49.99"]
← { "status": "approved" }Call an API through the vault
This is the key differentiator. Your agent needs to call the GitHub API, but it doesn't have your GitHub token — SynAuth does:
Agent: I'll create the repository. Let me check what services
are available.
→ list_vault_services()
← { "services": [
{ "service_name": "github", "auth_type": "bearer",
"allowed_hosts": ["api.github.com"] },
{ "service_name": "openai", "auth_type": "bearer",
"allowed_hosts": ["api.openai.com"] }
] }
→ execute_api_call(
service_name: "github",
method: "POST",
url: "https://api.github.com/user/repos",
headers: { "Content-Type": "application/json" },
body: '{"name": "new-project", "private": true}',
description: "Create private repo 'new-project' on GitHub"
)
[Face ID prompt: "Create private repo 'new-project' on GitHub"]
← { "status": "approved", "response": { "status_code": 201, ... } }The agent provided the request details. SynAuth showed you what it wanted to do. You verified with Face ID. SynAuth injected your GitHub token and made the API call. The agent got the response but never saw the token.
Security properties of vault execution:
URL host validation — The GitHub token can only be sent to
api.github.com. If the agent tries to send it elsewhere, the request is rejected.Single-use — Each approval authorizes exactly one API call. The agent can't reuse an old approval.
Credential isolation — The agent's environment has only a SynAuth API key. No GitHub tokens, no OpenAI keys, no Stripe secrets.
Review past actions
→ get_approval_history(limit: 5)
← { "actions": [
{ "title": "Send quarterly report", "status": "approved",
"resolved_at": "2025-02-18T10:30:00Z" },
{ "title": "Purchase DigitalOcean credits", "status": "approved",
"amount": 49.99, "resolved_at": "2025-02-18T10:15:00Z" },
{ "title": "Post to Twitter", "status": "denied",
"deny_reason": "Content needs review" }
] }Available Tools
Tool | What it does |
| Submit any action for biometric approval. Returns immediately with status. |
| Check current status of a pending request. |
| Block until the request is approved, denied, or expired. |
| Check spending against configured limits before making purchases. |
| Review past approved, denied, and expired actions. |
| See which API credentials are stored in the vault. |
| Make an API call through the vault — biometric approval + credential injection. |
Rules Engine
Not every action needs a Face ID prompt. SynAuth has a rules engine that can auto-approve or auto-deny based on:
Action type — Auto-approve low-risk scheduling, require approval for legal actions
Risk level — Low-risk actions auto-approve, critical actions always require Face ID
Amount — Purchases under $10 auto-approve, over $100 require approval
Agent ID — Different rules for different agents
You configure rules in the iOS app. The agent doesn't need to know about rules — it just calls request_approval and gets back either "status": "approved" (auto-approved by rule) or "status": "pending" (waiting for Face ID).
Action Types
Type | Examples | Default Risk |
| Emails, messages, notifications | low |
| Buying, subscriptions, payments | medium |
| Bookings, reservations, calendar | low |
| Contracts, terms, agreements | critical |
| Database queries, file downloads | high |
| Social media posts, profile updates | medium |
| Config changes, restarts, deployments | high |
Environment Variables
Variable | Required | Default | Description |
| Yes | — | Your SynAuth API key (starts with |
| No |
| Backend URL (override for self-hosted) |
Also Available
synauth — Python SDK for direct integration (convenience methods, typed errors, spending limits)
SynAuth iOS App — Face ID approval on your iPhone
REST API —
https://synauth.fly.dev/api/v1/for any language
License
MIT
Available Tools
7 toolscheck_approvalA
Check the status of an approval request.
Returns the current status (pending, approved, denied, expired) and full details including timestamps, resolution method, and any deny reason.
Use this after request_approval to see if the human has responded.
Inputs: request_id (required).
execute_api_callA
Make an API call using a credential stored in SynAuth's vault.
This is the core structural enforcement tool: the agent provides the request details, SynAuth requests biometric approval, then executes the call with the stored credential. The agent never sees the raw API key or token.
Flow:
You provide: service name, HTTP method, URL, optional headers and body
SynAuth sends a push notification to the user's iPhone
User approves via Face ID
SynAuth injects the stored credential and makes the HTTP request
Response is returned to you
The URL must match one of the service's allowed hosts (security: prevents credential exfiltration). Each approval is single-use — you cannot re-execute the same approved request.
Example: Call OpenAI API service_name: "openai" method: "POST" url: "https://api.openai.com/v1/chat/completions" headers: {"Content-Type": "application/json"} body: '{"model": "gpt-4", "messages": [{"role": "user", "content": "Hello"}]}'
Inputs: service_name (required), method (required), url (required), headers, +3 more.
get_approval_historyA
Get history of resolved approval requests.
Returns past approved, denied, and expired requests. Useful for reviewing what actions have been taken and their outcomes.
Inputs: limit, action_type.
get_spending_summaryA
Check your current spending against configured limits.
Returns all spending limits that apply to you (agent-specific and global limits), with your current spend, remaining budget, and utilization percentage for each.
Use this BEFORE making purchases or other monetary actions to check if you have budget remaining. This prevents hitting spending limit denials.
Each summary includes: limit_id, period (daily/weekly/monthly), limit amount, spent amount, remaining amount, and utilization percentage.
Inputs: no named parameters.
list_vault_servicesA
List available vault services (stored API credentials).
Shows which services have credentials stored in SynAuth's vault. Each service has allowed hosts that restrict where credentials can be sent. The agent never sees the actual credential values — only service names and metadata.
Use this to discover what API services are available before calling execute_api_call.
Inputs: no named parameters.
request_approvalA
Request human approval for an AI agent action via Face ID.
Submit any action (email, purchase, booking, contract, data access, social post, system change) for biometric verification by the authorized human. Returns immediately with request ID and initial status — the action may be auto-approved/denied by rules, or pending human review.
Action types: communication, purchase, scheduling, legal, data_access, social, system Risk levels: low, medium, high, critical
Example: Request approval to send an email action_type: "communication" title: "Send quarterly report to john@company.com" risk_level: "low"
Example: Request approval for a $500 purchase action_type: "purchase" title: "Purchase cloud hosting credits" amount: 500.00 risk_level: "medium"
Inputs: action_type (required), title (required), description, risk_level, +6 more.
wait_for_approvalA
Wait for an approval request to be resolved.
Polls the backend until the request is approved, denied, or expired. Returns the final status. Use this when you need to block until the human responds.
Default timeout is 120 seconds with 3-second polling intervals.
Inputs: request_id (required), timeout_seconds, poll_interval.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool has a distinct purpose: requesting approval, checking status, waiting, viewing history, listing services, executing API calls, and checking spending. No overlaps.
All tools use consistent verb_noun snake_case naming (e.g., check_approval, execute_api_call, list_vault_services).
7 tools cover the core functionality of a credential/approval system without being excessive or insufficient.
Covers the main approval lifecycle and API execution flow. Minor gap: no tool to list pending approvals or cancel requests, but core workflows are supported.
Maintenance
Related MCP Connectors
Human approval for irreversible AI agent actions, bound to the exact tool call by a passkey tap
Governed access to sensitive data, secrets and APIs for AI agents. A signed proof for each decision.
1Password vault for AI agents with scoped, user-approved access
Give your AI hands. Identity, credential vault, and API gateway for autonomous agents.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to make authenticated API calls and run commands with secrets injected, while keeping credentials completely hidden from the model, with policy enforcement, grants, and audit logging.6MIT
- AlicenseBqualityBmaintenanceEnables AI agents to execute actions under an accountability layer with identity passports, mandates, a permission gate, and a tamper-evident journal, while requiring human confirmation for irreversible operations.747 PyPI5AGPL 3.0
- AlicenseAqualityCmaintenanceEnables AI agents to securely manage local credentials, obtain short-lived tokens for authenticated API access, and audit every use by purpose.9MIT
- AlicenseAqualityBmaintenanceEnables AI agents to look up stored logins by URL, name, or alias and use them without seeing the secrets, injecting authentication into HTTP requests, running commands with credentials in the environment and scrubbed output, and fetching 2FA codes, subject to per-credential policies and user approval.23MIT