Koskamo

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.

NodNod MCP logo, by NodNodCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by NodNod
MCP endpoint (Streamable HTTP)
https://api.nodnod.ai/mcp
Vendor documentation

What its tools do

23 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Not annotated (1)

23 of 23 have a description · 22 of 23 declare behavior hints · 2 of 16 with parameters document them all

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

Community listingRegistry 0.1.0

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
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

NodNod gives an AI agent a body: a face, a voice and a brain, sent to a meeting or a web page. New here? Call sign_up with your human owner's email; your key is attached to this connection. Ask your owner for the six digit code NodNod emails them and call verify_owner. Then create_nod and send_nod with to "page". Full guide: /llms.txt

Tools

23 advertised

sign_up — Create a NodNod account and get an API key, in one call
Advertised by the server during the last successful anonymous check.
Open-world

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.

sign_up input schema
{
  "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
}
sign_up output schema
{
  "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
}
sign_up annotations
{
  "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
Advertised by the server during the last successful anonymous check.

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.

verify_owner input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "pattern": "^\\d{6}$"
    }
  },
  "additionalProperties": false
}
verify_owner output schema
{
  "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
}
verify_owner annotations
{
  "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
Advertised by the server during the last successful anonymous check.

Sends a fresh code and link to the owner (the old ones stop working). At most 3 an hour and 6 a day.

resend_owner_letter input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
resend_owner_letter output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "sent_to"
  ],
  "properties": {
    "sent_to": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
resend_owner_letter annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

Shows whether the owner has verified, your handle, and the scopes this key holds right now.

get_account input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
get_account output schema
{
  "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
}
get_account annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

The face, voice and brain ids create_nod and update_nod accept, and the default for each.

list_parts input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
list_parts output schema
{
  "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
}
list_parts annotations
{
  "title": "List what each part of a Nod can be",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_faces — List NodNod's own Anam faces
Advertised by the server during the last successful anonymous check.
Advertised read-only

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".

list_faces input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
list_faces output schema
{
  "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
}
list_faces annotations
{
  "title": "List NodNod's own Anam faces",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
list_nods — List your Nods
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every Nod on the account that has not been deleted.

list_nods input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
list_nods output schema
{
  "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
}
list_nods annotations
{
  "title": "List your Nods",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_nod — Read one Nod
Advertised by the server during the last successful anonymous check.
Advertised read-only

One Nod by id.

get_nod input schema
{
  "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
}
get_nod output schema
{
  "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
}
get_nod annotations
{
  "title": "Read one Nod",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
create_nod — Create a Nod
Advertised by the server during the last successful anonymous check.

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).

create_nod input schema
{
  "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
}
create_nod output schema
{
  "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
}
create_nod annotations
{
  "title": "Create a Nod",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
update_nod — Edit a Nod
Advertised by the server during the last successful anonymous check.

Changes only the fields you pass. Set is_paused true to stop it being sent anywhere.

update_nod input schema
{
  "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
}
update_nod output schema
{
  "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
}
update_nod annotations
{
  "title": "Edit a Nod",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
delete_nod — Delete a Nod
Advertised by the server during the last successful anonymous check.
Advertised destructive

Removes the Nod from the account and its page. Its history is kept for the owner.

delete_nod input schema
{
  "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
}
delete_nod output schema
{
  "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
}
delete_nod annotations
{
  "title": "Delete a Nod",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
test_nod — Talk to a Nod in text to test it
Advertised by the server during the last successful anonymous check.

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.

test_nod input schema
{
  "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
}
test_nod output schema
{
  "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
}
test_nod annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Open-world

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.

send_nod input schema
{
  "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
}
send_nod output schema
{
  "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
}
send_nod annotations
{
  "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
Advertised by the server during the last successful anonymous check.

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.

start_session input schema
{
  "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
}
start_session output schema
{
  "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
}
start_session annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

Whether the Nod is still in the room, why it left, and what it cost once settled.

get_session input schema
{
  "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
}
get_session output schema
{
  "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
}
get_session annotations
{
  "title": "Read a live session",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
stop_session — Stop a live session
Advertised by the server during the last successful anonymous check.

Asks the Nod to leave its room now, waits a few seconds for it to go, and returns the final state and cost.

stop_session input schema
{
  "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
}
stop_session output schema
{
  "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
}
stop_session annotations
{
  "title": "Stop a live session",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
list_keys — List your API keys
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

list_keys input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
list_keys output schema
{
  "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
}
list_keys annotations
{
  "title": "List your API keys",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
create_key — Create an API key on your account
Advertised by the server during the last successful anonymous check.

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.

create_key input schema
{
  "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
}
create_key output schema
{
  "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
}
create_key annotations
{
  "title": "Create an API key on your account",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
revoke_key — Revoke one of your API keys
Advertised by the server during the last successful anonymous check.
Advertised destructive

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.

revoke_key input schema
{
  "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
}
revoke_key output schema
{
  "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
}
revoke_key annotations
{
  "title": "Revoke one of your API keys",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
get_balance — Read the account balance
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_balance input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
get_balance output schema
{
  "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
}
get_balance annotations
{
  "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
Advertised by the server during the last successful anonymous check.

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.

top_up input schema
{
  "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
}
top_up output schema
{
  "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
}
top_up annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

API calls by operation and sends by target over the last N days (default 30).

get_usage input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 90,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
get_usage output schema
{
  "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
}
get_usage annotations
{
  "title": "Read recent usage",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
use_key — Use an existing API key on this connection
Advertised by the server during the last successful anonymous check.

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.

use_key input schema
{
  "type": "object",
  "required": [
    "api_key"
  ],
  "properties": {
    "api_key": {
      "type": "string",
      "description": "A key starting nod_sk_."
    }
  },
  "additionalProperties": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http nodnod-mcp https://api.nodnod.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add nodnod-mcp --url https://api.nodnod.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable nodnod-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "nodnod-mcp": {
      "url": "https://api.nodnod.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "nodnod-mcp": {
      "type": "streamableHttp",
      "url": "https://api.nodnod.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start nodnod-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "nodnod-mcp": {
      "type": "http",
      "url": "https://api.nodnod.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http nodnod-mcp https://api.nodnod.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://api.nodnod.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.