企业 AI 基地主机,用于安全访问 AI API 和 MCP,具有统一代理、RBAC、审计日志、速率限制和成本跟踪,适用于 OpenAI、Anthropic、
企业 AI 基地主机,用于安全访问 AI API 和 MCP,具有统一代理、RBAC、审计日志、速率限制和成本跟踪,适用于 OpenAI、Anthropic、
The enterprise-grade secure gateway for AI. Secure, audit, and govern every AI API call and MCP tool invocation across your organization — from a single control plane.
Just as an SSH secure gateway is the single gateway through which all server access must flow, ThinkWatch is the single gateway through which all AI access must flow. Every model request. Every tool call. Every token. Authenticated, authorized, rate-limited, logged, and accounted for.
…As AI agents proliferate across engineering teams, organizations face a growing governance challenge:
.env files, shared in Slack, rotated neverThinkWatch solves all of this with a single deployment.
/v1/chat/completions), Anthropic Messages (/v1/messages), and OpenAI Responses (/v1/responses) APIs on a single port; works as a drop-in replacement for Cursor, Continue, Cline, Claude Code, and the OpenAI/Anthropic SDKsgpt-/o1-/o3-/o4- for OpenAI, claude- for Anthropic, gemini- for Google) route automatically; Azure and Bedrock require explicit model registrationtw- keys; the same tw- token works on both the AI gateway and the MCP gateway via a per-key surfaces allowlistinput_multiplier / output_multiplierThinkWatch's MCP gateway is built on a single design choice that most MCP proxies skip: the upstream server sees the real end user, not a shared service account. Every other capability follows from that. See MCP Gateway: how we compare below.
mcp_user_credentials. Most "MCP gateways" pin one shared admin token to the server config — so the upstream's audit log shows every action as the same service account. ThinkWatch propagates real identity end to end.tw- keys to different upstream accounts on the same server. Your Cursor key uses your personal GitHub; the CI key uses the service-bot. One user, multiple agents, multiple identities — without re-issuing credentials.WWW-Authenticate from a JSON-RPC initialize, follows the resource_metadata hint, fetches AS metadata at the path-aware well-known location, and runs Dynamic Client Registration if the upstream advertises it. When DCR isn't supported the UI shows three concrete next steps (copy callback URL → register app upstream → paste Client ID back) with no protocol jargon.token_endpoint_auth_methods_supported: ["none"] and propagates is_public_client end to end. The Client Secret input is hidden for issuers like Feishu that don't use one.tools/list is cached in mcp_user_tools and only ever returned to that user. The system-level mcp_tools catalog only stores anonymous-discoverable tools. No cross-user leakage; auth-required servers are no longer "0 tools" until someone manually fixes it./connections shows real upstream identities (@octocat, [email protected], Slack Bob). Resolver tries JWT decode (free) → userinfo endpoint (priority-ranked extractor: preferred_username → sub → accountId → login → email) → .well-known discovery. Pre-seeded for GitHub, Notion, Slack, Atlassian, Cloudflare, GitLab, Discord, Google._meta: { requires_user_auth: true, server_id, server_name, authorize_url }. tools/call against an unauthorized server returns JSON-RPC error code -32050 with the authorize URL, so Cursor / Claude Desktop / any compliant MCP client can prompt the user to authorize without the gateway hiding the catalog.allowed_mcp_tools allowlist on the API-key side (bounded by the issuing role's grants). A locked-down service key can hold exactly two tools and nothing else.mcp:connect permission — gates the /connections page and authorize/revoke flow. Granted to admin / team_manager / developer by default.(user, account_label) — MCP response cache never serves Alice's authorized response to Bob. Direct-mode (no per-user creds) servers still get global caching.pg_advisory_xact_lock keyed by (server, user, label) so concurrent tool calls don't race two refresh attempts. Terminal refresh failure purges the row so the next call cleanly surfaces NeedsUserCredentials.auth_required (amber), not disconnected (red). The /mcp/servers list shows "—" tool count with a hover tooltip for that state.github__create_issue, postgres__query — no tool name collisions across upstreams.tw- virtual key works on both /v1/chat/completions and /mcp via a per-key surfaces allowlist (ai_gateway, mcp_gateway, or both).Most "MCP gateways" available today are thin reverse proxies: one shared admin token per upstream, no end-user identity, and "auth" means "did this user pass the gateway's bearer token". That model works for hobby setups and breaks the moment a real organization plugs it into GitHub / Atlassian / Linear / Slack — every tool call shows up as the same service account, scopes can't differ per user, and there's no honest answer to "who renamed this Linear ticket?".
ThinkWatch is built for the second case.
| Capability | Typical MCP proxy | ThinkWatch |
|---|---|---|
| Upstream sees the real user | ❌ shared admin token / env var | ✅ per-user OAuth tokens + PAT vault, AES-256-GCM encrypted at rest |
| Multi-account per user | ❌ one config = one identity | ✅ work + personal accounts, labelled, default + named |
| API key → account binding | ❌ keys are opaque | ✅ Cursor → personal, cron → service-bot, all on the same user |
| OAuth onboarding | ❌ hand-edit JSON / env | ✅ paste URL, one-click DCR (RFC 9728 → 8414 → 7591), public-client support |
| Per-user tool visibility | ❌ assumes uniform catalog (privilege-escalation if cached) | ✅ separate mcp_user_tools per user, system catalog only holds anonymous-discoverable tools |
| Generic MCP client UX (Cursor/Claude Desktop) | ❌ unauthorized = blank list | ✅ catalog returned with _meta.requires_user_auth markers + -32050 with authorize_url |
| Tool-level RBAC | ❌ all-or-nothing | ✅ per-role grants + per-key allowed_mcp_tools allowlist bounded by role |
| Built-in catalog | ❌ DIY everything | ✅ 23+ templates seeded (GitHub / Notion / Linear / Slack / Atlassian / Cloudflare / GitLab / Discord / Google / Feishu …) |
| Audit / rate limits / budgets | ❌ LLM-only or absent | ✅ same engine meters AI tokens AND MCP tool calls |
| Response cache safety | ❌ shared cache leaks across users | ✅ scoped by (user, account_label) for OAuth/PAT servers |
| OAuth refresh races | ❌ duplicate refresh attempts under concurrency | ✅ pg_advisory_xact_lock per (server, user, label) |
| Health classification | ❌ 401/403 = "unhealthy" (false alarms) | ✅ auth_required is a first-class amber state |
| SSRF protection | ❌ raw fetcher | ✅ injected URL validator, private/link-local/metadata IPs rejected |
| One key, two surfaces | ❌ separate stacks for AI vs MCP | ✅ single tw- key, per-key surfaces allowlist |
If your only requirement is "expose a few public MCP servers to a small team", the simple proxies do fine. The moment you need who did what, on whose behalf, with what scopes, billed to which cost center — ThinkWatch is the design point.
暂无开放 Issues,或尚未同步最近议题。