Skip to main content

MCP Tool Reference

The BuildBetter MCP server exposes 21 tools that give AI agents structured access to your calls, signals, people, documents, knowledge base, and raw GraphQL. This page documents every tool.

Key Terminology

TermDefinition
Signal / ExtractionAn AI-extracted insight from a call, conversation, or document (e.g. a bug, feature request, complaint, testimonial).
InterviewBuildBetter’s internal term for a call or recording.
PersonaA user segment label (e.g. Team Member, Customer, Enterprise).
Knowledge PageA markdown wiki page in the BuildBetter knowledge base.

Call Tools

search-calls

Search for calls by optional phrase and/or date range. Without a phrase, returns the most recent calls.
ParameterTypeRequiredDescription
phrasestringNoMatches against call name/title. Does not search transcript content.
fromDateISO stringNoLower bound timestamp (e.g. 2026-01-01T00:00:00Z).
toDateISO stringNoUpper bound timestamp.
limitintegerNoMax results. Default: 20.
phrase only matches call names/titles — not transcript content. To search what was discussed inside calls, use search-signals or search-extractions instead.
// Get recent calls
search-calls({ limit: 10 })

// Find calls in a date range
search-calls({ fromDate: "2026-01-01T00:00:00Z", toDate: "2026-03-01T00:00:00Z", limit: 20 })

get-call

Get full details for a single call including summary, attendees, tags, and a sample of signals.
ParameterTypeRequiredDescription
idintegerYesCall ID (from search-calls).
signalLimitintegerNoHow many signals to include. Default: 20.
get-call({ id: 20784, signalLimit: 10 })

get-call-transcript

Returns the full speaker-attributed transcript for a call, broken into monologue segments with start/end timestamps.
ParameterTypeRequiredDescription
idintegerYesCall ID (from search-calls).
Check hasTranscript in the response before trying to render or search the transcript. Use startSec to build deep-link URLs to specific moments in the call.

Signal / Extraction Tools

Signals are the core data object in BuildBetter — AI-extracted insights from any ingested content. They have types, topics, keywords, sentiment, severity, bias scores, and person/company linkage.

list-signal-types

Returns all configured signal (extraction) types.
list-signal-types({ limit: 100 })

// Returns 35 types including:
// achievement, actionItem, blockers, bug, challenge, change, competition,
// complaint, compliment, concern, confusion, customerInsight, decision,
// dependency, discovery, feature, featureRequest, feedback, idea, improvement,
// inquiry, interest, issue, milestone, objection, observation, opportunity,
// priority, question, risk, strategic, strategy, suggestion, testimonial, update

search-signals

Search signals by phrase and optionally filter by type, call, or persona. This is the preferred tool for content searches — use it instead of searching calls.
ParameterTypeRequiredDescription
phrasestringNoSearches signal summaries and content.
typestringNoFilter by signal type name (e.g. featureRequest, bug, complaint).
callIdintegerNoRestrict results to signals from one specific call.
personaIdsinteger[]NoFilter by persona IDs.
limitintegerNoMax results. Default: 20.
// Search all signals mentioning 'churn'
search-signals({ phrase: 'churn', limit: 10 })

// Only feature requests mentioning 'API'
search-signals({ phrase: 'API', type: 'featureRequest', limit: 20 })

// All signals from a specific call
search-signals({ callId: 20784, limit: 50 })

search-extractions

Identical parameters to search-signals. Use this as a reliable alternative if search-signals encounters a loading issue.
search-extractions({ phrase: 'pricing objection', type: 'objection', limit: 10 })

list-extractions

Structured list endpoint for extractions with full filter, select, order, and pagination support.
ParameterTypeRequiredDescription
whereobjectNoHasura-style filter object.
selectstring[]NoFields to include. Defaults to all standard fields.
orderByarray[]NoSort order. Default: [['date', 'desc']].
pageintegerNoPage number for pagination. Default: 1.
limitintegerNoResults per page. Default: 20.
Nested relationship filters (e.g. filtering by type name) may be ignored. Use search-signals or search-extractions with the type parameter for type-based filtering instead.
list-extractions({
  limit: 20,
  page: 1,
  orderBy: [['severity', 'desc']],
  select: ['id', 'name', 'summary', 'severity', 'date']
})

list-extraction-filter-fields

Returns all metadata fields available from connected integrations (Salesforce, Pendo, HubSpot, etc.) that can be used to filter signals.
list-extraction-filter-fields({ limit: 100, page: 1 })

list-signal-properties

Returns custom properties configured for the signal/extraction entity type. These are workspace-level schema definitions, not signal values.

search-signal-property-values

Search the actual taxonomy/property values that have been auto-filled onto signals. Useful for finding signals tagged with specific taxonomy nodes.
ParameterTypeRequiredDescription
phrasestringNoSearch across taxonomy display values.
propertyNamestringNoFilter by property name (e.g. 'Product Taxonomy').
propertySlugstringNoFilter by property slug (e.g. 'product-taxonomy').
signalIdintegerNoGet all property values for one specific signal.
callIdintegerNoRestrict to signals from one call.
limitintegerNoMax results. Default: 20.
search-signal-property-values({ phrase: 'dashboard', limit: 10 })

People Tools

search-people

Search for person records by name, email, title, or department. Optionally filter by persona ID.
ParameterTypeRequiredDescription
phrasestringYesSearch term (name, email, title, department).
personaIdsinteger[]NoFilter by persona IDs.
limitintegerNoMax results. Default: 20.
search-people({ phrase: 'morgan', limit: 5 })
The same person may appear multiple times if they exist in multiple integration sources (e.g. BuildBetter + GitHub + Salesforce).

search-people-properties

Search CRM-enriched person property values. Returns job history, skills, titles, and other enrichment data linked to person records.
ParameterTypeRequiredDescription
phrasestringYesSearch term across all property values.
limitintegerNoMax results. Default: 20.
search-people-properties({ phrase: 'enterprise', limit: 5 })

Document Tools

search-documents

Search AI-generated documents by phrase. Can optionally include full document content in results.
ParameterTypeRequiredDescription
phrasestringYesSearch term across document name, content, and instructions.
includeContentbooleanNoIf true, returns full markdown content. Default: false.
sourcestringNoFilter by source (e.g. 'ai_generated', 'notion_import').
statusstringNoFilter by status (e.g. 'completed', 'processing').
limitintegerNoMax results. Default: 20.
// Search without content (fast)
search-documents({ phrase: 'onboarding', limit: 10 })

// Include full content (slower, larger response)
search-documents({ phrase: 'brex', includeContent: true, limit: 5 })

get-document

Fetch a single document by ID, including its full markdown content.
ParameterTypeRequiredDescription
idintegerYesDocument ID (from search-documents).
get-document({ id: 2872 })

Knowledge Base Tools

search-knowledge-pages

Search the internal knowledge base (wiki-style pages) by title or content.
ParameterTypeRequiredDescription
querystringYesSearch query. Use short 1–2 word terms for best results.
limitintegerNoMax results. Default: 20.
This tool uses keyword matching, not semantic search. Short, broad queries work best (e.g. 'pricing', 'workflows'). Long phrases may return 0 results — try a single-word subset instead.
search-knowledge-pages({ query: 'pricing', limit: 5 })

get-knowledge-page

Fetch a single knowledge page by ID with full plain-text content and any child page references.
ParameterTypeRequiredDescription
idintegerYesPage ID (from search-knowledge-pages).
get-knowledge-page({ id: 34 })

GraphQL Tools

For advanced queries not covered by the domain-specific tools above. The schema exposes ~700 types covering the full BuildBetter data model.

list-types

Returns all available GraphQL object types in the current authenticated context. Useful for discovering what data is queryable.
list-types()

find-fields

Returns all field names and their types for a specific GraphQL type. Use this before build-query or run-query to know what fields are available.
ParameterTypeRequiredDescription
typeNamestringYesGraphQL type name (from list-types).
find-fields({ typeName: 'interview' })

build-query

Generates a valid Hasura-style GraphQL query string for a given type and set of fields. Does not execute the query — pass the output to run-query.
ParameterTypeRequiredDescription
typeNamestringYesGraphQL type to query.
fieldsstring[]YesFields to include in the query.
limitintegerNoRecord limit to embed in the query.
filterobjectNoHasura where clause to embed.
build-query({
  typeName: 'interview',
  fields: ['id', 'name', 'recorded_at', 'summary_state', 'source'],
  limit: 10
})

run-query

Executes a raw, read-only GraphQL query against the BuildBetter schema. This is the most powerful and flexible tool — use it when domain tools don’t cover your use case.
ParameterTypeRequiredDescription
querystringYesValid GraphQL query string.
variablesobjectNoGraphQL variables object.
Recommended workflow for GraphQL:
  1. list-types() — discover available types
  2. find-fields({ typeName }) — discover fields for a type
  3. build-query({ typeName, fields, limit }) — generate query string
  4. run-query({ query }) — execute and get results
run-query({
  query: `query GetRecentCalls {
    interview(limit: 5, order_by: {recorded_at: desc}) {
      id
      name
      recorded_at
      summary_state
      source
    }
  }`
})

  1. Get recent calls: search-calls({ limit: 20 })
  2. Pull signals by topic: search-signals({ phrase: 'API integration', type: 'featureRequest', limit: 30 })
  3. Get full call context: get-call({ id: <id>, signalLimit: 50 })
  4. Read transcript for quotes: get-call-transcript({ id: <id> })
  5. Find relevant docs: search-documents({ phrase: 'integration', includeContent: false })
  1. Find person: search-people({ phrase: 'carol@company.com' })
  2. Get their signals: search-signals({ phrase: 'customer name', limit: 20 })
  3. Get enrichment data: search-people-properties({ phrase: 'company name' })
  1. Discover types: list-types()
  2. Explore fields: find-fields({ typeName: 'extraction' })
  3. Generate query: build-query({ typeName: 'extraction', fields: ['id', 'name', 'sentiment', 'severity'], limit: 10 })
  4. Execute query: run-query({ query: '<output from build-query>' })
  1. Browse pages: search-knowledge-pages({ query: 'pricing' })
  2. Get full page: get-knowledge-page({ id: 34 })
  3. Find related signals: search-signals({ phrase: 'pricing objection', type: 'objection' })

Signal Schema Reference

Every signal returned by search-signals, search-extractions, get-call, and list-extractions shares this schema:
FieldTypeDescription
idstringUnique signal ID.
namestringShort title of the signal (AI-generated).
summarystring1–2 sentence summary of the insight.
contextstringAdditional context explaining why this was extracted.
dateISO timestampWhen the source content was created.
sentimentintegerSentiment score: -10 (very negative) to +10 (very positive).
severityintegerSeverity score: 0 (low) to 10 (critical).
biasintegerBias score: -10 (heavily biased) to 0 (unbiased). Null if not applicable.
types[]object[]Signal types (e.g. featureRequest, bug). Each has id and name.
topics[]object[]Topics associated with the signal. Each has id and name.
keywords[]object[]Keywords extracted from the signal. Each has id and name.
personobjectPerson who generated the signal: id, firstName, lastName, email, avatarUrl.
person.companyobjectCompany linked to the person (may be null).
person.personaobjectPersona of the person (may be null).
dataobjectSource data reference: id, type (conversation/interview), source (github/zoom/slack/etc).

Tool Status Overview

ToolStatusNotes
search-callsWorkingPhrase matches names only, not content.
get-callWorkingRich: summary, attendees, signals, tags, source.
get-call-transcriptWorkingFull speaker-attributed transcript with timestamps.
list-signal-typesWorkingReturns all 35 configured signal types.
search-signalsWorkingPreferred for content searches.
search-extractionsWorkingAlias of search-signals.
list-extractionsWorkingNested where filters on types may be ignored.
list-extraction-filter-fieldsWorkingReturns all CRM/integration metadata fields.
list-signal-propertiesWorkingReturns workspace-level property definitions.
search-signal-property-valuesWorkingReturns taxonomy-tagged values per signal.
search-peopleWorkingReturns person records with persona, email, source, company.
search-people-propertiesWorkingReturns CRM enrichment (job history, skills, etc).
search-documentsWorkingSearches name + content. Supports source and status filters.
get-documentWorkingReturns full markdown content + metadata.
search-knowledge-pagesWorkingKeyword-sensitive — short queries work best.
get-knowledge-pageWorkingReturns full content + child page IDs.
list-typesWorkingReturns ~700 GraphQL types in the schema.
find-fieldsWorkingReturns all fields + types for any GraphQL type.
build-queryWorkingGenerates a valid GraphQL query string — does not execute it.
run-queryWorkingExecutes raw read-only GraphQL. Returns live data.

Last updated March 2026