Skip to main content
Glama
sanjibani

Qualia MCP

by sanjibani

Qualia MCP

MCP server for the Qualia title and escrow platform -- talk to your orders, messages, and documents from Claude, Cursor, or any MCP client. First MCP in the title & escrow vertical.

What you can do with it

You:   "List orders awaiting closing and group by status."
Claude: *calls list_orders, summarises by status*

You:   "Send the buyer an update on the closing timeline for ORD-12345."
Claude: *calls send_message with subject + body, confirms the result*

You:   "What documents are attached to order ORD-98765?"
Claude: *calls list_documents, returns the file list*

Related MCP server: cursor-mcp-server

Why this exists

Qualia is the leading digital closing platform for the title & escrow industry. Their public Qualia API exposes a read-write GraphQL surface for placing orders, exchanging messages and documents, and pulling analytics -- but there was no MCP wrapper until now. Title & escrow shops run on tight margins and the manual data-entry tax is high; this MCP lets an AI agent drive Qualia the same way a human would.

Other title & escrow platforms (SoftPro, RamQuest, Resware) have no MCP either. This one targets Qualia specifically because it has the largest market share, a public GraphQL API, and a vendor partner program (partners@qualia.com).

Install

pip install -e .

Configure

export QUALIA_USERNAME="your-org-id"
export QUALIA_API_KEY="your-secret-key"

Capability gates must be enabled on your organization for the tools you need. Contact partners@qualia.com to request access. Write tools (send_message) will fail with CAPABILITY_GATE_MISSING until the gate is enabled.

Use with Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "qualia": {
      "command": "qualia_mcp",
      "env": {
        "QUALIA_USERNAME": "your-org-id",
        "QUALIA_API_KEY": "your-secret-key"
      }
    }
  }
}

Use with Claude Code

claude mcp add qualia -- qualia_mcp \
  --env QUALIA_USERNAME=your-org-id --env QUALIA_API_KEY=your-secret-key

Tools

Tool

Type

Capability gate

What it does

health_check

Diagnostic

none

Verifies credentials + GraphQL connectivity

get_organization

Read

organization:read

Returns the authenticated org (id, name, displayName)

list_orders

Read

orders:read

Paginated title orders with optional status filter

get_order

Read

orders:read

Single order detail (status, property address, timestamps)

list_messages

Read

messages:read

Messages on a title order (subject, body, author)

send_message

Write

messages:write

Post a new message on a title order

list_documents

Read

documents:read

Documents attached to a title order

Engineering notes

  • GraphQL + typed errors. Qualia returns 200 OK with an errors[] array on GraphQL validation failures. We promote those to typed exceptions (QualiaAuthError for CAPABILITY_GATE_MISSING / UNAUTHENTICATED, QualiaNotFoundError for NOT_FOUND, QualiaRateLimitError for RATE_LIMITED, generic QualiaGraphQLError otherwise) so agents can branch on cause instead of message text.

  • isError-compliance. Every tool raises on failure (instead of returning the error as a string). FastMCP's wire-level isError=true flag is only set when a tool raises, so the agent can distinguish failure from success.

  • JSONL audit logging. Every tool call writes a structured record to stderr (or a file path via QUALIA_AUDIT_LOG) for SOC2 auditability. Secret fields (api_key, password, token, etc.) are auto-redacted.

  • Retry with backoff. Transient 5xx and 429 responses retry up to 3 times with exponential backoff + full jitter, honoring Retry-After.

Development

pip install -e ".[dev]"
ruff check src tests
ruff format --check src tests
mypy src
pytest

License

MIT.

See also

Available Tools

7 tools
get_orderA

Return a single title order by id (status, property address, timestamps).

Use when: "look up order ORD-12345" or "what's the status of this closing?". Args: order_id: the Qualia order id (e.g. "ord_abc123"). Requires: orders:read capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior2/5

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

No annotations provided; description does not disclose read-only nature, idempotency, side effects, or rate limits. While it mentions a capability gate, it lacks sufficient behavioral context for an unannotated 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?

Extremely concise: 3 lines plus args list, front-loaded purpose, no redundant information. Every sentence is necessary.

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 is a simple single-order retrieval with one parameter and output schema exists, the description fully covers usage, parameter details, and auth requirements. No gaps.

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?

With 0% schema description coverage, the description compensates well by explaining the one parameter (order_id) with format and example ('Qualia order id e.g. ord_abc123'), adding meaning beyond the schema's title.

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?

Description clearly states 'Return a single title order by id' with specific fields (status, property address, timestamps), directly differentiating from siblings like list_orders for multiple orders.

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?

Provides explicit example queries ('look up order ORD-12345', 'what's the status of this closing?') and mentions required capability gate, but does not explicitly state when not to use (e.g., for listing multiple orders use list_orders).

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

get_organizationA

Return the authenticated Qualia organization (id, name, display name).

Use when: "what's my Qualia org id?" or "verify the org I'm authenticated as". Requires: organization:read capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations provided, so description carries burden. Discloses auth requirement and that it returns org info. Does not specify if data is cached or any side effects, but for a simple read operation this is adequate.

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 serving a purpose: what it returns, when to use, and requirements. No wasted 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?

Given output schema exists, description needn't detail return values. It mentions the return fields, and the capability gate suffices for context. Complete for a simple identification tool.

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?

No parameters in schema; description adds nothing about params. With 0 parameters, baseline is 4. No additional info needed.

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?

Clearly states it returns the authenticated Qualia organization with specific fields (id, name, display name). Differentiates from sibling tools like get_order and list_orders which handle different resources.

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?

Provides explicit use cases ('what's my Qualia org id?') and the required capability gate ('organization:read'). Lacks mention of when not to use, but context is clear.

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

health_checkA

Verify credentials work. If this fails, all other tools will too.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It states the tool verifies credentials, implying a read-only, non-destructive action. However, it does not describe what happens on success/failure (e.g., return format) or any additional behaviors like latency. Minimal but adequate for a health check.

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?

Two concise sentences with no wasted words. The key purpose is front-loaded, and the warning provides essential context 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 simple health check with zero parameters and an existing output schema, the description is complete. It explains the tool's purpose and its critical relationship to other tools. No additional details are necessary.

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 tool has no parameters, so the schema coverage is 100% and there is nothing to add. The description does not need to provide parameter information, making it fully sufficient.

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 'Verify credentials work,' which is a specific verb-verb and resource. It distinguishes itself from sibling tools (e.g., get_order, list_documents) by being a health check rather than a data retrieval or action tool. The warning that failure implies all other tools fail further clarifies its role.

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 implicitly recommends using this tool first, as 'If this fails, all other tools will too' strongly implies a prerequisite check. It does not explicitly mention alternatives, but given the sibling tools are all operational, the context is clear.

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

list_documentsA

List documents attached to a title order (name, mime, size, created).

Use when: "what documents are on this order?" or "did the buyer upload the LOI yet?". Args: order_id: the Qualia order id. limit: page size (default 25, max 100). Requires: documents:read capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 adds the requirement of 'documents:read capability gate', indicating it's a read operation. However, it omits details like error handling, pagination behavior, or that the operation is non-destructive. The permission note is helpful, but more transparency on behavioral traits would improve the score.

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 highly concise: the main action is stated in the first sentence, followed by usage contexts, parameter details, and a permission requirement. Every sentence adds necessary information without redundancy or fluff.

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 simple list tool with 2 parameters and an existing output schema, the description covers the key aspects: purpose, fields returned, parameter meanings, usage scenarios, and permission. It doesn't address error cases or pagination beyond the limit parameter, but overall it is sufficiently complete for an agent to invoke correctly.

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 description coverage is 0%, so the description compensates by explaining both parameters: order_id is 'the Qualia order id' and limit is 'page size (default 25, max 100)'. This adds significant meaning beyond the schema structure. However, it doesn't provide examples or format constraints beyond the default/max.

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 lists documents attached to a title order, specifying the fields returned (name, mime, size, created). It uses a specific verb and resource, and no sibling tool has similar functionality, making its purpose 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 provides concrete usage scenarios (e.g., 'what documents are on this order?' or 'did the buyer upload the LOI yet?'), guiding when to use. It could improve by explicitly mentioning when not to use or contrasting with siblings, but the given context is clear enough.

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

list_messagesA

List messages on a title order (most recent first).

Use when: "what's the latest message on this order?" or "show all messages from the buyer side". Args: order_id: the Qualia order id. limit: page size (default 25, max 100). Requires: messages:read capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 behavioral traits. It mentions ordering ('most recent first'), pagination limits (default 25, max 100), and auth requirement ('messages:read capability gate'). However, it does not discuss behavior for invalid order IDs, rate limits, or complete response structure. The output schema exists but is not referenced.

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 short and front-loaded with purpose. Each sentence adds value, though the phrase 'on a title order' is unclear and slightly distracting. Overall, it is concise without unnecessary words.

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 two parameters and presence of an output schema, the description covers key aspects: purpose, ordering, auth, and parameter details. It could clarify whether 'buyer side' implies filtering, and what 'title order' means, but it is largely complete for typical use.

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 has no descriptions (0% coverage), so the description must provide parameter meaning. It explains order_id as 'the Qualia order id' and limit as 'page size (default 25, max 100)', adding useful context beyond type and default.

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

Purpose4/5

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

The description clearly states the tool lists messages on an order with most recent first, and provides example use cases. However, the phrase 'on a title order' is ambiguous and appears to be a typo, slightly reducing clarity.

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?

Explicit use cases are given ('what's the latest message on this order?' or 'show all messages from the buyer side'), guiding appropriate invocation. It does not explicitly state when not to use or compare with siblings, but the context is sufficient.

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

list_ordersA

List title orders for the authenticated organization.

Use when: "show me the last 10 orders" or "list orders awaiting closing". Args: limit: page size (default 25, max 100). offset: skip N orders for pagination. status: optional filter -- e.g. "OPEN", "CLOSED", "CANCELLED". Requires: orders:read capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. Discloses auth requirement ('orders:read capability gate'), pagination defaults, and status filter. While it doesn't explicitly state read-only, the verb 'list' and auth gate imply it. Lacks detail on ordering or empty results.

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?

Concise and well-structured: one-line purpose, usage examples, args list, requirement. Could be slightly more compact by integrating use-when into purpose, but overall efficient.

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?

Covers auth, pagination, filtering. Does not mention that return is a list of orders (implied) or ordering. With output schema present, return details are not needed. Sibling tools are noted indirectly. Reasonably complete for a list tool.

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?

Schema has 0% description coverage, so description fully compensates. Explains limit (page size, default 25, max 100), offset (skip N), and status (optional filter with examples). Adds significant meaning beyond schema types and defaults.

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?

Clearly states 'List title orders for the authenticated organization' with a specific verb and resource. Differentiates from sibling tools like get_order (singular) and others.

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?

Provides concrete usage examples ('show me the last 10 orders', 'list orders awaiting closing'), giving clear context. Does not explicitly mention when not to use or contrast with get_order, but examples effectively guide the agent.

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

send_messageA

Post a message on a title order.

Use when: "send the buyer an update on the closing timeline" or "ask escrow to verify the wire instructions". Args: order_id: the Qualia order id. subject: short subject line (1-200 chars). body: message text (1-10000 chars). Plain text or basic markdown. Requires: messages:write capability gate.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
subjectYes
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations provided. Description says 'Post' (mutation) and mentions permission gate. Lacks details on delivery, side effects, or rate limits. Character constraints added.

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?

Concise with clear sections. Examples are helpful but could be shortened. Well-structured with purpose, usage, args, and requirement.

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

Completeness3/5

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

Output schema exists but not detailed. Lacks error handling, confirmation, or effect on order status. Adequate for a simple send action but could mention response format.

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 has 0% description coverage. Description adds crucial info: order_id is Qualia ID, subject length 1-200 chars, body length 1-10000 chars with markdown support. Compensates well for missing schema 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?

Clear verb 'Post a message on a title order' with specific examples. Distinguishes from list_messages which reads messages.

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?

Provides concrete use case examples ('send the buyer an update', 'ask escrow to verify'). Mentions capability gate requirement. No explicit when-not-to-use, but siblings imply reading vs. writing.

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 observedget_order
    • First observedget_organization
    • First observedhealth_check
    • First observedlist_documents
    • First observedlist_messages
    • First observedlist_orders
    • First observedsend_message

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: order retrieval, organization info, health check, document listing, message listing, order listing, and message sending. No overlapping functionalities.

Naming Consistency4/5

Most tools follow a verb_noun pattern (get_order, list_orders, send_message). 'health_check' is an exception but it's a common idiom. Overall consistent and predictable.

Tool Count5/5

With 7 tools, the set is well-scoped for a title order management API. Each tool covers a necessary function without bloat or deficiency.

Completeness4/5

Covers essential read operations and message sending. Missing CRUD operations for orders (create, update) but the domain focus appears to be monitoring and communication, so minor gap.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers