Skip to main content
Glama

vora_register

Register a Vora account through multi-turn conversational onboarding that asks about your business, products, and customers to build a profile and provide API credentials.

Instructions

Create your Vora account through conversational onboarding. Vora asks you questions about your business, products, target customers, and objectives to build a rich profile. This produces dramatically better voice agents than one-shot configuration.

Multi-turn: call this tool, answer the returned questions, call again with your answers. Repeat until status is "complete" (typically 3-5 turns).

On completion you receive an account_id and API key to use with all other Vora tools.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
session_idNoSession ID from previous turn. Omit on first call.
nameNoYour agent or business name. Required on first call.
urlNoYour website URL. Vora will crawl it to understand your business. Highly recommended.
descriptionNoWhat you do, what you sell, who your customers are. One paragraph.
answersNoAnswers to questions from the previous turn. Keys are question IDs, values are your answers.

Implementation Reference

  • The main tool handler function. Defines 'vora_register' tool on the McpServer with Zod schema for session_id, name, url, description, and answers. Makes a POST to /v1/agent-api/register endpoint. Handles multi-turn onboarding: if status is 'onboarding', returns questions for the next turn; if 'complete', returns account_id, api_key, and context_score.
    export function registerVoraRegister(server: McpServer): void {
      server.tool(
        "vora_register",
        `Create your Vora account through conversational onboarding. Vora asks you questions about your business, products, target customers, and objectives to build a rich profile. This produces dramatically better voice agents than one-shot configuration.
    
    Multi-turn: call this tool, answer the returned questions, call again with your answers. Repeat until status is "complete" (typically 3-5 turns).
    
    On completion you receive an account_id and API key to use with all other Vora tools.`,
        {
          session_id: z
            .string()
            .optional()
            .describe("Session ID from previous turn. Omit on first call."),
          name: z
            .string()
            .optional()
            .describe("Your agent or business name. Required on first call."),
          url: z
            .string()
            .optional()
            .describe(
              "Your website URL. Vora will crawl it to understand your business. Highly recommended."
            ),
          description: z
            .string()
            .optional()
            .describe(
              "What you do, what you sell, who your customers are. One paragraph."
            ),
          answers: z
            .record(z.string())
            .optional()
            .describe(
              "Answers to questions from the previous turn. Keys are question IDs, values are your answers."
            ),
        },
        async (params) => {
          const client = getApiClient();
    
          try {
            const response = await client.post<RegisterResponse>(
              "/v1/agent-api/register",
              {
                session_id: params.session_id,
                name: params.name,
                url: params.url,
                description: params.description,
                answers: params.answers,
              }
            );
    
            if (response.status === "onboarding") {
              const questionList = response.questions
                ?.map((q, i) => {
                  let line = `${i + 1}. [${q.id}] ${q.question}`;
                  if (q.options) {
                    line += ` (options: ${q.options.join(", ")})`;
                  }
                  if (q.required) {
                    line += " *required*";
                  }
                  return line;
                })
                .join("\n");
    
              return {
                content: [
                  {
                    type: "text" as const,
                    text: `Onboarding in progress. Please answer these questions and call vora_register again with your answers.\n\nSession ID: ${response.session_id}\n\nQuestions:\n${questionList}`,
                  },
                ],
              };
            }
    
            // Complete
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Account created successfully!\n\nAccount ID: ${response.account_id}\nAPI Key: ${response.api_key}\nContext Score: ${response.context_score}/100\n\nNext step: Call vora_create_agent to build your voice agent.`,
                },
              ],
            };
          } catch (error) {
            return {
              content: [
                {
                  type: "text" as const,
                  text: `Registration error: ${error instanceof Error ? error.message : String(error)}`,
                },
              ],
              isError: true,
            };
          }
        }
      );
    }
  • TypeScript interface RegisterResponse defining the API response shape: status (onboarding|complete), session_id, questions array (with id, question, type, options, required), account_id, context_score, and api_key.
    interface RegisterResponse {
      status: "onboarding" | "complete";
      session_id?: string;
      questions?: Array<{
        id: string;
        question: string;
        type: "text" | "select" | "multi_select";
        options?: string[];
        required: boolean;
      }>;
      account_id?: string;
      context_score?: number;
      api_key?: string;
    }
  • Zod input schema for the vora_register tool: optional session_id (for multi-turn), optional name (required on first call), optional url (for website crawling), optional description, and optional answers record (question_id -> answer).
    {
      session_id: z
        .string()
        .optional()
        .describe("Session ID from previous turn. Omit on first call."),
      name: z
        .string()
        .optional()
        .describe("Your agent or business name. Required on first call."),
      url: z
        .string()
        .optional()
        .describe(
          "Your website URL. Vora will crawl it to understand your business. Highly recommended."
        ),
      description: z
        .string()
        .optional()
        .describe(
          "What you do, what you sell, who your customers are. One paragraph."
        ),
      answers: z
        .record(z.string())
        .optional()
        .describe(
          "Answers to questions from the previous turn. Keys are question IDs, values are your answers."
        ),
    },
  • src/tools/index.ts:2-2 (registration)
    Import of registerVoraRegister from the vora-register module.
    import { registerVoraRegister } from "./vora-register.js";
  • registration: registerTools function calls registerVoraRegister(server) to wire the vora_register tool into the MCP server.
    export function registerTools(server: McpServer): void {
      registerVoraRegister(server);
      registerVoraCreateAgent(server);
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the multi-turn nature, that questions are returned, and that completion yields an account_id and API key. It does not mention error handling or rate limits, but the iterative process and outcome are well communicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured in three paragraphs: purpose, multi-turn process, and outcome. It is concise enough to convey all necessary information without excessive repetition. It could be slightly more concise, but it earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multi-turn, no output schema, no annotations), the description provides a complete picture for an agent: how to start, continue, and detect completion. It mentions the expected outputs (account_id and API key) and the status check. It lacks error handling details but is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not add significant meaning beyond the schema; it only reiterates the multi-turn context. The schema already explains each parameter. Therefore, no extra value is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create your Vora account through conversational onboarding.' It also distinguishes itself from siblings (vora_call, vora_calls, vora_create_agent, vora_update_agent) by focusing on account registration, which is a unique action. The multi-turn process is well explained.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage guidelines: call the tool, answer questions, repeat until status 'complete'. It explains that this produces better voice agents than one-shot configuration. However, it does not explicitly contrast with siblings or state when not to use it, but the purpose is distinct enough to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/stefanstojanovicstefa-creator/vora-voice-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server