请勿输入个人信息,例如客户的姓名。
连接 AI 代理(MCP)
通过 MCP 将 Claude、ChatGPT、Cursor 或您自己的代理连接到企业工作区,让它根据客户的文件准备 DS-160 表单并发送客户链接。本文介绍如何用 API 密钥或 OAuth 连接、每个权限范围允许做什么,以及代理启动的运行为何总在签署前停下。
移民事务所自己的 AI 代理可以通过 MCP(Model Context Protocol,模型上下文协议)在其 DS160.io 工作区中工作。代理可以根据客户的文件或邮件创建表单、填入它找到的回答、检查还缺少什么,并向客户发送链接以补全其余内容。之后,您的员工自行检查申请,并在 CEAC 上签名。
代理连接到一个企业工作区,只能做您允许它做的事。它能做的每件事,也都是 DS160.io API 的一个端点。
开始之前
- 一个企业工作区。 MCP 仅在企业工作区中可用。
- 所有者或管理员权限。 只有工作区的所有者和管理员可以创建 API 密钥或允许连接。
- 一个 MCP 客户端。 Claude Code、Cursor、VS Code、Codex 和 Windsurf 使用 API 密钥连接。claude.ai 和 ChatGPT 通过登录 DS160.io 连接。
服务器地址是:
https://www.ds160.io/api/mcp
即使您的工作区有自己的域名,也请使用这个地址。
使用 API 密钥连接
- 打开 工作区设置 → 团队与访问 → API 密钥,点击 创建 API 密钥。
- 以代理的名字为密钥命名(例如 Claude Code,录入团队),选择 MCP 预设,然后创建密钥。该预设会勾选除
runs:write之外的所有 scope;取消勾选代理不需要的 scope。 - 复制密钥。它以
ds160_sk_开头,只显示一次。 - 将服务器添加到您的客户端,并在
Authorization头中带上密钥。在 Claude Code 中:
claude mcp add --transport http ds160 https://www.ds160.io/api/mcp --header "Authorization: Bearer ds160_sk_…"
其他客户端在设置中填写相同的地址和头。在 Cursor(.cursor/mcp.json)中:
{
"mcpServers": {
"ds160": {
"url": "https://www.ds160.io/api/mcp",
"headers": { "Authorization": "Bearer ds160_sk_…" }
}
}
}
在 VS Code(.vscode/mcp.json)中,在 "servers" 下添加相同的 url 和 headers,并设置 "type": "http"。不要把密钥写进您提交到版本控制的文件中:如果客户端支持环境变量或密钥输入,请使用它们。
连接 claude.ai 或 ChatGPT
claude.ai 和 ChatGPT 不发送密钥,而是通过登录 DS160.io 来连接:
- 在 claude.ai 或 ChatGPT 中,将
https://www.ds160.io/api/mcp添加为自定义连接器。 - 出现提示时,用您自己的账户登录 DS160.io。
- 选择代理要工作的企业工作区。
- 查看它请求的权限,然后点击允许。
之后,代理会以您的身份在该工作区中操作。您必须是该工作区的所有者或管理员才能允许连接。
Scope:各自允许什么
| Scope | 代理可以做什么 |
|---|---|
forms:read | 列出表单,读取表单的名称和状态,检查还缺少什么,跟踪提交 |
forms:write | 创建表单(并读取) |
forms:clone | 将已有表单复制为新表单 |
client-links:write | 创建发送给申请人的客户链接 |
answers:read | 读取表单的回答 |
answers:write | 写入和删除表单的回答 |
runs:write | 在 CEAC 上启动提交并跟踪进度 |
answers:read 会把申请人的个人数据发送到 DS160.io 之外。 代理读取的姓名、出生日期、护照号、旅行历史以及 DS-160 的所有其他回答,都会交给代理以及运行它的一方,例如 AI 服务提供商。您的工作区作为其客户数据的控制者,决定是否允许这样做,并在这些数据离开 DS160.io 后对其负责(参见 隐私政策 和 数据处理协议)。如果代理只需要填写表单,请不要授予 answers:read:仅有 answers:write 时,它可以写入回答而无法读回。
代理能做什么、不能做什么
- 它可以准备表单:创建表单,根据客户发来的内容填入回答,查看哪些问题仍缺少回答或会被拒绝,并向客户发送链接补全其余内容。
- 它写入的每个回答都会经过检查,方式与表单编辑器相同。除非问题允许英文以外的字母,文本一律以大写保存。不符合要求的回答会被拒绝并附上原因,同一批中的其他回答不受影响。
- 每次更改都有记录。 表单的 字段历史 会把每次更改显示为“API key 名称”(密钥)或“成员 via 代理”(连接)。
- 它不能签名或提交。 代理启动的提交始终会在签名前停止,无论工作区如何设置:由一个人检查申请并在 CEAC 上签名(参见 签名前在 CEAC 上审核 DS-160)。
- 它不能输入 CEAC 的验证码。 验证码由一个人在 DS160.io 中输入,提交会等待;提交会告诉代理何时需要人工、在哪里操作。
- 创建表单会计费,与在应用中创建相同:每创建或克隆一份表单,都计为创建了一份表单。
- 它只能在自己的工作区中工作。 它看不到其他工作区,其他工作区的表单会被报告为未找到。
工具
| 工具 | 作用 | Scope |
|---|---|---|
list_forms | 列出工作区的表单,最新的在前 | forms:read |
get_form | 读取一份表单的名称、状态和同意记录 | forms:read |
create_form | 创建表单(按创建的表单计费) | forms:write |
clone_form | 将表单复制为新表单,可选择省略某些部分 | forms:clone |
create_client_link | 为表单创建客户链接 | client-links:write |
search_docs | 搜索这些文档,每把密钥或每个连接每天 200 次 | 任意 |
describe_form_pages | 列出表单的页面和每个问题:其回答路径、类型、是否必填、下拉框的取值以及各个回答会展开的问题,并给出每种回答类型的 JSON 格式 | 任意 |
get_answers | 读取表单的回答,整份表单或单个页面 | answers:read |
set_answers | 每次调用按顺序写入最多 200 个回答:每个回答被写入、被删除(值为 null)或被拒绝并附上代码和原因 | answers:write |
get_form_progress | 每个部分的状态、尚未回答的必填问题以及按路径列出的问题;以及表单是否已完成 | forms:read、answers:read 或 answers:write |
start_run | 为所选领事馆在 CEAC 上启动提交;在签名前停止 | runs:write |
get_run | 提交的状态、进展摘要、是否需要人工,以及提交的链接 | runs:write 或 forms:read |
撤销访问
- 密钥:在 工作区设置 → 团队与访问 → API 密钥 中撤销。代理的下一次调用会被拒绝。
- 连接(claude.ai、ChatGPT):在 账户与安全 中撤销,或在 工作区设置 中为整个工作区撤销。两处都会列出现有的连接。
如果密钥可能已泄露,或某个代理不再使用,请立即撤销。
让代理只使用申请人提供的信息
DS-160 由申请人签名,申请人声明每个回答都属实。请告诉您的代理只根据申请人提供给您的内容(他们的文件、邮件和回答)作答,绝不猜测或编造回答。不确定时,应让问题保持空白,这样 get_form_progress 会将其显示为缺失,由客户或您的员工回答。在任何人签名之前,请先审核表单。
故障排除
| 问题 | 解决方法 |
|---|---|
客户端提示无法连接,或收到 401 | 检查地址是否为 https://www.ds160.io/api/mcp,头是否为 Authorization: Bearer <secret> 并带有完整的密钥。已撤销的密钥无法再使用:请创建一把新密钥。 |
| 工具提示缺少某个 scope | 该密钥或连接缺少这个 scope。创建一把带有它的密钥(或重新连接并允许它),然后撤销旧的。 |
| 某个回答被拒绝 | 查看其原因。使用 describe_form_pages 获取正确的路径以及下拉框接受的取值。 |
start_run 被拒绝 | get_form_progress 会列出每个部分缺少或有误的内容。补齐后再次启动提交。如果该表单已有提交正在进行,请用 get_run 跟踪它。 |
提交在等待,且 needsPerson 为 true | 由一个人在 DS160.io 中打开提交的链接并输入验证码。提交准备好签名后,由一个人检查申请并在 CEAC 上签名。 |