Skip to main content

Overview

The Doris MCP server exposes the ontology as tools that AI assistants can call directly. Ask questions about deals, commitments, and stakeholders in natural language — the AI translates your question into the right ontology queries automatically. Endpoint: https://mcp.meetdoris.com/mcp Transport: Streamable HTTP Auth: OAuth 2.1 via your Doris login (Auth0). On first connection, a browser popup handles authentication.

Setup

Claude Code

Claude Desktop

Add to your MCP config (~/Library/Application Support/Claude/claude_desktop_config.json):

Cursor

Settings > Features > MCP > Add Server > Streamable HTTP > https://mcp.meetdoris.com/mcp

ChatGPT

Developer Mode > Add Connector > https://mcp.meetdoris.com/mcp

Windsurf

Add to your MCP configuration:

Available Tools

The MCP server exposes 10 tools that mirror the REST API — eight read tools and two write tools:

ontology_types

List all entity types or get the schema for a specific type. Example prompt: “What entity types are available in Doris?“

ontology_resolve

Resolve a single entity by type and ID, with optional expand keys for related data. Available expand keys for deals: stakeholders, commitments, objections, competitors, meetings, strategy, emails, agent_summary, activity, insights, assessments, brief, pipeline_stages Example prompt: “Show me the Acme deal with its stakeholders and open commitments”

ontology_list

List entities of a specific type with filtering, sorting, and expand support. Example prompt: “List all deals in the Negotiation stage with their commitments” Full-text search across all entity types. Example prompt: “Search for anything mentioning ‘pricing comparison’ across commitments”

ontology_batch

Resolve up to 50 entities in a single call. Example prompt: “Get details on deals deal_1, deal_2, and deal_3”

ontology_traverse

Follow relationships from one entity to discover connected entities. Example prompt: “What entities are linked to this deal?“

ontology_aggregate

Group-by aggregation over an object type — counts and metrics bucketed by a field. Example prompt: “How many deals are in each stage, and what’s the total value per stage?“

search_transcripts

Full-text search over meeting transcript turns — find exactly what was said and where. Example prompt: “Every time security came up in the Acme calls, what was said?”

Write Tools

Writes are a deliberately small, self-describing surface — just two tools. ontology_update makes typed field writes; ontology_action runs named domain actions (e.g. completing a commitment, moving a plan card). You never need a new tool per entity: capabilities are discovered live through ontology_types, which advertises each type’s writable_fields and actions — including each action’s name, description, and JSON-Schema params_schema. As new writable types and actions ship, an AI assistant learns them automatically the next time it inspects the schema, with no client changes.
Writes require the ontology:write scope. Reads only need ontology:read, which every token carries; ontology:write is granted only when your token actually holds it. A read-only token that calls a write tool is rejected with a forbidden error before anything is mutated.

ontology_update

Write typed fields on an entity. Only the fields a type lists under writable_fields are accepted — unknown or read-only fields are rejected (no mass-assignment). Returns {"ok": true, "id": ...} on success, or an error envelope (e.g. invalid_request, not_found, forbidden). Example prompt: “Push the due date on this commitment to next Friday”

ontology_action

Run a named domain action on an entity. Each type advertises its actions (and their parameter schemas) via ontology_types. Returns an {"ok": true, ...} envelope on success (shape varies by action), or an error envelope. First writable types and actions: Example prompt: “Mark the security-review commitment on the Acme deal as done”

Guardrails

  • No machine touches the buyer. Actions that could reach a buyer — such as remind on a plan card — are flagged buyer_facing and are denied to automated/agent callers. MCP calls are treated as agent-initiated, so these actions return forbidden; they only run on a human surface where a person initiates them.
  • Tenant-scoped. Every write is scoped to your tenant. The entity is loaded under your company before any mutation, so a request can never touch another tenant’s data — a foreign ID looks identical to a missing one (not_found).
  • Role-aware. Some actions (e.g. all roundtable writes) require the caller to hold the right role at the entity, such as a rep seat at the room.
Example: complete a commitment via JSON-RPC

Example Conversations

Once connected, you interact naturally:
You: “What commitments are overdue on the Acme deal?” The AI calls ontology_resolve with type_name="deal", finds the Acme deal, then expands commitments and filters for overdue status.
You: “Prep me for my 2pm with Globex” The AI calls ontology_search to find the Globex deal, then ontology_resolve with expand=["stakeholders", "commitments", "strategy", "meetings"] to assemble a full prep brief.
You: “Which deals have been in Discovery for more than 30 days?” The AI calls ontology_list with object_type="deal" and filters={"stage": "Discovery"}, then checks days_in_stage on each result.

Privacy

The MCP server automatically masks personally identifiable information before data reaches your AI tool. This means contact emails, phone numbers, and LinkedIn URLs are never exposed to external LLM providers.
MCP connections always use masked mode. This is enforced server-side and cannot be changed per-request. For full or anonymous access, use the REST API with the ?privacy= query parameter.

How masking works

  • No setup required — Masking is on by default for all MCP consumers.
  • Deal owners preserved — Your team’s names and emails on deals remain visible in masked mode, so you always know who owns a deal.
  • Expand keys respected — Stakeholder and email expansions are masked. Non-PII data (commitments, objections, competitors, strategy) passes through unchanged.
  • Anonymous mode — Stakeholders are replaced with role-based identifiers (e.g., “Champion #1”, “Evaluator #2”) and the email expansion is omitted entirely. Only available via the REST API.

Which fields are masked

When to use each level

Rate Limits

MCP uses the same tenant-level daily quota as the REST API, with endpoint-specific minute limits:
  • 10,000 requests/day per tenant
  • 300 req/min for resolve, list, and type operations
  • 120 req/min for search
  • 60 req/min for batch

Local Development

For local testing with MCP_DEV_MODE=true:
Dev mode accepts dev-token as a Bearer token without OAuth.