Skip to main content
Glama

voygr-mcp

MCP server for VOYGR place verification and outbound venue calls. Proper stdio MCP: tools, resources, prompts, progress notifications, and elicitation.

Demo Video

Install

cd voygr-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Requires a VOYGR API key at process start:

export VOYGR_API_KEY=your_key
# or: voygr login your_key

Related MCP server: vonage-mcp-server-api-bindings

Dry-run (default)

VOYGR_DRY_RUN defaults to 1. Calls only are mocked (magic numbers, scripted events, canned transcripts). verify_place / verify_places / check_credits always hit the live VOYGR API via the official voygr Python client.

Magic number

Outcome

+1-555-0100

success_booked

+1-555-0101

failed_voicemail

+1-555-0102

mid-call ask_user then success_booked

+1-555-0103

failed_short_hangup

+1-555-0104

409 concurrency cap

+1-555-0105

402 insufficient credits

Live dialing:

export VOYGR_DRY_RUN=0
docker compose up -d redis   # call state / event cursors
export VOYGR_REDIS_URL=redis://localhost:6379/0
voygr-mcp

Claude Desktop (stdio)

  1. Put VOYGR_API_KEY=... in the project .env (loaded automatically; Claude’s cwd does not matter).

  2. Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) and merge:

{
  "mcpServers": {
    "voygr": {
      "command": "/Users/vaarunsinha/voygr-mcp/scripts/claude-desktop-mcp.sh",
      "env": {
        "VOYGR_DRY_RUN": "1"
      }
    }
  }
}
  1. Fully quit and reopen Claude Desktop. Confirm under + → Connectors (or Developer settings) that voygr is connected and tools like verify_place appear.

Or point command at .venv/bin/voygr-mcp directly — the server also loads the package-root .env on start.

Tools

Tool

Role

verify_place

Single POI → agent-safe verdict (not raw open/closed)

verify_places

Batch + normalized cache

call_place

Structured call (inquiry / info_gathering); consent + slots elicited

get_call

Resume by call handle

check_credits

Usage / credits

Consent is never a tool parameter — it is always an elicitation to the human.

Resources / prompt

  • voygr://call/{id}/transcript — 7-day retention noted in metadata

  • voygr://call/{id}/events

  • Prompt: verify_before_recommending

Honesty (demo / video)

When recording the 60s demo:

  • Refusal arm (verify_places dropping closed/not_found) should be live API.

  • Mid-call handoff segment should be dry-run (+1-555-0102) and labeled on screen.

  • List which segments used dry-run in any public write-up.

Tests

pytest

Tests use ScriptedElicitationProvider (no human). No skip-consent env var ships in the server.

Stack

Python, official mcp SDK (stdio), voygr PyPI client, httpx (calls API), Redis (live call state), Docker Compose, pytest. No FastAPI in v1.

Reference checkout of upstream CLI (not vendored): ../voygr-dev-tools.

Available Tools

7 tools
answer_mid_callA

Relay the human's answer to a mid-call venue question. When call_place/approve_call returns status=awaiting_mid_call_answer, show question to the human in chat, then call this with answer_token + their answer. This is the mid-call handoff — do not invent the answer or the token.

ParametersJSON Schema
NameRequiredDescriptionDefault
answerYes
answer_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the mid-call handoff nature and the instruction not to invent the answer or token. However, it does not mention any side effects, return behavior, or whether the call ends after this, but it is generally transparent for a relay tool.

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

Conciseness5/5

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

The description is two sentences long and front-loaded with the purpose. Every sentence adds value: the first states what it does and when, the second explains the workflow and a critical warning. No unnecessary words.

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

Completeness5/5

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

For a simple tool with 2 parameters, the description covers purpose, usage conditions, parameter meaning, and behavioral constraints. An output schema exists, so return values are already structured. Sibling context is not needed for completeness.

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

Parameters4/5

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

Schema coverage is 0% and the input schema provides no descriptions for 'answer_token' or 'answer'. The description compensates by defining the token as coming from call_place/approve_call and the answer as the human's response. It doesn't specify formats or constraints, but gives enough context to understand both parameters.

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: 'Relay the human's answer to a mid-call venue question.' It uses a specific verb ('relay') and resource ('human's answer'), and distinguishes itself from siblings by referencing the call_place/approve_call status and the mid-call handoff.

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

Usage Guidelines5/5

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

It explicitly says when to use the tool: 'When call_place/approve_call returns status=awaiting_mid_call_answer.' It provides a clear sequence of actions (show question to human, then call with token and answer) and even warns against inventing the answer or token. This is excellent usage guidance.

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

approve_callA

Approve a pending call after the human said yes in chat. Pass the consent_token returned by call_place when error=consent_required. Only works with a server-issued token — do not invent one.

ParametersJSON Schema
NameRequiredDescriptionDefault
consent_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses a critical behavioral constraint: 'Only works with a server-issued token — do not invent one.' This warns against fabricating tokens and implies invalid tokens will fail. It does not detail failure modes or side effects, but the key restriction is transparent.

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

Conciseness5/5

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

Three sentences, each purposeful: purpose, usage, and a warning. No redundant wording. The structure front-loads the action and contextualizes the token requirement efficiently.

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

Completeness5/5

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

For a single-parameter tool with an output schema present, the description covers what, when, and how—leaving no critical gaps. The warning about server-issued tokens addresses a potential misuse. No additional context is needed.

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

Parameters5/5

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

The input schema only defines consent_token as a required string. The description adds essential semantics: the token is returned by call_place when error=consent_required. This tells the agent exactly where the value comes from and how to obtain it, going well beyond the schema.

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 function: 'Approve a pending call after the human said yes in chat.' It specifies the action (approve) and the resource (pending call), and the mention of consent_token ties it to a specific workflow, distinguishing it from sibling tools.

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 gives explicit when-to-use context: 'after the human said yes in chat' and 'when error=consent_required.' It also provides a concrete reference to call_place, but does not explicitly name alternatives or when-not-to-use scenarios. The guidance is strong but not exhaustive.

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

call_placeA

Place a structured outbound VOYGR call to a venue phone. Intents: inquiry | info_gathering. Language: en only. For inquiry, slots MUST include question (a free-text ask for the venue). party_size/date/time alone are not enough. Consent is elicited when the client supports it; otherwise the tool returns consent_required + consent_token — ask the human in chat, then call approve_call. If the venue asks something mid-call, the tool may return awaiting_mid_call_answer — ask the human that question in chat, then answer_mid_call. No confirm boolean. In dry-run, inquiry calls simulate a live venue including mid-call questions.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
phoneYes
slotsNo
venueNo
intentYes
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavior disclosure burden. It explains consent handling, return values like consent_required and awaiting_mid_call_answer, the absence of a confirm boolean, and dry-run simulation behavior. These details go beyond what annotations would typically provide and give the agent a realistic model of the tool's runtime behavior.

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

Conciseness5/5

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

The description is dense but every sentence provides actionable information: purpose, intents, language, slot requirements, consent flow, mid-call answer flow, confirm boolean absence, and dry-run behavior. There is no fluff or repetition, and it is front-loaded with the core purpose. This is an excellent balance of detail and brevity.

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

Completeness5/5

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

This is a complex tool involving consent workflows, mid-call interactions, and dry-run behavior. The description covers the critical operational flows and return states. While it does not spell out the success return shape, an output schema is present, so that information is not required in the description. The description is sufficiently complete for safe and correct invocation.

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

Parameters4/5

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

The schema provides no descriptions (0% coverage), so the description must compensate. It explains the intent values, the required slot (question) for inquiry, and that language is restricted to 'en'. It also clarifies that there is no confirm boolean. However, it does not explain the meaning of all parameters (e.g., kind, venue, phone, slots keys), leaving some gaps for a few parameters.

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 opens with a specific verb and resource: 'Place a structured outbound VOYGR call to a venue phone.' This clearly states what the tool does and distinguishes it from sibling tools like approve_call or answer_mid_call, which are follow-up actions. It further clarifies the two intents (inquiry and info_gathering), leaving no ambiguity about the primary function.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance, including when to use alternative tools: if consent is required, 'call approve_call'; if a mid-call question arises, 'answer_mid_call'. It also sets a clear precondition for the inquiry intent (slots must include a question) and states that party_size/date/time alone are insufficient. This gives the agent actionable decision rules.

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

check_creditsA

Report VOYGR usage/credits so the agent can explain spend and holds.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral disclosure burden. The verb 'Report' implies a read-only operation, and the description identifies the type of data returned (usage/credits). However, it does not explicitly confirm no side effects, mention any authorization needs, or describe potential failure modes. This is adequate but not rich.

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

Conciseness5/5

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

The description is a single concise sentence of 14 words. It front-loads the core action ('Report VOYGR usage/credits') and follows with the purpose. Every word earns its place; there is no redundancy or fluff.

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

Completeness5/5

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

Given the tool's simplicity (zero parameters) and the presence of an output schema, the description provides sufficient context. It names the resource type (VOYGR usage/credits) and the intended use case (explain spend and holds). The output schema can handle return-value details, so no additional description is necessary.

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

Parameters4/5

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

The tool has zero parameters, so the schema coverage is 100% by default. Per the scoring rules, 0 parameters merits a baseline of 4. The description adds no parameter-related meaning because there are no parameters to explain. No deduction is applied.

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 function: 'Report VOYGR usage/credits'. The verb 'Report' is specific and the resource ('VOYGR usage/credits') is explicit. It also conveys the intended outcome ('so the agent can explain spend and holds'), which adds purpose. This distinguishes it from sibling tools focused on places and calls.

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 phrase 'so the agent can explain spend and holds' provides clear context for when to use this tool: when the agent needs to answer questions about spending or holds. However, it does not explicitly mention when not to use it or name alternative tools, though sibling tools are clearly unrelated to credits.

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

get_callA

Get status/outcome for a call handle returned by call_place (async recovery path).

ParametersJSON Schema
NameRequiredDescriptionDefault
call_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description must carry the burden of disclosing side effects. 'Get status/outcome' strongly implies a read-only operation, but it does not explicitly state 'read-only', nor does it describe error cases, auth requirements, or whether the operation is safe to repeat. The 'async recovery path' hint adds some context but not enough behavioral detail.

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

Conciseness5/5

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

The description is a single sentence, front-loaded with the action and resource, and contains no filler. Every word contributes to understanding the tool's purpose and usage context.

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 only one parameter and an output schema (not shown), the description covers the essential context: the origin of the call handle and the async recovery path. It is slightly thin on explicit usage guidance or alternative tools, but for a simple getter, the provided context is largely sufficient.

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

Parameters4/5

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

The input schema only lists 'call_id' as a string. The description adds meaning by linking this ID to 'a call handle returned by call_place', which clarifies what value to pass and where it originates. This goes beyond the schema's bare title, effectively compensating for the 0% schema description coverage.

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 action ('Get status/outcome'), the resource ('a call handle'), and the context ('returned by call_place (async recovery path)'). This differentiates it from sibling tools like call_place (which places the call) and verify_place (which likely verifies a place). The verb+resource+context is specific and unambiguous.

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 implies when to use this tool: after call_place returns a handle, and specifically in async recovery scenarios. It does not explicitly mention alternatives or exclusion criteria, but the context is clear enough for an agent to infer the appropriate usage.

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

verify_placeA

Verify whether a named place at an address exists and is operating. Returns verdict/recommend — never trust raw open_closed alone. Costs 1 credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
addressYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure and does so well. It discloses that the return value is a 'verdict/recommend' rather than raw data, warns against trusting 'open_closed' alone, and explicitly notes the cost of 1 credit. This goes beyond the schema and gives the agent important operational context.

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

Conciseness5/5

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

The description is two sentences with no filler. The first sentence states the core purpose; the second adds return behavior, a critical reliability warning, and cost information. Every sentence earns its place, and the description is front-loaded with the primary action.

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?

The tool has an output schema, so the description need not detail return values; it appropriately mentions 'verdict/recommend' as a preview. It covers cost and the reliability caveat. It does not mention prerequisites like credit checking or typical failure modes, but given the output schema and simple 2-parameter input, this is not a significant gap.

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 0%, so the description must compensate. It indirectly references the parameters ('named place' and 'address') but does not define their format, constraints, or examples. The parameter names themselves are self-explanatory, and the description ties them to the tool's purpose, providing minimal added meaning. A score of 3 reflects that it is adequate but not rich.

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 a specific verb ('verify') and resource ('a named place at an address'), and defines the scope as checking existence and operating status. This distinguishes it from siblings like call_place or get_call, though not explicitly from verify_places.

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 context on when to use this tool: whenever one needs a trusted verdict on a place's operating status, since 'never trust raw open_closed alone.' It also mentions a cost (1 credit), implying the agent should consider resource usage. It does not explicitly exclude alternatives or list when-not-to-use scenarios, so it falls short of a 5.

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

verify_placesA

Verify multiple places. Input a list of {name, address}. Deduped/cached on normalized name+address. Use before recommending options.

ParametersJSON Schema
NameRequiredDescriptionDefault
placesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It mentions deduplication and caching on normalized name+address, which is useful. However, it does not explain what verification entails, potential side effects, or error behavior, leaving gaps.

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

Conciseness5/5

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

The description is only two sentences, front-loaded with the primary action, and includes no filler. Every phrase adds value.

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?

For a tool with a single parameter and an output schema, the description covers purpose, input format, behavioral nuances, and usage context. It could be more explicit about when to choose this over 'verify_place,' but overall it is sufficient.

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

Parameters4/5

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

The schema only shows a generic array of objects with string properties. The description adds essential semantics: 'Input a list of {name, address},' specifying the expected keys and structure, which is critical given the schema lacks descriptions.

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 starts with 'Verify multiple places,' which clearly specifies the verb (verify), resource (places), and scope (multiple), effectively distinguishing it from the singular 'verify_place' sibling.

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?

It provides a clear usage context: 'Use before recommending options.' This indicates when to call the tool, though it does not explicitly mention when not to use it or contrast it with 'verify_place' beyond the plural implication.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedanswer_mid_call
    • First observedapprove_call
    • First observedcall_place
    • First observedcheck_credits
    • First observedget_call
    • First observedverify_place
    • First observedverify_places

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a distinct role: verification, credit check, call placement, consent, mid-call answer, and status retrieval. The only potential overlap is verify_place vs verify_places, but the singular/plural distinction is clearly explained in the descriptions.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (verify_place, check_credits, call_place, approve_call, answer_mid_call, get_call), with no naming style mixing.

Tool Count5/5

Seven tools is well-scoped for a place-verification and calling service. Each tool covers a distinct step in the workflow with no redundancy.

Completeness4/5

The surface covers the full workflow: verify places, place calls, handle consent, relay mid-call answers, and retrieve status. Minor gaps like canceling a call or listing history are not critical for the core purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers