MCP
Incarna 通过 HTTP 讲 Model Context Protocol。把一个 agent 运行时指向一个 URL, REST API 里的每一项能力都会变成一个工具 —— 一共二十三个。
https://api.incarna.io/mcp
传输方式是 streamable HTTP,无状态。无状态是刻意的:API 跑在负载均衡器后面, 一个绑定在某个实例内存里的会话,会在第二个实例出现的那一刻就坏掉 —— 而且是间歇性地坏,这是最糟糕的坏法。
本页是工具参考。至于真正要写进 Claude Code、Codex、Hermes、OpenClaw 或 Franklin 的配置 —— 它们各自想要不同格式的不同文件 —— 见 在你的 agent 里使用。
连接
两个值,不管你的客户端怎么问:上面那个 URL,以及 Authorization 头里的一个静态 bearer 令牌。
没有要登录的 OAuth 流程,也没有需要保活的会话。
只接受 API 密钥。 控制台的会话路径在这里不被接受 —— 那条路径是一份由浏览器层持有的共享密钥,而 MCP 的调用方是程序, 应当携带一份可以被单独撤销的凭据。
组织身份在每一次调用时都从 bearer 令牌重新解析,从不缓存。 一个进程服务所有客户,所以缓存第一个调用方的组织,就等于把他们的 agent 交给之后的每一个人 —— 而且每一个响应看起来都还是对的。
验证连接
curl -X POST https://api.incarna.io/mcp/ \
-H "Authorization: Bearer $INCARNA_KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
响应可能是 JSON,也可能是单事件的 SSE 流;两者都合法,客户端应当都能处理。
tools/list 不需要密钥就能回答 —— 一份目录不是客户数据。而每一次工具调用都要认证,
没有密钥、或密钥无效的调用会被拒绝,而不是被塞给环境里的默认组织。
因此一个没有配置该请求头的客户端,会显示出完整的工具列表,然后在第一次使用时失败。
工具
身体
| 工具 | 参数 |
|---|---|
create_agent |
name, region="us", device="auto", direction="" |
list_agents |
— |
get_agent |
agent_id |
delete_agent |
agent_id |
参考
| 工具 | 参数 |
|---|---|
list_countries |
— |
list_devices |
— |
绑定账号
通过平台自己的授权页,绑定客户拥有的账号。connect_account 是少数几个
你无法独自据其行动的工具之一 —— 只有一个已登录的人能批准这项授权。
见绑定账号。
| 工具 | 参数 |
|---|---|
list_connectable_platforms |
— |
connect_account |
agent_id, platform |
connection_status |
connection_id |
list_connections |
agent_id, limit=20 |
unbind_account |
agent_id, account_id |
unbind_account 会在平台提供端点的情况下撤销授权、遗忘凭据,
并把账号释放出来可以再次绑定。它不可逆 ——
重新绑定需要再走一遍授权页 —— 所以 agent 应当先跟它的人确认。
响应里的 revocation 字段会说明平台是否接受了这次撤销,还是仍需在那边手工处理。
邮件
| 工具 | 参数 |
|---|---|
attach_email |
agent_id, address="" |
send_email |
agent_id, to, subject, body |
read_inbox |
agent_id, limit=10 |
X
| 工具 | 参数 |
|---|---|
import_x |
agent_id, handle, auth_token, ct0, login_cookie |
post_tweet |
agent_id, account_id, text |
draft_post |
agent_id, account_id, text |
draft_post 撰写一条帖子并为人类保留,由他们在控制台批准、编辑或丢弃。
它自己不发布任何东西。
你自己的密钥用 post_tweet 直接发布;对你运行的 agent 来说这里什么都没变。
唯一必须走草稿的调用方,是我们 Playground 里的助手 ——
它是在一段对话中代表别人行动的,对它来说 post_tweet 会被拒绝,
因为一张 agent 能绕过去的审批卡片不是审批。
GitHub
| 工具 | 参数 |
|---|---|
attach_github |
agent_id, token, totp_secret="" |
github_totp |
agent_id, account_id |
github_act |
agent_id, account_id, action,以及该动作特有的字段 |
github_act 的动作:post · comment · repo · profile · follow · star。
| 工具 | 参数 |
|---|---|
attach_reddit |
agent_id, client_id, client_secret, username, password |
reddit_act |
agent_id, account_id, action,以及该动作特有的字段 |
reddit_act 的动作:post · comment · vote。
价格
| 工具 | 参数 |
|---|---|
x402_pricing |
— |
x402_quote |
tool |
它们的存在,是为了让一个有预算的 agent 能在行动之前知道价格, 也为了让同样的数字无论通过 MCP 还是普通 HTTP 都能被发现。
{
"enabled": true,
"network": "eip155:84532",
"prices": {
"identity.x.post": "$0.05",
"identity.email.send": "$0.02",
"identity.email.inbox": "$0.01",
"identity.github.act": "$0.05",
"identity.reddit.act": "$0.05"
},
"pay_to": "0xCa1fBb1900e1C17Cc443e34f312720960E72a83F"
}
MCP 的工具调用记在发起它的那把 API 密钥上。无账户、按次付费是 HTTP 那一侧的接口 —— 见 x402。
stdio
本地开发时同一个 server 也能跑在 stdio 上,服务 INCARNA_API_KEY 所属的那一个组织:
cd apps/api && INCARNA_API_KEY=ik_live_... python3 -m incarna.mcp_server
设置 INCARNA_AUTH_DISABLED=1 可以不带密钥使用默认组织。仅限本地 ——
它会移除租户隔离。