Skip to main content
Glama

Access

“这是一个相当精巧的小工具。” — 我

偶尔,需要提醒一下代理这个工具的存在。

以下所有内容均由机器人起草。

一个 Bearer 令牌,管理所有服务。

Access 为代理和脚本提供对 OAuth 和 API 密钥支持服务的安全访问,无需直接处理凭据。存储您的密钥、自动刷新令牌、代理请求、审计一切——通过 HTTP 和 MCP 上的一个稳定接口。

flowchart LR
    A[Any MCP client\nor HTTP caller] -->|Bearer token| B["Access\n(Next.js + Postgres)"]
    B -->|OAuth 2.0| C[Google · GitHub · Sentry · Oura]
    B -->|API key| D[HubSpot · Linear · Jira · Stripe\nNotion · Apollo · Cal · Porkbun]
    B -->|Token| E[Slack · Cloudflare · Vercel\nGitLab · AWS]

它能做什么

您可以将所有凭据放入其中——API 密钥、OAuth 令牌、机器人令牌、代理凭据、服务密钥,以及您的代理和脚本所需的任何内容。然后由您决定谁能获得什么。

  • 按代理和按集群分配权限 — 每个代理或组都有自己的令牌,具有作用域访问权限。编码代理可以访问 GitHub 和 Linear。通信代理可以访问 Gmail 和 Slack。运维代理可以访问 AWS。通过管理 UI 进行管理——无需配置文件,无需摆弄 CLI。

  • 加密存储一切 — API 密钥、OAuth 令牌、机器人令牌、代理间凭据、服务密钥。静态存储采用 AES-256-GCM,访问令牌采用 HMAC 哈希。

  • 处理 OAuth — 令牌刷新、授权流程、多账户 Google — 您的代理无需参与。

  • 代理 API 调用 — 对于带有适配器的服务,代理访问 Access 并获取 JSON 返回,而无需看到底层的密钥。

  • 直接提供凭据 — 对于其他所有内容,代理通过 /bootstrap/secrets/by-env/WHATEVER 获取密钥。

  • 记录一切 — 每次密钥访问、每次 API 调用、每次身份验证尝试,都会记录操作者和 IP。

  • 引导会话 — 一次 /bootstrap 调用仅向代理提供其被授权查看的内容——环境变量、文档和上下文。

理想路径: 代理发送 Bearer 令牌 → Access 处理身份验证、刷新和代理 → 代理获取 JSON 或引导包。就是这样。

它看起来是什么样

仪表板 — 一目了然地查看服务、密钥、代理和审计历史:

Dashboard

代理权限分配 — 每个代理都有自己的令牌,具有作用域访问授权:

Agents

代理详情 — 信任级别、令牌前缀、最后使用时间和授权计数:

Agent detail

30 秒示例

# Set once per session (don't paste tokens directly in commands)
export TOKEN="your-token"
export ACCESS="https://your-access-instance"

# Your agent searches Gmail through Access
curl -H "Authorization: Bearer $TOKEN" "$ACCESS/api/v1/google/gmail?action=search&q=from:alice&account=work"

# Or bootstraps an entire session in one call
curl -H "Authorization: Bearer $TOKEN" "$ACCESS/api/v1/bootstrap"

通过 MCP,您的代理可以获得诸如 gmail_searchcalendar_listdrive_list 等工具——无需针对每个服务进行配置,没有过期的令牌,无需凭据管理。

适用人群

适用场景:

  • 在多个会话或机器上运行 AI 代理(Claude Code、Cursor、Gemini CLI、Codex)

  • 多代理设置,其中代理需要其他代理、机器人和内部服务的凭据

  • 自托管的个人或小型团队设置

  • 多服务工作流,其中代理需要 Gmail、Slack、GitHub 等

  • 厌倦了用分散的 .env 文件引导代理会话的任何人

不适用场景:

  • 有合规性要求的企业级密钥管理(请使用 HashiCorp Vault)

  • 有 KMS/HSM 要求的高合规性基础设施

  • 大型团队 IAM 或多租户访问控制

它与密码管理器的区别: 1Password 存储凭据供人类复制粘贴。Access 存储凭据并使用它们——代理 API 调用、刷新 OAuth 令牌、引导代理会话。您的代理永远看不到代理服务的原始密钥。

安全态势

Access 防御的内容:

  • 代理查看或存储原始凭据

  • 过期的 OAuth 令牌导致代理会话中断

  • 跨机器未经审计的凭据访问

  • 数据库中的明文密钥(静态存储采用 AES-256-GCM 加密)

  • 暴力破解令牌猜测(HMAC-SHA256 哈希,恒定时间比较)

Access 不防御的内容:

  • 被入侵的 Access 实例(如果有人获得了您的服务器,他们就获得了一切)

  • 云级密钥管理(尚无 KMS/HSM 集成——请参阅路线图)

  • 多租户隔离(这是一个单所有者系统)

  • 网络级攻击(部署在 HTTPS 之后,使用防火墙)

为什么不直接使用 .env 文件?

  • OAuth 令牌会过期。 Google 访问令牌有效期为 60 分钟。您的代理无法刷新它们——但 Access 可以。

  • 凭据分散。 每个代理会话都需要自己的副本。轮换一个密钥,您就得在 6 个地方更新它。

  • 没有审计追踪。 哪个代理访问了哪个服务?什么时候?从哪里?完全不知道。

  • 引导很痛苦。 每个新会话都从加载环境变量开始,并祈祷没有东西过期。

现有解决方案(以及 Access 的定位)

针对此问题的部分内容已有成熟工具。大多数只解决其中一小部分:

  • 密钥管理器 (1Password CLI, Doppler, Infisical) — 通过 op run / doppler run 在运行时注入静态密钥。非常适合 API 密钥。不处理 OAuth 刷新或 API 代理。

  • 工作负载身份 / OIDC (GitHub Actions OIDC) — 通过证明身份来获取短期凭据,从而完全避免长期密钥。非常适合 CI/CD。对本地代理会话没有帮助。

  • 动态密钥 (Vault dynamic secrets) — 按需生成有时限的凭据。严肃的基础设施。对于大多数代理设置来说过于复杂。

  • OAuth 代理 (Nango, Composio) — 处理 OAuth 授权、令牌存储和刷新。具有自己的仪表板和计费的云原生平台。

成熟的组织将问题拆分到 Vault + OIDC + OAuth 代理 + 内部平台工具中。小型团队使用 1Password/Doppler 处理静态密钥,但在 OAuth 上仍然很痛苦。

Access 将这些层合并为一个自托管应用程序:存储凭据、刷新 OAuth、代理 API 调用、引导代理会话、审计一切。它不如 Vault + KMS 安全,但它是一个整体而不是四个——而且它确实能用。

Access

.env 文件

1Password/Doppler

Nango/Composio

Vault

自托管

不一

云原生

OAuth 刷新

自动

手动

API 代理

部分

MCP 服务器

内置

代理引导

一次调用

手动

审计追踪

不一

复杂度

一个应用

CLI + 云

平台

显著

成本

免费

免费

付费

付费

免费/付费

快速入门

先决条件

  • Node.js 20+

  • PostgreSQL(或使用随附的 Docker Compose)

  • Google Cloud OAuth 应用(如果您需要 Google API 代理)

1. 克隆并安装

git clone https://github.com/Scottpedia0/access.git
cd access
npm install

2. 设置数据库

# Option A: Use Docker Compose
docker compose up -d

# Option B: Use your own Postgres
# Set DATABASE_URL and DIRECT_DATABASE_URL in .env

3. 配置环境变量

cp .env.example .env

# Generate required secrets
openssl rand -base64 32  # -> SECRET_ENCRYPTION_KEY
openssl rand -base64 32  # -> NEXTAUTH_SECRET
openssl rand -base64 32  # -> CONSUMER_TOKEN_HASH_SECRET

使用您的值编辑 .env。至少需要:

  • DATABASE_URL / DIRECT_DATABASE_URL

  • SECRET_ENCRYPTION_KEY

  • NEXTAUTH_SECRET

  • OWNER_EMAILS(允许登录的电子邮件列表,以逗号分隔)

  • 一个身份验证提供程序(Google OAuth、电子邮件魔法链接或所有者密码)

4. 运行迁移和种子数据

npx prisma migrate deploy
npm run db:seed  # Creates example services and a consumer token

5. 启动应用

npm run dev

访问 http://localhost:3000 并使用 OWNER_EMAILS 列表中的电子邮件登录。

6. 安装代理技能 + MCP 配置

bash scripts/install.sh

这将检测您安装的代理工具(Claude Code、Cursor、Gemini CLI、Windsurf、VS Code、Codex),安装健康检查技能,并为您显示每个工具的 MCP 配置。您可以接受或拒绝每一步。

支持的服务

/api/v1/* 下有 27 个服务端点。每个适配器处理身份验证并将请求代理到上游。

Google Workspace (OAuth 2.0, 多账户) — Gmail, Calendar, Drive, Sheets, Docs, Contacts, Analytics, Search Console, Tag Manager, Admin Reports, Profile

开发者工具 — GitHub, GitLab, Linear, Jira, Notion, Sentry, Vercel

商业 — HubSpot, Slack, Stripe (只读), Apollo.io, Cal.com

基础设施 — AWS (S3, EC2, Lambda, CloudWatch — 可选 SDK 依赖), Cloudflare

其他 — Oura Ring, Porkbun

Google 服务支持多账户——通过 GOOGLE_ACCOUNTS 环境变量配置(例如 work:me@company.com,personal:me@gmail.com)。添加新适配器大约需要 100 行代码——请参阅 添加新服务

核心端点

这些不是服务代理——它们是 Access 本身:

端点

功能

GET /api/v1/bootstrap

一次拉取,返回所有作为环境变量的密钥 + 服务元数据 + 文档 + 链接资源。这是代理引导会话的方式。

POST /api/v1/intake

只写端点,用于提交新凭据,而无需读取存储的权限。

GET /api/v1/secrets/by-env/:name

按环境变量名称查找单个解密后的密钥。

GET /api/v1/services/:slug

服务元数据、文档和链接资源。

GET /api/v1/services/:slug/secrets

特定服务的解密密钥。

身份验证

Access 支持三种用于代理身份验证的令牌类型:

令牌类型

作用域

用例

全局代理令牌

完全访问所有服务和密钥

受信任的单操作员设置

消费者令牌

细粒度的按服务或按密钥访问授权

多代理设置,每个代理或集群获得不同的权限

共享摄入令牌

只写凭据提交

让团队成员在没有读取权限的情况下存入密钥

按代理或集群分配权限

消费者令牌允许您按角色细分访问权限。每个消费者都有自己的身份、令牌和作用域授权:

Coding agents (Claude Code, Cursor)  →  GitHub, Linear, Sentry
Comms agents                         →  Gmail, Slack, Calendar
Ops agents                           →  AWS, Cloudflare, Vercel
Intake-only (team members)           →  Write keys, can't read anything

授权在两个级别上工作——整个服务(代理可以看到该服务中的所有内容)或单个密钥(代理只能看到特定密钥)。当代理调用 /bootstrap 时,它只会收到它被授权查看的内容。

# Search Gmail with a global token
curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://localhost:3000/api/v1/google/gmail?action=search&q=from:alice&account=work"

# Bootstrap an agent session — pull only what this token is authorized for
curl -H "Authorization: Bearer YOUR_TOKEN" \
  "http://localhost:3000/api/v1/bootstrap"

管理 UI 的人类身份验证使用 Google OAuth、电子邮件魔法链接或简单的密码——通过环境变量配置。只有 OWNER_EMAILS 中的电子邮件才能登录。

添加新服务

每个代理适配器都是 src/app/api/v1/<service>/route.ts 下的一个 Next.js 路由处理程序。要添加一个:

  1. 创建 src/app/api/v1/your-service/route.ts

  2. 使用 @/lib/access 中的 authenticateRequestActor() 进行身份验证

  3. 从加密存储(通过 Prisma)或环境变量中读取 API 密钥

  4. 将请求代理到上游 API

  5. 返回结果

大多数适配器不到 100 行。请参阅 src/app/api/v1/hubspot/route.ts 获取清晰示例。

代理指令

此仓库中的 AGENTS.md 有两个部分:

  1. 针对在 Access 上开发的代理 — 架构、模式、数据模型、命令

  2. 针对使用 Access 的代理 — 一个可直接粘贴到您的 CLAUDE.md 或代理指令中的块,告诉您的代理如何引导、拉取凭据以及使用代理端点

将“针对使用 Access 的代理”部分复制到您的代理指令文件中,并在您的环境中设置 ACCESS_BASE_URLACCESS_TOKEN

MCP 服务器

Access 包含一个 MCP 服务器 (mcp-server.mjs),通过 stdio 传输公开 Google Workspace 工具。适用于任何兼容 MCP 的客户端。

将以下配置添加到您的客户端。JSON 是相同的——只有文件路径因客户端而异:

客户端

配置位置

Claude Code

~/.claude/mcp.json 或项目 .mcp.json

Cursor

Cursor MCP 设置

Gemini CLI

.gemini/settings.json

Windsurf

Windsurf MCP 设置

VS Code (Copilot)

.vscode/mcp.json (使用 "servers" 而不是 "mcpServers")

Codex / 其他

任何兼容 MCP 的配置

{
  "mcpServers": {
    "access": {
      "command": "node",
      "args": ["/path/to/access/mcp-server.mjs"],
      "env": {
        "ACCESS_BASE_URL": "http://localhost:3000",
        "GLOBAL_AGENT_TOKEN": "your-token-here"
      }
    }
  }
}

VS Code 注意: 使用 "servers" 作为顶级键,而不是 "mcpServers"

连接后,您的代理将获得诸如 gmail_searchcalendar_listdrive_listcontacts_search 等工具——所有这些都通过 Access 进行身份验证。

直接 API (无 MCP)

您不需要 MCP。任何 HTTP 客户端都可以工作:

curl -H "Authorization: Bearer $TOKEN" \
  "http://localhost:3000/api/v1/google/gmail?action=search&q=is:unread"

架构

请求流程

1. Agent sends:     GET /api/v1/google/gmail?action=search&q=from:alice&account=work
                    Authorization: Bearer amb_live_xxxx

2. Middleware:       Rate limit check → Body size check → Pass

3. Auth:            Validate Bearer token (HMAC comparison)
                    Look up consumer permissions or verify global token

4. Proxy:           Load OAuth credentials from Postgres (encrypted)
                    Refresh access token if expired
                    Forward request to Gmail API

5. Response:        Return Gmail results as JSON to agent
                    Log access in audit_events table

设计原则

  • 代理永远看不到凭据。 它们发送 Bearer 令牌,获取 API 结果。

  • OAuth 在服务器端处理。 令牌刷新、授权流程、多账户管理——都在 Access 内部。

  • 一切皆可审计。 每次密钥访问、每次 API 代理调用、每次登录尝试都会记录操作者、时间戳和 IP。

  • 密钥静态加密。 AES-256-GCM,带有版本化负载 (v2.iv.authTag.ciphertext),支持密钥轮换。

  • 消费者令牌使用 HMAC。 恒定时间比较,仅存储前缀——从不存储原始令牌。

  • 无状态代理。 Access 不缓存或存储 API 响应。它是一个直通代理。

安全性

  • 所有存储的密钥均采用 AES-256-GCM 加密

  • HMAC-SHA256 消费者令牌哈希,具有恒定时间比较

  • 所有 API 端点上的 Zod 输入验证

  • 所有访问事件和身份验证失败的审计日志

  • 管理 UI 访问的所有者电子邮件白名单

  • 生产环境中的错误消息绝不会泄露上游详细信息

  • 健康检查端点需要身份验证才能公开库存计数

  • 身份验证和 API 端点上的速率限制(可配置,默认在内存中)

  • 所有变异端点上的请求体大小限制

密钥轮换

Access 支持零停机加密密钥轮换:

# 1. Generate a new key
openssl rand -base64 32

# 2. Set the new key and keep the old one
SECRET_ENCRYPTION_KEY="<new key>"
SECRET_ENCRYPTION_KEY_PREVIOUS="<old key>"

# 3. Re-encrypt all secrets
npx tsx scripts/rotate-keys.ts

# 4. After success, remove the old key
# unset SECRET_ENCRYPTION_KEY_PREVIOUS

该脚本是幂等的——当前密钥上已有的密钥会被跳过。它使用任何有效的密钥(当前或上一个)进行解密,并使用当前密钥重新加密。

安全路线图

  • [ ] 按服务作用域令牌(

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Scottpedia0/access'

If you have feedback or need assistance with the MCP directory API, please join our Discord server