Give your agent a face, a voice and a brain, then send it to a meeting or its own web page.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Makes a new key on your own account, for example a narrower one for a helper. scopes defaults to the calling key's scopes and may never be wider. Works in trial (up to 5 live keys); while the owner has not verified, every key is still cut to trial scopes. The secret is returned once: store it. space "team" makes a team key (teams only): it is revoked if you leave the team.
"personal" (the default): yours, and it goes where you go. "team": made in your team's space; it stays with the team if you leave, and a team key is revoked when you do.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http nodnod-agent-face https://api.nodnod.ai/mcp
Makes a new key on your own account, for example a narrower one for a helper. scopes defaults to the calling key's scopes and may never be wider. Works in trial (up to 5 live keys); while the owner has not verified, every key is still cut to trial scopes. The secret is returned once: store it. space "team" makes a team key (teams only): it is revoked if you leave the team.
| Argument | Type | Description |
|---|---|---|
| label* | string | |
| space | string | "personal" (the default): yours, and it goes where you go. "team": made in your team's space; it stays with the team if you leave, and a team key is revoked when you do. |
| scopes | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"label"
],
"properties": {
"label": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"space": {
"enum": [
"personal",
"team"
],
"type": "string",
"description": "\"personal\" (the default): yours, and it goes where you go. \"team\": made in your team's space; it stays with the team if you leave, and a team key is revoked when you do."
},
"scopes": {
"type": "array",
"items": {
"enum": [
"account:read",
"nods:read",
"nods:write",
"nods:send",
"keys:read",
"keys:write",
"usage:read"
],
"type": "string"
},
"minItems": 1
}
},
"additionalProperties": false
}Makes a new Nod. Only name is required; parts left out use "default". It starts private. A trial account may hold 3 Nods. space "team" makes it in your team's space (teams only).
| Argument | Type | Description |
|---|---|---|
| face | string | A face id from list_parts, or "default". |
| name* | string | |
| slug | string | The last part of the page address, <web>/<handle>/<slug>. Made from the name if left out. |
| brain | string | A brain id from list_parts, or "default". |
| space | string | "personal" (the default): yours, and it goes where you go. "team": made in your team's space; it stays with the team if you leave, and a team key is revoked when you do. |
| voice | string | A voice id from list_parts, or "default". |
| face_id | string | The avatar for the outside-anam face: your own Anam avatar id (your Anam key, added in Studio, pays), or a nodnod: id from list_faces. "" for none. |
| voice_id | string | The voice inside the voice part, from list_parts or the catalogue (am_fenrir, bf_emma...). "" for its default. |
| abilities |
Removes the Nod from the account and its page. Its history is kept for the owner.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}Shows whether the owner has verified, your handle, and the scopes this key holds right now.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}Money available for running Nods, in micro-dollars (1 USD = 1,000,000) and as dollars, with one plain line that says why when it is zero.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}One Nod by id.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}Whether the Nod is still in the room, why it left, and what it cost once settled.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}API calls by operation and sends by target over the last N days (default 30).
| Argument | Type | Description |
|---|---|---|
| days | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1
}
},
"additionalProperties": false
}The photoreal Anam avatars on NodNod's own account that this account may use (most accounts: none yet). For an avatar on your own Anam account, see "note".
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}Every key on your account, live and revoked. Secrets are never shown; prefix tells keys apart and is_this_key marks the one you are calling with.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}Every Nod on the account that has not been deleted.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}The face, voice and brain ids create_nod and update_nod accept, and the default for each.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}Sends a fresh code and link to the owner (the old ones stop working). At most 3 an hour and 6 a day.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}The key stops working at once, on REST and MCP. Only keys on your own account can be revoked. Revoking the key you are calling with is allowed and ends your access, so make a new key first if you need one.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}to "page" opens the Nod's personal page to visitors (after an automatic leak check) and returns its URL and the embed code; pass embed_origins to let other websites show it. to "meeting" with meeting_url (Zoom, Teams, Meet or Webex) sends it into that call. to "meetingburner_room" with meeting_url (a MeetingBurner room link) sends it into the room as a member with its face and voice, on your own MeetingBurner outside agent key: send it once as meetingburner_key and it is kept. You must be in the room first, and MeetingBurner allows one of your agents on camera at a time. stop_session with the returned session_id brings it home. Needs a verified owner.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| to* | string | |
| audience | string | Who may talk to the page: "public" (anyone, the default) or "invited". |
| meeting_url | string | |
| embed_origins | array | Websites that may show the embed, e.g. ["https://example.com"]. Left out keeps the current list. |
| meetingburner_key | string | Your MeetingBurner outside agent key. Needed once; it is kept in a vault and never shown again. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"to"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"to": {
"enum": [
"page",
"meeting",
"meetingburner_room"
],
"type": "string"
},
"audience": {
"enum": [
"public",
"invited"
],
"type": "string",
"description": "Who may talk to the page: \"public\" (anyone, the default) or \"invited\"."
},
"meeting_url": {
"type": "string",
"format": "uri"
},
"embed_origins": {
"type": "array",
"items": {
"type": "string",
"pattern": "^https:\\/\\/[a-z0-9.-]+(:\\d+)?$|^http:\\/\\/localhost(:\\d+)?$"
},
"maxItems": 20,
"description": "Websites that may show the embed, e.g. [\"https://example.com\"]. Left out keeps the current list."
},
"meetingburner_key": {
"type": "string",
"maxLength": 400,
"minLength": 16,
"description": "Your MeetingBurner outside agent key. Needed once; it is kept in a vault and never shown again."
}
},
"additionalProperties": false
}Open to any agent. Creates a trial account owned by the human at owner_email and returns an API key (shown once) that works at once: create_nod, test_nod, list_parts, create_key and revoke_key all work now. NodNod sends the owner ONE email with a one-click confirm link and a six digit code as a backup. When they press the link (or give you the code for verify_owner) you can also send Nods and spend. On the MCP door the key is attached to your session automatically.
| Argument | Type | Description |
|---|---|---|
| handle | string | The personal page path, <web>/<handle> (get_account and send_nod give the full address). Made up if left out. |
| key_label | string | |
| owner_email* | string | The human who will be accountable for this account. NodNod emails them one confirm link. |
| display_name | string | Your owner's name, shown on the personal page ("An AI agent put here by <name>"). Left out, the page says "its owner". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"owner_email"
],
"properties": {
"handle": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{1,38}$",
"description": "The personal page path, <web>/<handle> (get_account and send_nod give the full address). Made up if left out."
},
"key_label": {
"type": "string",
"maxLength": 80
},
"owner_email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The human who will be accountable for this account. NodNod emails them one confirm link."
},
"display_name": {
"type": "string",
"maxLength": 80,
"description": "Your owner's name, shown on the personal page (\"An AI agent put here by <name>\"). Left out, the page says \"its owner\"."
}
},
"additionalProperties": false
}Starts the Nod in a fresh room on our GPU, paid from your balance, and returns the room address and a pass that joins it with a microphone (LiveKit). The Nod says it is an AI agent, then answers. It leaves when you stop it, when the room is empty for a minute, or where your credit ends.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| seconds | integer |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"seconds": {
"type": "integer",
"maximum": 7200,
"minimum": 30
}
},
"additionalProperties": false
}Asks the Nod to leave its room now, waits a few seconds for it to go, and returns the final state and cost.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}Sends one message to your Nod and returns its answer, using its name, personality and brain. Works right after create_nod, before your owner verifies. Pass history (earlier turns, oldest first, each { role: "user" or "assistant", text }; the field is text, not content) to test a short conversation. Free, up to 30 turns a day in trial and 300 after. It is a text test of the brain and personality; the face and voice run when the Nod is in a room.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| text* | string | |
| history | array |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"text"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"text": {
"type": "string",
"maxLength": 2000,
"minLength": 1
},
"history": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"text"
],
"properties": {
"role": {
"enum": [
"user",
"assistant"
],
"type": "string"
},
"text": {
"type": "string",
"maxLength": 2000
}
}
},
"maxItems": 24
}
},
"additionalProperties": false
}Answers a Stripe TEST-mode Checkout link for one credit pack: pack-10 ($10 of credit), pack-25 ($25 of credit), pack-100 ($100 of credit). You do not pay: give the link to your owner, who opens it and pays (in test mode the card 4242 4242 4242 4242 with any future date works). amount_usd is the credit the pack adds; price_usd is what your owner pays for it on their plan today (less on a paid plan). The credit appears in get_balance a few seconds after payment. Needs a confirmed owner. Answers not_live where payments are switched off, and forbidden (with the reason) for an account on hold, not yet confirmed, or not a staff account while payments are in test mode.
| Argument | Type | Description |
|---|---|---|
| pack_id* | string | One of: pack-10 ($10 of credit), pack-25 ($25 of credit), pack-100 ($100 of credit). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pack_id"
],
"properties": {
"pack_id": {
"enum": [
"pack-10",
"pack-25",
"pack-100"
],
"type": "string",
"description": "One of: pack-10 ($10 of credit), pack-25 ($25 of credit), pack-100 ($100 of credit)."
}
},
"additionalProperties": false
}Changes only the fields you pass. Set is_paused true to stop it being sent anywhere.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| face | string | A face id from list_parts, or "default". |
| name | string | |
| slug | string | The last part of the page address, <web>/<handle>/<slug>. Made from the name if left out. |
| brain | string | A brain id from list_parts, or "default". |
| voice | string | A voice id from list_parts, or "default". |
| face_id | string | The avatar for the outside-anam face: your own Anam avatar id (your Anam key, added in Studio, pays), or a nodnod: id from list_faces. "" for none. |
| voice_id | string | The voice inside the voice part, from list_parts or the catalogue (am_fenrir, bf_emma...). "" for its default. |
| abilities | array | Built-in abilities to switch on. |
| is_paused | boolean |
If you already have a NodNod API key (from an earlier sign_up or create_key), pass it here once and the rest of this connection uses it. Not needed right after sign_up, which attaches its key for you.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | A key starting nod_sk_. |
{
"type": "object",
"required": [
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "A key starting nod_sk_."
}
},
"additionalProperties": false
}The backup to the one-click link: pass the six digit code your owner read from the NodNod email. On success the trial ends and your key can send Nods and spend. Five wrong tries closes the code; then call resend_owner_letter. Tries are also limited per key and per account (10 an hour, 20 a day). If the owner pressed the link instead, get_account shows is_verified true and you need not call this.
| Argument | Type | Description |
|---|---|---|
| code* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| array |
| Built-in abilities to switch on. |
| brain_tier | string | fast (the default) or big. |
| personality | string | Who the Nod is and how it talks, in plain words. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"face": {
"type": "string",
"description": "A face id from list_parts, or \"default\"."
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,39}$",
"description": "The last part of the page address, <web>/<handle>/<slug>. Made from the name if left out."
},
"brain": {
"type": "string",
"description": "A brain id from list_parts, or \"default\"."
},
"space": {
"enum": [
"personal",
"team"
],
"type": "string",
"description": "\"personal\" (the default): yours, and it goes where you go. \"team\": made in your team's space; it stays with the team if you leave, and a team key is revoked when you do."
},
"voice": {
"type": "string",
"description": "A voice id from list_parts, or \"default\"."
},
"face_id": {
"type": "string",
"maxLength": 64,
"description": "The avatar for the outside-anam face: your own Anam avatar id (your Anam key, added in Studio, pays), or a nodnod: id from list_faces. \"\" for none."
},
"voice_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]{0,64}$",
"description": "The voice inside the voice part, from list_parts or the catalogue (am_fenrir, bf_emma...). \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"enum": [
"catch_up",
"remember",
"look_at_screen",
"meeting_history",
"present_deck",
"magic_trick",
"sing"
],
"type": "string"
},
"maxItems": 7,
"description": "Built-in abilities to switch on."
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast (the default) or big."
},
"personality": {
"type": "string",
"maxLength": 4000,
"description": "Who the Nod is and how it talks, in plain words."
}
},
"additionalProperties": false
}| brain_tier | string | fast (the default) or big. |
| personality | string | Who the Nod is and how it talks, in plain words. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"face": {
"type": "string",
"description": "A face id from list_parts, or \"default\"."
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,39}$",
"description": "The last part of the page address, <web>/<handle>/<slug>. Made from the name if left out."
},
"brain": {
"type": "string",
"description": "A brain id from list_parts, or \"default\"."
},
"voice": {
"type": "string",
"description": "A voice id from list_parts, or \"default\"."
},
"face_id": {
"type": "string",
"maxLength": 64,
"description": "The avatar for the outside-anam face: your own Anam avatar id (your Anam key, added in Studio, pays), or a nodnod: id from list_faces. \"\" for none."
},
"voice_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]{0,64}$",
"description": "The voice inside the voice part, from list_parts or the catalogue (am_fenrir, bf_emma...). \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"enum": [
"catch_up",
"remember",
"look_at_screen",
"meeting_history",
"present_deck",
"magic_trick",
"sing"
],
"type": "string"
},
"maxItems": 7,
"description": "Built-in abilities to switch on."
},
"is_paused": {
"type": "boolean"
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast (the default) or big."
},
"personality": {
"type": "string",
"maxLength": 4000,
"description": "Who the Nod is and how it talks, in plain words."
}
},
"additionalProperties": false
}