Skip to main content

Vued Public API, SDK, CLI, And MCP

This is the public-library contract for Vued API consumers.

Documentation Index

Fetch the local documentation index at docs/llms.txt. Use this file to discover all available Vued API pages before exploring further.

For Coding Agents

If you are a coding agent reading this page to help a developer integrate with Vued, read docs/vued-api-guide-for-coding-agents.md first. It is the copyable, self-contained reference optimized for implementation. If you need decrypted meetings, transcripts, or file names, use the local desktop API, Python SDK local methods, or local MCP. Do not build against cloud endpoints for plaintext transcript content. Just want working code? Use docs/vued-api-setup-prompt.md as the ready-to-paste coding-agent prompt, then customize from there.
  • Cloud API: encrypted authority for auth, ACL, metadata, mutations, vectors, signed audio, API keys, and webhooks.
  • Local API: localhost plaintext boundary exposed by the unlocked desktop app.
  • Python SDK: synchronous wrapper over cloud + local APIs.
  • MCP: local-first tool bridge over the desktop local API.

Install

pip install vued
export VUED_API_KEY="vued_live_..."
Development:
cd vued-python-sdk
uv sync
uv run python examples/test_public_api.py --org-id "<org_uuid>"

Auth

Cloud requests use Authorization: Bearer <token>. Accepted token types:
  • Supabase JWT: full user session, scopes *.
  • Public API key: vued_live_..., scoped by org:<org_uuid> plus explicit scopes.
Local requests use the bearer token in desktop discovery. The SDK reads it automatically. Discovery order:
  1. VUED_LOCAL_API_URL + VUED_LOCAL_API_TOKEN.
  2. VUED_LOCAL_API_DISCOVERY.
  3. OS app-support local-api.json under Vued Dev, Vued, vued-web, or legacy dev Electron.
Discovery shape:
{
  "host": "127.0.0.1",
  "port": 39391,
  "pid": 12345,
  "version": 1,
  "profile": "prod",
  "authToken": "run-local-secret",
  "startedAt": 1782345600000
}

Common Conventions

Timestamps are ISO UTC strings in public/local responses, for example 2026-06-22T22:00:00.000Z. SDK inputs accept ISO strings, epoch seconds, or epoch milliseconds where timestamp filters are supported. Pagination responses use:
FieldTypeMeaning
itemsarrayCurrent page.
next_cursorstring | nullCursor for the next page; null means done.
Meeting type is:
ValueMeaning
manualUser-started meeting record.
automaticSurfaced ambient candidate.
Speaker refs use:
FieldTypeMeaning
diarization_idstring | nullMeeting-local speaker cluster, such as speaker_1.
profile_idstring | nullPersistent speaker profile UUID.
namestringDisplay label.
typediarized | anonymous | namedSpeaker identity resolution level.
is_org_userboolean | absentTrue when the profile is linked to an org user.
Cloud responses add encrypted: true when encrypted fields remain. Unless X-Vued-Allow-Encrypted: true is sent, encrypted JSON responses fail with 424 EncryptedContent. Use the local API/SDK for decrypted names and transcripts.

Cloud Public API

Base URL: https://vued-office-api-dev.onrender.com/v1

Route Map

MethodRouteSDKRequired scopePurpose
GET/orgsclient.list_orgs()token authList accessible orgs.
GET/orgs/{org_id}/semantic_searchclient.semantic_search() fallbacktranscripts:read + meetings:read or records:readReturn vector chunk refs.
GET/orgs/{org_id}/meetings/{meeting_id}/audioclient.get_meeting_audio()meetings:read or records:readSigned meeting audio URL.
GET/orgs/{org_id}/transcripts/{transcript_id}/audioclient.get_transcript_audio()transcripts:readSigned transcript slice URL.
GET/orgs/{org_id}/filesclient.list_files() through local for plaintextfiles:read or records:readList drive nodes.
GET/orgs/{org_id}/files/{file_id}client.get_file() through local for plaintextfiles:read or records:readGet one drive node.
POST/orgs/{org_id}/filesclient.create_file()files:writeCreate drive node.
PATCH/orgs/{org_id}/files/{file_id}client.update_file()files:writeUpdate drive node.
GET/orgs/{org_id}/files/{file_id}/grantsclient.list_file_grants()files:read or records:readList direct user grants.
POST/orgs/{org_id}/files/{file_id}/grantsclient.grant_file()files:writeGrant direct user access.
DELETE/orgs/{org_id}/files/{file_id}/grants/{user_id}client.revoke_file_grant()files:writeRevoke direct user access.
GET/orgs/{org_id}/files/{file_id}/downloadclient.download_file()files:read or records:readDownload node export ZIP.
GET/orgs/{org_id}/speakersclient.list_speakers()speakers:read or records:readList named and anonymous speaker profiles.
GET/orgs/{org_id}/speakers/{speaker_id}client.get_speaker()speakers:read or records:readGet one speaker profile.
GET/orgs/{org_id}/roomsclient.list_rooms()rooms:read or records:readList rooms.
GET/orgs/{org_id}/rooms/{room_id}client.get_room()rooms:read or records:readGet one room.
POST/orgs/{org_id}/roomsclient.create_room()rooms:writeCreate room.
PATCH/orgs/{org_id}/rooms/{room_id}client.update_room()rooms:writeUpdate room and optionally participants.
GET/orgs/{org_id}/microphonesclient.list_microphones()rooms:read or records:readList microphone IDs from rooms.
GET/orgs/{org_id}/microphones/{microphone_id}client.get_microphone()rooms:read or records:readGet microphone-room mapping.
GET/orgs/{org_id}/usersclient.list_users()users:read or records:readList org users.
GET/orgs/{org_id}/users/{user_id}client.get_user()users:read or records:readGet one org user.
GET/orgs/{org_id}/api-keysclient.list_api_keys()api_keys:readList public API keys.
POST/orgs/{org_id}/api-keysclient.create_api_key()api_keys:writeCreate public API key.
DELETE/orgs/{org_id}/api-keys/{key_id}client.revoke_api_key()api_keys:writeRevoke public API key.
GET/orgs/{org_id}/webhooksclient.list_webhooks()webhooks:read + adminList webhooks.
POST/orgs/{org_id}/webhooksclient.create_webhook()webhooks:write + adminCreate webhook; returns secret once.
PATCH/orgs/{org_id}/webhooks/{webhook_id}client.update_webhook()webhooks:write + adminUpdate webhook.
DELETE/orgs/{org_id}/webhooks/{webhook_id}client.delete_webhook()webhooks:write + adminDelete webhook.

Cloud Query And Body Parameters

GET /orgs
ParamTypeMeaning
limitintegerPage size, 1-100. Default 50.
cursorstringPage cursor.
GET /orgs/{org_id}/semantic_search
ParamTypeMeaning
qstringNatural-language search query.
typemanual | automatic | nullMeeting source filter.
limitintegerResult count, 1-100. Default 5.
GET /orgs/{org_id}/meetings/{meeting_id}/audio
ParamTypeMeaning
redirectbooleanWhen true, return a 302 to the signed URL.
GET /orgs/{org_id}/transcripts/{transcript_id}/audio
ParamTypeMeaning
redirectbooleanWhen true, return a 302 to the signed URL.
GET /orgs/{org_id}/files
ParamTypeMeaning
typefile | folderNode type filter.
qstringCase-insensitive name substring.
parent_idUUIDParent folder filter.
root_onlybooleanOnly nodes with no parent.
visibilityorg | restrictedACL mode filter.
record_idUUIDLinked record filter.
created_aftertimestampInclusive lower bound.
created_beforetimestampInclusive upper bound.
updated_aftertimestampInclusive lower bound.
updated_beforetimestampInclusive upper bound.
sortstringname_asc, name_desc, updated_at_asc, updated_at_desc, created_at_asc, created_at_desc, date_asc, date_desc.
limitintegerPage size, 1-100. Default 50.
cursorstringPage cursor.
POST /orgs/{org_id}/files
FieldTypeMeaning
typestringNode type. Default folder.
namestringDisplay name, max 240 chars. Default Untitled.
parent_idUUID | nullParent folder. Null creates at root.
visibilitystringACL mode. Default org.
PATCH /orgs/{org_id}/files/{file_id}
FieldTypeMeaning
namestring | nullNew name, max 240 chars.
parent_idUUID | nullNew parent. Null moves to root. Omit to keep parent.
visibilitystring | nullNew ACL mode.
POST /orgs/{org_id}/files/{file_id}/grants
FieldTypeMeaning
user_idUUIDUser receiving direct access.
GET /orgs/{org_id}/speakers, GET /orgs/{org_id}/rooms, GET /orgs/{org_id}/users
ParamTypeMeaning
qstringCase-insensitive display-name/email filter where supported.
limitintegerPage size, 1-100. Default 50.
cursorstringPage cursor.
POST /orgs/{org_id}/rooms
FieldTypeMeaning
display_namestringRoom display name, max 160 chars.
microphone_idstringDevice/microphone ID, max 240 chars.
PATCH /orgs/{org_id}/rooms/{room_id}
FieldTypeMeaning
display_namestring | nullNew room name.
microphone_idstring | nullNew microphone/device ID.
is_primaryboolean | nullWhether this room is the primary ambient runner.
participant_user_idsUUID[] | nullReplace room participant users.
POST /orgs/{org_id}/api-keys
FieldTypeMeaning
namestringKey label, max 120 chars. Default Public API key.
expires_attimestamp | nullExpiration time. Null means no expiration.
scopesstring[]Requested scopes. Empty uses read-only defaults.
POST /orgs/{org_id}/webhooks
FieldTypeMeaning
namestringWebhook label, max 120 chars.
urlstringHTTPS delivery URL, max 1000 chars.
eventsstring[]Event names. Required non-empty.
payload_fieldsstring[] | object | nullFlat field list or a default / event / * field mapping. Empty means full payload.
disabledbooleanCreate disabled when true. Default false.
PATCH /orgs/{org_id}/webhooks/{webhook_id}
FieldTypeMeaning
namestring | nullNew label.
urlstring | nullNew delivery URL.
eventsstring[] | nullReplace subscribed events.
payload_fieldsstring[] | object | nullReplace field selection.
disabledboolean | nullEnable/disable delivery.

Cloud Response Schemas

Org
FieldTypeMeaning
idstringOrg UUID.
namestringOrg display name.
roleowner | admin | memberCaller role.
settingsobjectOrg settings.
SemanticSearchResult
FieldTypeMeaning
objectsemantic_search_resultObject type.
scorenumberVector score.
meetingobject{id, object, type} meeting ref.
chunkobjectChunk ref.
TranscriptChunk
FieldTypeMeaning
objecttranscript_chunkObject type.
indexinteger | nullChunk index.
event_idsstring[]Transcript event IDs in the chunk.
ts_startnumber | nullStart offset/time from source event data.
ts_endnumber | nullEnd offset/time from source event data.
AudioUrl
FieldTypeMeaning
availablebooleanTrue when audio can be downloaded.
urlstringSigned URL. Present on success.
expires_atnumberURL expiry epoch seconds.
retention_daysintegerAudio retention window.
filenamestringSuggested download filename, usually <slice_id>.m4a.
mimestringAudio MIME type, usually audio/mp4 for M4A/AAC.
offset_secsobject | absent{start, end} inside slice audio.
suggested_clip_secsobject | absent{start, end, margin_secs} clip around the event.
partialboolean | absentTrue when selected slice does not cover the full requested range.
File
FieldTypeMeaning
idstringNode UUID.
objectfileObject type.
encryptedbooleanTrue when encrypted fields remain.
typefile | folderNode kind.
namestringPlaintext name when available.
name_encobject | null{ciphertext, aad} encrypted name.
parent_idstring | nullParent folder UUID.
visibilitystringACL mode.
record_typemeeting | nullLinked public record kind.
record_idstring | nullLinked record UUID.
share_idstring | nullPublic share identifier.
created_atstringCreated timestamp.
updated_atstringUpdated timestamp.
Speaker
FieldTypeMeaning
idstringSpeaker profile UUID.
objectspeakerObject type.
typeanonymous | namedProfile kind.
display_namestringDisplay name.
sample_countinteger | nullEnrollment sample count.
statusstring | nullProfile status.
is_org_userboolean | nullTrue when linked to an org user.
created_atstring | nullCreated timestamp.
updated_atstring | nullUpdated timestamp.
Room
FieldTypeMeaning
idstringRoom UUID.
objectroomObject type.
display_namestringRoom label.
microphone_idstringDevice/microphone ID.
is_primarybooleanPrimary ambient runner flag.
participantsarrayRoom participant users.
created_atstring | nullCreated timestamp.
updated_atstring | nullUpdated timestamp.
Microphone
FieldTypeMeaning
idstringMicrophone/device ID.
objectmicrophoneObject type.
room_idstringOwning room UUID.
OrgUser
FieldTypeMeaning
idstringUser UUID.
objectorg_userObject type.
emailstringEmail.
display_namestring | nullDisplay name.
roleowner | admin | memberOrg role.
created_atstring | nullCreated timestamp.
updated_atstring | nullUpdated timestamp.
PublicApiKey
FieldTypeMeaning
idstringKey UUID.
namestringKey label.
keyPrefixstringVisible secret prefix.
scopesstring[]Granted scopes.
createdAtnumberCreated epoch seconds.
lastUsedAtnumber | nullLast use epoch seconds.
expiresAtnumber | nullExpiry epoch seconds.
revokedAtnumber | nullRevocation epoch seconds.
CreatedPublicApiKey
FieldTypeMeaning
tokenPublicApiKeyStored key metadata.
secretstringFull vued_live_... secret. Shown once.
Webhook
FieldTypeMeaning
idnumberWebhook ID.
objectwebhookObject type.
namestringLabel.
org_idstringOrg UUID.
created_bystringCreator user UUID.
urlstringDelivery URL.
eventsstring[]Subscribed events.
payload_fieldsobjectField selection by event/default.
created_atstringCreated timestamp.
disabledbooleanDelivery disabled flag.
fail_countintegerConsecutive failure count.
last_delivery_atstring | nullLast attempt timestamp.
last_success_atstring | nullLast success timestamp.
last_failure_atstring | nullLast failure timestamp.
last_errorstring | nullLast failure message.
secretstring | absentSigning secret, create response only.

Cloud Examples

curl -H "Authorization: Bearer $VUED_API_KEY" \
  "https://vued-office-api-dev.onrender.com/v1/orgs"
curl -H "Authorization: Bearer $VUED_API_KEY" \
  "https://vued-office-api-dev.onrender.com/v1/orgs/$ORG_ID/semantic_search?q=pricing&limit=5"
curl -X POST "https://vued-office-api-dev.onrender.com/v1/orgs/$ORG_ID/files" \
  -H "Authorization: Bearer $VUED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"folder","name":"Customer calls","visibility":"restricted"}'

Local Desktop API

Base URL: http://127.0.0.1:<discovered_port> The desktop app must be open, signed in, and unlocked. Responses contain decrypted local cache data.

Route Map

MethodRouteSDKMCP toolPurpose
GET/healthlocal discovery proben/aLocal daemon status.
GET/v1/filesclient.list_files()n/aList decrypted drive nodes.
GET/v1/files/{file_id}client.get_file()n/aGet decrypted drive node.
GET/v1/meetingsclient.list_meetings()list_meetingsList decrypted meetings.
GET/v1/meetings/{meeting_id}client.get_meeting()get_meetingGet meeting + transcript.
GET/v1/meetings/{meeting_id}/audiolocal audio proxyn/aProxy cloud signed meeting audio URL.
GET/v1/transcripts/{transcript_id}client.get_transcript()get_transcriptGet transcript event + meeting ref.
GET/v1/transcripts/{transcript_id}/audiolocal audio proxyn/aProxy cloud signed transcript audio URL.
POST/v1/searchclient.search()searchKeyword search decrypted cache.
POST/v1/semantic_searchclient.semantic_search()semantic_searchCloud vector search + local hydration.
POST/mcpvued mcp stdio shimMCP transportJSON-RPC MCP endpoint.

Local Parameters

GET /v1/meetings
ParamTypeMeaning
org_idUUID | nullOrg filter. Omit when only one org is cached.
typemanual | automatic | nullMeeting source filter.
started_aftertimestampInclusive lower bound.
started_beforetimestampInclusive upper bound.
room_idstringRoom filter.
microphone_idstringMicrophone/device filter.
file_idstringDrive node filter.
limitintegerPage size, 1-1000. Default 100.
cursorstringPage cursor.
GET /v1/files uses the same filters as cloud GET /orgs/{org_id}/files, plus decrypted names. POST /v1/search
FieldTypeMeaning
org_idUUID | nullOrg filter.
qstringKeyword query. Alias: query.
typemanual | automatic | nullMeeting source filter.
include_transcriptbooleanSearch transcript lines when true. Default true.
limitintegerResult count, 1-200. Default 20.
POST /v1/semantic_search
FieldTypeMeaning
org_idUUID | nullOrg filter; required when multiple orgs are cached.
qstringNatural-language query. Alias: query.
typemanual | automatic | nullMeeting source filter.
limitintegerResult count, 1-50. Default 5.

Local Response Schemas

Meeting
FieldTypeMeaning
idstringRecord UUID.
objectmeetingObject type.
typemanual | automaticMeeting source.
titlestringDecrypted title.
summarystringDecrypted summary.
statusstringRecord status.
started_atstring | nullStart timestamp.
ended_atstring | nullEnd timestamp.
roomobject | null{id, display_name}.
microphone_idstring | nullDevice/microphone ID.
participantsSpeakerRef[]Named/anonymous speakers only.
diarized_speaker_countintegerDiarized speaker cluster count.
recognized_speaker_countintegerResolved speaker count.
audio.availablebooleanWhether retained audio is known.
transcript_event_countintegerTranscript event count.
TranscriptEvent
FieldTypeMeaning
idstringTranscript event UUID.
indexinteger | nullLine index.
startstring | nullEvent start timestamp.
endstring | nullEvent end timestamp.
speakerSpeakerRefNormalized speaker.
textstringDecrypted text.
GetMeetingResponse
FieldTypeMeaning
meetingMeetingMeeting metadata.
transcript.textstringPlain transcript text.
transcript.eventsTranscriptEvent[]Transcript line events.
GetTranscriptResponse
FieldTypeMeaning
eventTranscriptEvent | nullTranscript event.
meetingobject | null{id, type, title, started_at} parent ref.
SearchResult
FieldTypeMeaning
meetingMeetingMatching meeting.
matchesarrayTranscript matches. Empty when transcript search disabled.
SearchMatch
FieldTypeMeaning
eventTranscriptEventMatching transcript event.
snippetstringSearch-only snippet.
HydratedSemanticSearchResult
FieldTypeMeaning
objectsemantic_search_resultObject type.
scorenumberVector score.
meetingMeeting | objectHydrated meeting or {id,type} fallback.
chunk.indexinteger | nullChunk index.
chunk.event_idsstring[]Event IDs.
chunk.eventsTranscriptEvent[]Hydrated events.
chunk.textstringHydrated chunk text.
chunk.ts_startnumber | nullChunk start.
chunk.ts_endnumber | nullChunk end.
hydratedbooleanTrue when local plaintext was found.

Local Examples

DISCOVERY="$HOME/Library/Application Support/Vued/local-api.json"
PORT=$(jq -r .port "$DISCOVERY")
TOKEN=$(jq -r .authToken "$DISCOVERY")

curl -H "Authorization: Bearer $TOKEN" \
  "http://127.0.0.1:$PORT/v1/meetings?limit=10"
curl -X POST "http://127.0.0.1:$PORT/v1/search" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"q":"paid ads cost","limit":5}'

Python SDK

Constructor

from vued import Vued

client = Vued(
    api_key="vued_live_...",
    org_id="00000000-0000-0000-0000-000000000000",
    base_url="https://vued-office-api-dev.onrender.com/v1",
    timeout=30.0,
)
ParamTypeMeaning
api_keystringSupabase JWT or vued_live_... key.
org_idstring | nullDefault org for org-scoped calls. Required for most methods.
base_urlstringCloud /v1 base URL.
timeoutfloatHTTP timeout seconds.

Method Map

SDK callHTTP routeReturns
list_orgs(**filters)GET /v1/orgspage of Org.
search(q, type=None, include_transcript=True, limit=20)local POST /v1/searchpage of SearchResult.
semantic_search(q, type=None, limit=5)local POST /v1/semantic_search; cloud fallbackpage of semantic results.
list_meetings(...)local GET /v1/meetingspage of Meeting.
get_meeting(meeting_id)local GET /v1/meetings/{meeting_id}GetMeetingResponse.
get_transcript(transcript_id)local GET /v1/transcripts/{transcript_id}GetTranscriptResponse.
get_meeting_audio(meeting_id)cloud GET /v1/orgs/{org_id}/meetings/{meeting_id}/audioAudioUrl.
get_transcript_audio(transcript_id)cloud GET /v1/orgs/{org_id}/transcripts/{transcript_id}/audioAudioUrl.
list_files(...)local GET /v1/filespage of File.
get_file(file_id)local GET /v1/files/{file_id}File.
create_file(...)cloud POST /v1/orgs/{org_id}/filesFile.
update_file(...)cloud PATCH /v1/orgs/{org_id}/files/{file_id}File.
list_file_grants(file_id, limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/files/{file_id}/grantspage of grants.
grant_file(file_id, user_id)cloud POST /v1/orgs/{org_id}/files/{file_id}/grantsgrant object.
revoke_file_grant(file_id, user_id)cloud DELETE /v1/orgs/{org_id}/files/{file_id}/grants/{user_id}{deleted}.
download_file(file_id)cloud GET /v1/orgs/{org_id}/files/{file_id}/downloadZIP bytes.
list_speakers(q=None, limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/speakerspage of Speaker.
get_speaker(speaker_id)cloud GET /v1/orgs/{org_id}/speakers/{speaker_id}Speaker.
list_rooms(q=None, limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/roomspage of Room.
get_room(room_id)cloud GET /v1/orgs/{org_id}/rooms/{room_id}Room.
create_room(display_name, microphone_id)cloud POST /v1/orgs/{org_id}/roomsRoom.
update_room(...)cloud PATCH /v1/orgs/{org_id}/rooms/{room_id}Room.
list_microphones(limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/microphonespage of Microphone.
get_microphone(microphone_id)cloud GET /v1/orgs/{org_id}/microphones/{microphone_id}Microphone.
list_users(q=None, limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/userspage of OrgUser.
get_user(user_id)cloud GET /v1/orgs/{org_id}/users/{user_id}OrgUser.
list_api_keys(limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/api-keyspage of PublicApiKey.
create_api_key(...)cloud POST /v1/orgs/{org_id}/api-keysCreatedPublicApiKey.
revoke_api_key(key_id)cloud DELETE /v1/orgs/{org_id}/api-keys/{key_id}{deleted}.
list_webhooks(limit=50, cursor=None)cloud GET /v1/orgs/{org_id}/webhookspage of Webhook.
create_webhook(...)cloud POST /v1/orgs/{org_id}/webhooksWebhook with secret.
update_webhook(...)cloud PATCH /v1/orgs/{org_id}/webhooks/{webhook_id}Webhook.
delete_webhook(webhook_id)cloud DELETE /v1/orgs/{org_id}/webhooks/{webhook_id}{deleted}.

SDK Examples

from vued import Vued

client = Vued(api_key="vued_live_...", org_id="...")

results = client.search("paid ads cost", limit=10)
meeting = client.get_meeting(results["items"][0]["meeting"]["id"])
audio = client.get_meeting_audio(meeting["meeting"]["id"])
folder = client.create_file(name="Customer calls", type="folder", visibility="restricted")
client.update_file(folder["id"], parent_id=None)
client.grant_file(folder["id"], "user_uuid")
created = client.create_webhook(
    name="Meeting webhook",
    url="https://example.com/vued",
    events=["meeting.finalized"],
    payload_fields={"default": ["meeting", "timestamps", "title", "summary"]},
)
print(created["secret"])

CLI

The package installs one command:
vued mcp
Development:
cd vued-python-sdk
uv run vued mcp
vued mcp reads MCP JSON-RPC messages from stdio, forwards request/response messages to local POST /mcp, and exits when stdin closes. It has no other subcommands.

MCP

Local MCP

Local MCP is the supported decrypted-content path. Transport:
vued mcp
Direct desktop shim:
node web-client/electron/vued-mcp-node.js
The Node shim can wake the desktop app. Useful env vars:
Env varMeaning
VUED_LOCAL_API_URLExplicit local API base URL.
VUED_LOCAL_API_TOKENExplicit local API bearer token.
VUED_LOCAL_API_DISCOVERYExplicit discovery file.
VUED_MCP_WAKE_TIMEOUT_MSDesktop wake wait, default 8000.
VUED_MCP_NO_WAKE=1Disable desktop auto-wake.
VUED_MCP_TRACEJSONL trace file path.
MCP protocol methods:
MethodResult
initializeProtocol version, tools capability, server {name:"vued-local", version:"1"}.
pingEmpty success.
tools/listTool definitions below.
tools/callTool result as JSON text content.
resources/listEmpty list.
prompts/listEmpty list.
MCP tools:
ToolArgsReturns
searchquery required; org_id, type, include_transcript, limit optionalLocal SearchResult page.
semantic_searchquery required; org_id, type, limit optionalHydrated semantic page.
list_meetingsorg_id, type, started_after, started_before, room_id, microphone_id, file_id, cursor, limit optionalLocal meeting page.
get_meetingmeeting_id required; org_id, type optionalGetMeetingResponse.
get_transcripttranscript_id requiredGetTranscriptResponse.
Tool argument limits:
ArgLimit
search.limit1-200, default 20.
semantic_search.limit1-50, default 5.
list_meetings.limit1-1000, default 100.

MCP Install Syntax

Local desktop installer writes client config for supported apps. Manual local config:
{
  "mcpServers": {
    "vued": {
      "command": "vued",
      "args": ["mcp"]
    }
  }
}
Cloud MCP token management exists at internal /api/v1/mcp/tokens. The settings UI currently shows these install snippets for a remote /mcp endpoint:
claude mcp add --transport http aircaps https://vued-office-api-dev.onrender.com/mcp \
  --header "Authorization: Bearer aircaps_mcp_live_..."
codex mcp add aircaps --env AUTH_HEADER="Bearer aircaps_mcp_live_..." -- \
  npx -y mcp-remote@latest https://vued-office-api-dev.onrender.com/mcp \
  --header "Authorization:${AUTH_HEADER}"
Checked source does not define a server /mcp route. Treat local MCP as canonical until remote MCP is implemented.

Webhooks

Supported event types:
EventMeaning
meeting.startedMeeting started.
meeting.endedMeeting ended.
meeting.transcription.completedTranscription completed.
meeting.speaker_id.completedSpeaker identification completed.
meeting.finalizedMeeting finalized.
meeting.automatic.surfacedAutomatic meeting surfaced.
Supported payload fields:
FieldMeaning
meetingMeeting identity and metadata.
timestampsStart/end timing.
roomRoom metadata.
participantsMeeting participant list.
speakersSpeaker list.
audio_metadataAudio availability/metadata.
transcript_textFull transcript text.
transcript_eventsTranscript event list.
summaryMeeting summary.
topicsTopic list.
titleMeeting title.
Webhook payload:
FieldTypeMeaning
idstringEvent ID, evt_....
objecteventObject type.
typestringEvent type.
created_atstringEvent creation timestamp.
org_idstringOrg UUID.
data.objectmeetingData object type.
data.idstringMeeting UUID.
data.*mixedSelected payload fields.
Signature:
HeaderMeaning
Vued-Webhook-TimestampUnix timestamp used in signature.
Vued-Signaturet=<timestamp>,v1=<hex_hmac_sha256>.
Verification:
import hashlib
import hmac

timestamp = request.headers["Vued-Webhook-Timestamp"]
signature = request.headers["Vued-Signature"].split("v1=", 1)[1]
body = request.get_data()
expected = hmac.new(
    b"whsec_...",
    timestamp.encode() + b"." + body,
    hashlib.sha256,
).hexdigest()
ok = hmac.compare_digest(signature, expected)

Scope Reference

ScopeGrants
records:readRead fallback for meetings, transcripts, files, speakers, rooms, users.
meetings:readMeeting audio and semantic meeting refs.
transcripts:readSemantic search and transcript audio.
files:readFile/folder reads, grants, downloads.
files:writeFile/folder create/update/grant/revoke.
speakers:readSpeaker profile reads.
rooms:readRoom and microphone reads.
rooms:writeRoom create/update.
users:readOrg user reads.
webhooks:readWebhook reads.
webhooks:writeWebhook create/update/delete.
api_keys:readPublic API key reads.
api_keys:writePublic API key create/revoke.
org:<org_uuid>Restricts key to one org.
*Supabase JWT full-session scope.
Last modified on June 29, 2026