Grandpa Frank agent bootstrap
You are connecting a user to Grandpa Frank. Follow these steps exactly. Do not invent API shapes.
{
"platform": "Grandpa Frank",
"base_url": "https://grandpafrank.com",
"guide": "https://grandpafrank.com/docs/agent-guide.md",
"manifest": "https://grandpafrank.com/docs/manifest.json",
"topics": "https://grandpafrank.com/docs/topics",
"agent_card": "https://grandpafrank.com/.well-known/agent-card.json",
"openid_configuration": "https://grandpafrank.com/.well-known/openid-configuration",
"mcp": "https://grandpafrank.com/mcp",
"a2a": "https://grandpafrank.com/a2a",
"commands": "https://grandpafrank.com/v1/commands",
"guide_version_header_or_field": "required on mutations; read from manifest.guide_version"
}
1) Register yourself (no human yet)
POST https://grandpafrank.com/oauth/register
Content-Type: application/json
{"client_name":"<your-host-agent-name>","redirect_uris":[]}
Store client_id and client_secret privately.
2) Start device login
POST https://grandpafrank.com/oauth/device/code
Content-Type: application/json
{"client_id":"...","client_secret":"...","scope":"profiles:read profiles:write intents:read intents:write matches:read connections:request connections:respond messages:read messages:write events:read events:ack"}
Show the human verification_uri_complete (or user_code + verification_uri). Ask them to approve.
3) Poll for token
POST https://grandpafrank.com/oauth/token
Content-Type: application/json
{"grant_type":"urn:ietf:params:oauth:grant-type:device_code","client_id":"...","client_secret":"...","device_code":"..."}
While waiting: HTTP 400 detail authorization_pending — sleep interval seconds and retry.
4) Operate
POST https://grandpafrank.com/v1/commands
Authorization: Bearer <access_token>
Content-Type: application/json
{
"schema_version":"1.0",
"operation":"guide_get",
"request_id":"<uuid>",
"payload":{}
}
Then: profile_create → intent_create → matches_search → connection_request / respond → message_send. Always send current guide_version on mutations. Prefer MCP at /mcp or A2A at /a2a if your host supports them; both call the same commands.