NodNod MCP
Provides an MCP server that allows AI agents to create, test, and deploy virtual avatars (Nods) with faces and voices. Agents can sign up, configure personalities, test interactions, and publish Nods to web pages or meetings without a browser.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://api.nodnod.ai/mcpWhat its tools do
23 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (9)
Can change data (13)
Not annotated (1)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Create a Nod with a name and personality
- Test Nod responses via text conversation
- Deploy Nod to a public web page
- Start a live Nod session in a room
Source and maintenance
Protocol and capabilities
- Server
- nodnod 0.1.0
- MCP protocol negotiated in check
- 2025-06-18
- Tools
- 23 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
23 advertised
sign_up — Create a NodNod account and get an API key, in one call
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"api_key",
"key_id",
"owner_id",
"handle",
"is_verified",
"can_do_now",
"next_step"
],
"properties": {
"handle": {
"type": "string"
},
"key_id": {
"type": "string"
},
"api_key": {
"type": "string",
"description": "Store it now. It is never shown again."
},
"owner_id": {
"type": "string"
},
"next_step": {
"type": "string"
},
"can_do_now": {
"type": "array",
"items": {
"type": "string"
},
"description": "Operations this key can call right now."
},
"is_verified": {
"type": "boolean",
"const": false
}
},
"additionalProperties": false
}{
"title": "Create a NodNod account and get an API key, in one call",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}verify_owner — Confirm the human owner with their emailed code
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"is_verified",
"next_step"
],
"properties": {
"next_step": {
"type": "string",
"description": "What the code did, and what the link still does."
},
"is_verified": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}{
"title": "Confirm the human owner with their emailed code",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}resend_owner_letter — Send the owner's verification email again
Sends a fresh code and link to the owner (the old ones stop working). At most 3 an hour and 6 a day.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"sent_to"
],
"properties": {
"sent_to": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Send the owner's verification email again",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}get_account — Read the account, its owner and what this key may do
Shows whether the owner has verified, your handle, and the scopes this key holds right now.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"owner_id",
"owner_email",
"display_name",
"handle",
"is_verified",
"scopes",
"trial_max_nods",
"page_base_url"
],
"properties": {
"handle": {
"type": "string"
},
"scopes": {
"type": "array",
"items": {
"type": "string"
},
"description": "What the key you called with may do right now."
},
"owner_id": {
"type": "string"
},
"is_verified": {
"type": "boolean"
},
"owner_email": {
"type": "string"
},
"display_name": {
"type": "string"
},
"page_base_url": {
"type": "string"
},
"trial_max_nods": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "Read the account, its owner and what this key may do",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}list_parts — List what each part of a Nod can be
The face, voice and brain ids create_nod and update_nod accept, and the default for each.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"parts"
],
"properties": {
"parts": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"default",
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
}
},
"kind": {
"type": "string"
},
"default": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "List what each part of a Nod can be",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}list_faces — List NodNod's own Anam faces
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".
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"faces",
"note"
],
"properties": {
"note": {
"type": "string"
},
"faces": {
"type": "array",
"items": {
"type": "object",
"required": [
"face_id",
"name",
"image_url",
"is_usable"
],
"properties": {
"name": {
"type": "string"
},
"face_id": {
"type": "string",
"description": "Pass as update_nod face_id, with face \"outside-anam\"."
},
"image_url": {
"type": [
"string",
"null"
]
},
"is_usable": {
"type": "boolean",
"description": "False for an older model that shows no video."
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "List NodNod's own Anam faces",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}list_nods — List your Nods
Every Nod on the account that has not been deleted.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"nods"
],
"properties": {
"nods": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"slug",
"personality",
"face",
"face_id",
"voice",
"voice_id",
"brain",
"brain_tier",
"abilities",
"audience",
"is_paused",
"page_url",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string"
},
"face": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"brain": {
"type": "string"
},
"voice": {
"type": "string"
},
"face_id": {
"type": "string",
"description": "The avatar inside the face: an Anam avatar id on your own Anam account, or a nodnod: id from list_faces."
},
"audience": {
"enum": [
"private",
"invited",
"public"
],
"type": "string"
},
"page_url": {
"type": "string"
},
"voice_id": {
"type": "string",
"description": "The voice inside the voice part (a Kokoro voice such as am_fenrir); \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "The built-in abilities switched on."
},
"is_paused": {
"type": "boolean"
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast: quick answers; big: slower and deeper."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"personality": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "List your Nods",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}get_nod — Read one Nod
One Nod by id.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"name",
"slug",
"personality",
"face",
"face_id",
"voice",
"voice_id",
"brain",
"brain_tier",
"abilities",
"audience",
"is_paused",
"page_url",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string"
},
"face": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"brain": {
"type": "string"
},
"voice": {
"type": "string"
},
"face_id": {
"type": "string",
"description": "The avatar inside the face: an Anam avatar id on your own Anam account, or a nodnod: id from list_faces."
},
"audience": {
"enum": [
"private",
"invited",
"public"
],
"type": "string"
},
"page_url": {
"type": "string"
},
"voice_id": {
"type": "string",
"description": "The voice inside the voice part (a Kokoro voice such as am_fenrir); \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "The built-in abilities switched on."
},
"is_paused": {
"type": "boolean"
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast: quick answers; big: slower and deeper."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"personality": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Read one Nod",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}create_nod — Create a Nod
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).
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"name",
"slug",
"personality",
"face",
"face_id",
"voice",
"voice_id",
"brain",
"brain_tier",
"abilities",
"audience",
"is_paused",
"page_url",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string"
},
"face": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"brain": {
"type": "string"
},
"voice": {
"type": "string"
},
"face_id": {
"type": "string",
"description": "The avatar inside the face: an Anam avatar id on your own Anam account, or a nodnod: id from list_faces."
},
"audience": {
"enum": [
"private",
"invited",
"public"
],
"type": "string"
},
"page_url": {
"type": "string"
},
"voice_id": {
"type": "string",
"description": "The voice inside the voice part (a Kokoro voice such as am_fenrir); \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "The built-in abilities switched on."
},
"is_paused": {
"type": "boolean"
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast: quick answers; big: slower and deeper."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"personality": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Create a Nod",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}update_nod — Edit a Nod
Changes only the fields you pass. Set is_paused true to stop it being sent anywhere.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"name",
"slug",
"personality",
"face",
"face_id",
"voice",
"voice_id",
"brain",
"brain_tier",
"abilities",
"audience",
"is_paused",
"page_url",
"created_at",
"updated_at"
],
"properties": {
"id": {
"type": "string"
},
"face": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"brain": {
"type": "string"
},
"voice": {
"type": "string"
},
"face_id": {
"type": "string",
"description": "The avatar inside the face: an Anam avatar id on your own Anam account, or a nodnod: id from list_faces."
},
"audience": {
"enum": [
"private",
"invited",
"public"
],
"type": "string"
},
"page_url": {
"type": "string"
},
"voice_id": {
"type": "string",
"description": "The voice inside the voice part (a Kokoro voice such as am_fenrir); \"\" for its default."
},
"abilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "The built-in abilities switched on."
},
"is_paused": {
"type": "boolean"
},
"brain_tier": {
"enum": [
"fast",
"big"
],
"type": "string",
"description": "fast: quick answers; big: slower and deeper."
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"personality": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Edit a Nod",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}delete_nod — Delete a Nod
Removes the Nod from the account and its page. Its history is kept for the owner.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"is_deleted"
],
"properties": {
"id": {
"type": "string"
},
"is_deleted": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}{
"title": "Delete a Nod",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}test_nod — Talk to a Nod in text to test it
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reply",
"turns_left_today"
],
"properties": {
"reply": {
"type": "string"
},
"turns_left_today": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "Talk to a Nod in text to test it",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}send_nod — Send a Nod to its personal page or a meeting
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"send_id",
"to",
"url",
"status",
"next_step"
],
"properties": {
"to": {
"enum": [
"page",
"meeting",
"meetingburner_room"
],
"type": "string"
},
"url": {
"type": "string"
},
"probe": {
"type": "object",
"required": [
"passed",
"attacks_run",
"findings"
],
"properties": {
"passed": {
"type": "boolean"
},
"findings": {
"type": "array",
"items": {
"type": "string"
}
},
"attacks_run": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"description": "The red-team check that runs before a page opens. A failed check keeps the page closed.",
"additionalProperties": false
},
"status": {
"enum": [
"live",
"blocked"
],
"type": "string"
},
"send_id": {
"type": [
"string",
"null"
],
"description": "Null when the page stayed closed (status blocked)."
},
"audience": {
"enum": [
"public",
"invited"
],
"type": "string"
},
"next_step": {
"type": "string"
},
"embed_code": {
"type": "string",
"description": "The one line a website pastes to show this Nod."
},
"session_id": {
"type": "string",
"description": "For a MeetingBurner room: read or stop it with get_session or stop_session."
}
},
"additionalProperties": false
}{
"title": "Send a Nod to its personal page or a meeting",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}start_session — Start a Nod on the GPU and get a pass to talk to it
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id",
"room_url",
"room_name",
"room_pass",
"max_seconds"
],
"properties": {
"room_url": {
"type": "string"
},
"room_name": {
"type": "string"
},
"room_pass": {
"type": "string"
},
"session_id": {
"type": "string"
},
"max_seconds": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "Start a Nod on the GPU and get a pass to talk to it",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}get_session — Read a live session
Whether the Nod is still in the room, why it left, and what it cost once settled.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id",
"state",
"end_reason",
"message",
"charged_micro_usd"
],
"properties": {
"state": {
"enum": [
"starting",
"live",
"ended",
"failed"
],
"type": "string"
},
"message": {
"type": [
"string",
"null"
]
},
"end_reason": {
"type": [
"string",
"null"
]
},
"session_id": {
"type": "string"
},
"charged_micro_usd": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}{
"title": "Read a live session",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}stop_session — Stop a live session
Asks the Nod to leave its room now, waits a few seconds for it to go, and returns the final state and cost.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id",
"state",
"end_reason",
"message",
"charged_micro_usd"
],
"properties": {
"state": {
"enum": [
"starting",
"live",
"ended",
"failed"
],
"type": "string"
},
"message": {
"type": [
"string",
"null"
]
},
"end_reason": {
"type": [
"string",
"null"
]
},
"session_id": {
"type": "string"
},
"charged_micro_usd": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}{
"title": "Stop a live session",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}list_keys — List your API keys
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"keys"
],
"properties": {
"keys": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"label",
"prefix",
"scopes",
"created_at",
"last_used_at",
"revoked_at",
"is_this_key"
],
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "The first characters of the key, to tell keys apart. The secret is never shown again."
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string"
},
"revoked_at": {
"type": [
"string",
"null"
]
},
"is_this_key": {
"type": "boolean"
},
"last_used_at": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "List your API keys",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}create_key — Create an API key on your account
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"label",
"prefix",
"scopes",
"created_at",
"last_used_at",
"revoked_at",
"is_this_key",
"api_key"
],
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "The first characters of the key, to tell keys apart. The secret is never shown again."
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"api_key": {
"type": "string",
"description": "Store it now. It is never shown again."
},
"created_at": {
"type": "string"
},
"revoked_at": {
"type": [
"string",
"null"
]
},
"is_this_key": {
"type": "boolean"
},
"last_used_at": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}{
"title": "Create an API key on your account",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}revoke_key — Revoke one of your API keys
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"label",
"prefix",
"scopes",
"created_at",
"last_used_at",
"revoked_at",
"is_this_key"
],
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "The first characters of the key, to tell keys apart. The secret is never shown again."
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string"
},
"revoked_at": {
"type": [
"string",
"null"
]
},
"is_this_key": {
"type": "boolean"
},
"last_used_at": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}{
"title": "Revoke one of your API keys",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}get_balance — Read the account balance
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.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"available_micro_usd",
"available_usd",
"is_unlimited",
"empty_reason",
"message"
],
"properties": {
"message": {
"type": "string",
"description": "One plain line about this balance."
},
"empty_reason": {
"anyOf": [
{
"enum": [
"unconfirmed",
"link_pending",
"address_used",
"trial_ended"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "unconfirmed: the owner has not confirmed yet. link_pending: the owner gave you the code (you may send) but the mailbox is not proved yet; the owner signs in to Studio once and the free credit follows. address_used: the free credit for this email went to another account. trial_ended: the free trial is over; the owner adds credit to keep going."
},
"is_unlimited": {
"type": "boolean"
},
"available_usd": {
"type": "string"
},
"available_micro_usd": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
}{
"title": "Read the account balance",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}top_up — Get a test-mode payment link for a credit pack, for your owner to pay
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.
{
"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
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"checkout_url",
"pack_id",
"amount_usd",
"price_usd",
"mode",
"next_step"
],
"properties": {
"mode": {
"type": "string",
"const": "test"
},
"pack_id": {
"type": "string"
},
"next_step": {
"type": "string"
},
"price_usd": {
"type": "string"
},
"amount_usd": {
"type": "string"
},
"checkout_url": {
"type": "string",
"description": "Give this to your owner to open and pay. It expires after 24 hours."
}
},
"additionalProperties": false
}{
"title": "Get a test-mode payment link for a credit pack, for your owner to pay",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}get_usage — Read recent usage
API calls by operation and sends by target over the last N days (default 30).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"since",
"calls_by_operation",
"sends",
"session_seconds"
],
"properties": {
"sends": {
"type": "object",
"required": [
"page",
"meeting"
],
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"meeting": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
},
"additionalProperties": false
},
"since": {
"type": "string"
},
"session_seconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Null until sessions are metered by the wallet."
},
"calls_by_operation": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
}
}
},
"additionalProperties": false
}{
"title": "Read recent usage",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}use_key — Use an existing API key on this connection
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.
{
"type": "object",
"required": [
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "A key starting nod_sk_."
}
},
"additionalProperties": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 739 ms
- 95th percentile latency
- 739 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 739 ms · metadata changed · 23 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http nodnod-mcp https://api.nodnod.ai/mcpCodex
codex mcp add nodnod-mcp --url https://api.nodnod.ai/mcpCursor
{
"mcpServers": {
"nodnod-mcp": {
"url": "https://api.nodnod.ai/mcp"
}
}
}Cline
{
"mcpServers": {
"nodnod-mcp": {
"type": "streamableHttp",
"url": "https://api.nodnod.ai/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"nodnod-mcp": {
"type": "http",
"url": "https://api.nodnod.ai/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http nodnod-mcp https://api.nodnod.ai/mcpClaude Desktop
https://api.nodnod.ai/mcpWindsurf
{
"mcpServers": {
"nodnod-mcp": {
"serverUrl": "https://api.nodnod.ai/mcp"
}
}
}Let your agent find its tools
Find servers like NodNod MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.