_ registry / mcp streamable-http · checked 1h ago

receiptor-mcp

https://mcp.receiptor.ai

Registry code: 7f03fb8cda56d90d

api record

Receipt and invoice management: searches extracted documents, manages merchants and legal entities, runs automations and exports, and sends documents to Xero or QuickBooks.

endpoint
https://mcp.receiptor.ai/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is receiptor-mcp live?
Yes — it answered the hub's last check (checked 1h ago). It answered 99% of checks over the last 30 days.
Is receiptor-mcp free to use?
Partly — some of its tools are open, others need a key or payment.
What tools does receiptor-mcp have?
79 tools: entities_merge, documents_unarchive, integrations_reconcile, sources_mobile-scanners_disable-ai, workspace_get_context, workspace_switch, documents_bulk-edit, documents_resolve-duplicates, ….
Is receiptor-mcp safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
98.5%

90 days 98.6%· all time 98.6%

latency
111ms

last good check

priced tools
0

of 79 tools

_ answered our checks, 90 days 415 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
_ what it is for
used for
  • search receipts and invoices
  • send documents to xero or quickbooks
  • manage merchants and legal entities
  • export documents
  • run automations on documents
takes → gives
documents, text → data, documents
tools
13 reads12 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 79 tools
1 open21 auth-required 57 never probed 22 of 79 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • get_server_info reads open 36d ago

    Get information about the Receiptor MCP server

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • billing_listHistory auth-required 42d ago

    List invoices and one-off charges for the authenticated user's own billing account. This does not expose another workspace owner's invoice history.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 100,
          "maximum": 100,
          "minimum": 1
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "startingAfter": {
          "type": "string",
          "minLength": 1
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 31 lines
  • billing_get auth-required 42d ago

    Get billing account and subscription details for the active workspace, or the user's own billing account when no workspace is active.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "includeUsage": {
          "type": "boolean",
          "default": true
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeFeatures": {
          "type": "boolean",
          "default": true
        },
        "includeUpcomingInvoice": {
          "type": "boolean",
          "default": true
        }
      }
    }
    arguments 33 lines
  • activity_search reads auth-required 36d ago

    Search past source activity logs across email, WhatsApp, uploads, and forwarded inbound email. For email sources, this first searches connected providers, then cross-checks matching message IDs against stored activity logs and returns any saved processing reasoning. Forwarded inbound email is matched directly against stored activity by its alias address.

    mcp-tool

    {
      "type": "object",
      "required": [
        "query",
        "context",
        "llm_model"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "description": "Page number for paginated results."
        },
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 50,
          "minimum": 1,
          "description": "Maximum number of activity items to return."
        },
        "query": {
          "type": "string",
          "minLength": 2,
          "description": "Natural-language or exact search query such as merchant, sender, or invoice keyword."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "statuses": {
          "type": "array",
          "items": {
            "enum": [
              "queued",
              "processed",
              "skipped",
              "failed",
              "processing",
              "warning"
            ],
            "type": "string"
          },
          "description": "Optional activity statuses to include."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "sourceTypes": {
          "type": "array",
          "items": {
            "enum": [
              "email",
              "whatsapp",
              "upload",
              "inbound-email"
            ],
            "type": "string"
          },
          "default": [
            "email",
            "whatsapp",
            "upload",
            "inbound-email"
          ],
          "description": "Which source activity types to search."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "providerResultLimit": {
          "type": "integer",
          "default": 25,
          "maximum": 100,
          "minimum": 1,
          "description": "Maximum number of provider search matches to cross-check before filtering activity logs."
        },
        "includeSourceDetails": {
          "type": "boolean",
          "default": true,
          "description": "Whether to reload matching provider messages for richer email details like subject, sender, and snippet."
        }
      }
    }
    arguments 86 lines
  • help-center_search auth-required 36d ago

    Search public Receiptor help-center documentation for setup, troubleshooting, and product how-to answers. Returns grouped article results with the most relevant snippets.

    mcp-tool

    {
      "type": "object",
      "required": [
        "query",
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 3,
          "maximum": 10,
          "minimum": 1,
          "description": "Maximum number of help-center articles to return."
        },
        "query": {
          "type": "string",
          "minLength": 2,
          "description": "Natural language help-center query such as 'connect gmail', 'imap not connecting', or 'does receiptor send emails'."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "snippetsPerResult": {
          "type": "integer",
          "default": 2,
          "maximum": 3,
          "minimum": 1,
          "description": "Maximum number of matching snippets to keep for each help-center article."
        }
      }
    }
    arguments 41 lines
  • approvals_get auth-required 36d ago

    Get the details of a pending or resolved approval request by ID.

    mcp-tool

    {
      "type": "object",
      "required": [
        "approvalRequestId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "approvalRequestId": {
          "type": "string",
          "minLength": 1,
          "description": "The approval request ID."
        }
      }
    }
    arguments 27 lines
  • documents_get reads auth-required 36d ago

    Retrieve a single document by ID with full details. Returns all extracted fields including merchant info, line items, amounts, file URL, and source.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The document ID to fetch"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • documents_list-duplicates reads auth-required 42d ago

    List existing duplicate document groups for the current workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1,
          "description": "Maximum duplicate groups to return"
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Number of duplicate groups to skip"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 34 lines
  • documents_scan-duplicates auth-required 42d ago

    Scan active unresolved documents in the current workspace for likely duplicate groups. Read-only: returns possible duplicate groups and recommends which documents to keep.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1,
          "description": "Maximum candidate duplicate groups to return"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 28 lines
  • documents_inspect auth-required 36d ago

    Inspect the original document file (image/PDF) with a vision model and compare visible values against the saved document fields.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Document ID to inspect"
        },
        "fields": {
          "type": "array",
          "items": {
            "enum": [
              "merchant",
              "amount",
              "currency",
              "docDate",
              "invoiceId",
              "receiptId",
              "taxAmount",
              "subtotal",
              "paymentMethod",
              "category",
              "summary",
              "docType"
            ],
            "type": "string"
          },
          "description": "Specific fields to inspect from file. Defaults to core financial fields."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "maxPages": {
          "type": "integer",
          "default": 3,
          "maximum": 5,
          "minimum": 1,
          "description": "For PDFs, maximum pages to inspect (1-5). Defaults to 3."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 55 lines
  • documents_count auth-required 42d ago

    Count documents and aggregate data. Use for spending totals and financial analysis. Supports grouping by merchant, category, date, export status, etc. Gets ALL matching documents.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "where": {
          "type": "object",
          "required": [
            "conditions"
          ],
          "properties": {
            "logic": {
              "enum": [
                "and",
                "or"
              ],
              "type": "string",
              "default": "and"
            },
            "conditions": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "field",
                  "op"
                ],
                "properties": {
                  "op": {
                    "enum": [
                      "eq",
                      "ne",
                      "gt",
                      "gte",
                      "lt",
                      "lte",
                      "in",
                      "nin",
                      "regex",
                      "exists"
                    ],
                    "type": "string"
                  },
                  "field": {
                    "enum": [
                      "id",
                      "amount",
                      "docDate",
                      "merchant",
                      "category",
                      "docType",
                      "invoiceId",
                      "receiptId",
                      "preferredCurrency",
                      "currency",
                      "paymentStatus",
                      "paymentMethod",
                      "paymentMethodEnding",
                      "fromEmail",
                      "toEmail",
                      "summary",
                      "expenseLocation.primary.countryCode",
                      "expenseLocation.primary.country",
                      "expenseLocation.primary.city",
                      "expenseLocation.primary.stateOrProvince",
                      "expenseLocation.primary.kind",
                      "taxAmount",
                      "subtotal",
                      "isRecurring",
                      "recurringType",
                      "entityId"
                    ],
                    "type": "string"
                  },
                  "value": {}
                },
                "additionalProperties": false
              },
              "minItems": 1
            }
          },
          "description": "Typed filter clause. Allowed fields: id, amount, docDate, merchant, category, docType, invoiceId, receiptId, preferredCurrency, currency, paymentStatus, paymentMethod, paymentMethodEnding, fromEmail, toEmail, summary, expenseLocation.primary.countryCode, expenseLocation.primary.country, expenseLocation.primary.city, expenseLocation.primary.stateOrProvince, expenseLocation.primary.kind, taxAmount, subtotal, isRecurring, recurringType, entityId. Allowed ops: eq, ne, gt, gte, lt, lte, in, nin, regex, exists. Regex filters are already case-insensitive, so pass plain values like \"grab\" instead of inline flags like \"(?i)grab\".",
          "additionalProperties": false
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "groupBy": {
          "enum": [
            "merchant",
            "category",
            "docType",
            "currency",
            "preferredCurrency",
            "paymentMethod",
            "paymentMethodEnding",
            "paymentStatus",
            "entityId",
            "docDate",
            "expenseLocation.primary.countryCode",
            "expenseLocation.primary.country",
            "expenseLocation.primary.city",
            "expenseLocation.primary.stateOrProvince",
            "expenseLocation.primary.kind",
            "exportStatus"
          ],
          "type": "string",
          "description": "Aggregation key. Allowed values: merchant, category, docType, currency, preferredCurrency, paymentMethod, paymentMethodEnding, paymentStatus, entityId, docDate, expenseLocation.primary.countryCode, expenseLocation.primary.country, expenseLocation.primary.city, expenseLocation.primary.stateOrProvince, expenseLocation.primary.kind, exportStatus. Use exportStatus to summarize exported vs not-exported documents."
        },
        "archived": {
          "enum": [
            "exclude",
            "only",
            "include"
          ],
          "type": "string",
          "default": "exclude",
          "description": "Archive filter: exclude (default, active docs), only (archived docs), include (both)."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "exportStatus": {
          "enum": [
            "all",
            "exported",
            "not-exported"
          ],
          "type": "string",
          "description": "Optional export status filter before aggregation"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 141 lines
  • currency_convert reads auth-required 36d ago

    Convert amounts between different currencies. Uses current rates by default, or historical rates for a specific date.

    mcp-tool

    {
      "type": "object",
      "required": [
        "amount",
        "fromCurrency",
        "toCurrency",
        "context",
        "llm_model"
      ],
      "properties": {
        "date": {
          "type": "string",
          "description": "Optional date for historical rates (YYYY-MM-DD format). Defaults to current rates if not provided."
        },
        "amount": {
          "type": "number",
          "description": "The amount to convert"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "toCurrency": {
          "type": "string",
          "description": "The target currency code (e.g., 'USD', 'EUR', 'IDR')"
        },
        "fromCurrency": {
          "type": "string",
          "description": "The source currency code (e.g., 'USD', 'EUR', 'IDR')"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 40 lines
  • automations_list reads auth-required 42d ago

    List automations with name, status, trigger type, and execution stats.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1,
          "description": "Number of automations to return (max 50)"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeDisabled": {
          "type": "boolean",
          "default": false,
          "description": "Include disabled automations in results"
        }
      }
    }
    arguments 33 lines
  • context_readiness auth-required 42d ago

    Get workspace context readiness for categorization, including missing business profile, tax, chart of accounts, and entity setup fields.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • context_requests_list reads auth-required 42d ago

    List pending request-for-context records that are blocking categorization.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 50,
          "minimum": 1
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "subjectType": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 37 lines
  • context_requests_group auth-required 42d ago

    Group pending request-for-context records by suggested account, account, merchant, or document type.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 50,
          "minimum": 1
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • chartOfAccounts_list auth-required 42d ago

    List Charts of Accounts available to the current workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "default": 1,
          "minimum": 1
        },
        "limit": {
          "type": "integer",
          "default": 25,
          "maximum": 200,
          "minimum": 1
        },
        "search": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeAccounts": {
          "type": "boolean",
          "default": false
        }
      }
    }
    arguments 41 lines
  • chartOfAccounts_listAccounts reads auth-required 42d ago

    List or search accounts from the active chart of accounts for the current workspace so the agent can ground categorization decisions.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 100,
          "maximum": 100,
          "minimum": 1
        },
        "query": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "chartId": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "includeIds": {
          "type": "boolean",
          "default": false
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 41 lines
  • entities_review_consolidation auth-required 42d ago

    Review possible legal entity consolidation groups without making changes.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "maxEntities": {
          "type": "integer",
          "default": 200,
          "maximum": 500,
          "minimum": 1,
          "description": "Maximum number of entities to scan for consolidation candidates"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 28 lines
  • entities_list auth-required 42d ago

    List and search legal entities with pagination.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "page": {
          "type": "number",
          "default": 1,
          "description": "Page number"
        },
        "limit": {
          "type": "number",
          "default": 25,
          "description": "Results per page (max 50)"
        },
        "search": {
          "type": "string",
          "description": "Search term to filter entities by name, address, or aliases"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 35 lines
  • documents_search reads auth-required 42d ago

    Search, filter, and retrieve user's documents. Supports text search, filtering by document type, export status, date ranges, sorting, and semantic similarity. Use documents.count for totals or grouped summaries across all matching documents.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 5,
          "maximum": 100,
          "minimum": 1,
          "description": "Maximum documents to return (1-100)"
        },
        "query": {
          "type": "string",
          "description": "Text query (used only when useSearch=true). Omit in filter-only mode."
        },
        "where": {
          "type": "object",
          "required": [
            "conditions"
          ],
          "properties": {
            "logic": {
              "enum": [
                "and",
                "or"
              ],
              "type": "string",
              "default": "and"
            },
            "conditions": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "field",
                  "op"
                ],
                "properties": {
                  "op": {
                    "enum": [
                      "eq",
                      "ne",
                      "gt",
                      "gte",
                      "lt",
                      "lte",
                      "in",
                      "nin",
                      "regex",
                      "exists"
                    ],
                    "type": "string"
                  },
                  "field": {
                    "enum": [
                      "id",
                      "amount",
                      "docDate",
                      "merchant",
                      "category",
                      "docType",
                      "invoiceId",
                      "receiptId",
                      "preferredCurrency",
                      "currency",
                      "paymentStatus",
                      "paymentMethod",
                      "paymentMethodEnding",
                      "fromEmail",
                      "toEmail",
                      "summary",
                      "expenseLocation.primary.countryCode",
                      "expenseLocation.primary.country",
                      "expenseLocation.primary.city",
                      "expenseLocation.primary.stateOrProvince",
                      "expenseLocation.primary.kind",
                      "taxAmount",
                      "subtotal",
                      "isRecurring",
                      "recurringType",
                      "entityId"
                    ],
                    "type": "string"
                  },
                  "value": {}
                },
                "additionalProperties": false
              },
              "minItems": 1
            }
          },
          "description": "Typed filter clause. Allowed fields: id, amount, docDate, merchant, category, docType, invoiceId, receiptId, preferredCurrency, currency, paymentStatus, paymentMethod, paymentMethodEnding, fromEmail, toEmail, summary, expenseLocation.primary.countryCode, expenseLocation.primary.country, expenseLocation.primary.city, expenseLocation.primary.stateOrProvince, expenseLocation.primary.kind, taxAmount, subtotal, isRecurring, recurringType, entityId. Allowed ops: eq, ne, gt, gte, lt, lte, in, nin, regex, exists. Regex filters are already case-insensitive, so pass plain values like \"grab\" instead of inline flags like \"(?i)grab\".",
          "additionalProperties": false
        },
        "sortBy": {
          "enum": [
            "receivedAt",
            "docDate",
            "amount",
            "merchant",
            "createdAt",
            "updatedAt"
          ],
          "type": "string",
          "default": "docDate",
          "description": "Sort field (receivedAt, docDate, amount, merchant, createdAt, updatedAt)"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "archived": {
          "enum": [
            "exclude",
            "only",
            "include"
          ],
          "type": "string",
          "default": "exclude",
          "description": "Archive filter: exclude (default, active docs), only (archived docs), include (both)."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "sortOrder": {
          "type": "number",
          "default": -1,
          "description": "Sort order: 1 asc, -1 desc"
        },
        "useSearch": {
          "type": "boolean",
          "default": true,
          "description": "Enable semantic/text search"
        },
        "outputMode": {
          "enum": [
            "compact",
            "complete"
          ],
          "type": "string",
          "default": "compact",
          "description": "Response shape: compact (default) or complete"
        },
        "searchType": {
          "enum": [
            "similarity",
            "mmr"
          ],
          "type": "string",
          "default": "mmr",
          "description": "Search mode when useSearch=true: similarity (exact-ish) or mmr (broader)"
        },
        "exportStatus": {
          "enum": [
            "all",
            "exported",
            "not-exported"
          ],
          "type": "string",
          "description": "Export status filter"
        },
        "requiredFields": {
          "type": "array",
          "items": {
            "enum": [
              "id",
              "merchant",
              "amount",
              "currency",
              "preferredCurrency",
              "conversionRate",
              "date",
              "docDate",
              "receivedAt",
              "category",
              "docType",
              "summary",
              "expenseLocation",
              "invoiceId",
              "receiptId",
              "paymentStatus",
              "entityId",
              "entityName",
              "exportStatus",
              "link"
            ],
            "type": "string"
          },
          "default": [],
          "description": "Always include these extra fields (in addition to outputMode defaults). Allowed fields: id, merchant, amount, currency, preferredCurrency, conversionRate, date, docDate, receivedAt, category, docType, summary, expenseLocation, invoiceId, receiptId, paymentStatus, entityId, entityName, exportStatus, link."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 201 lines
  • integrations_list auth-required 36d ago

    List available integrations for the user. Can filter by category (email, accounting, storage, social, banking) and status. Returns integration IDs needed for sendToIntegration, reconcileWithIntegration, and other operations.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "status": {
          "enum": [
            "active",
            "disconnected"
          ],
          "type": "string",
          "description": "Filter by integration status"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "category": {
          "enum": [
            "email",
            "accounting",
            "storage",
            "social",
            "banking"
          ],
          "type": "string",
          "description": "Filter by integration category"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 40 lines
  • entities_merge unknown never probed

    Merge multiple legal entities into one. Reassigns all linked documents to the kept entity, adds merged entity names as aliases, and deletes the duplicates.

    mcp-tool

    {
      "type": "object",
      "required": [
        "keepEntityId",
        "mergeEntityIds",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "keepEntityId": {
          "type": "string",
          "description": "ID of the legal entity to keep as the canonical record"
        },
        "mergeEntityIds": {
          "type": "array",
          "items": {
            "$ref": "#/properties/keepEntityId"
          },
          "minItems": 1,
          "description": "IDs of legal entities to merge into the kept entity. Their names become aliases and linked documents are reassigned."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 35 lines
  • documents_unarchive unknown never probed

    Restore a previously archived document so it is active again.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The archived document ID to restore"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • integrations_reconcile unknown never probed

    Reconcile a document (receipt/invoice) with a supported banking integration such as Mercury. Requires integrationId. targetId is optional for Mercury. Set dryRun=true (default) to preview, dryRun=false to queue for reconciliation.

    mcp-tool

    {
      "type": "object",
      "required": [
        "documentId",
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, shows preview without reconciling. If false, queues the document for reconciliation."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "targetId": {
          "type": "string",
          "description": "Optional target ID from listIntegrations. Use for Mercury account IDs when narrowing reconciliation."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "description": "The receipt/invoice document ID to reconcile"
        },
        "integrationId": {
          "type": "string",
          "description": "The banking integration ID to reconcile with (use listIntegrations to find)"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 40 lines
  • sources_mobile-scanners_disable-ai unknown never probed

    Disable WhatsApp AI assistant replies for a mobile scanner without changing document processing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "scannerId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "scannerId": {
          "type": "string",
          "minLength": 1,
          "description": "The mobile scanner ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • workspace_get_context reads unknown never probed

    Get the current workspace context (user, org, role, and effective ownership scope).

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • workspace_switch unknown never probed

    Validate a target workspace and switch the active workspace for this MCP OAuth session.

    mcp-tool

    {
      "type": "object",
      "required": [
        "orgId",
        "context",
        "llm_model"
      ],
      "properties": {
        "orgId": {
          "type": "string",
          "description": "Target organization/workspace ID"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 26 lines
  • documents_bulk-edit unknown never probed

    Bulk edit documents. Supports dry-run preview (default) and execute modes. Preview returns matching documents with proposed changes and available merchants/categories for context.

    mcp-tool

    {
      "type": "object",
      "required": [
        "changes",
        "context",
        "llm_model"
      ],
      "properties": {
        "query": {
          "type": "string",
          "description": "Search query to find documents (optional)"
        },
        "where": {
          "type": "object",
          "required": [
            "conditions"
          ],
          "properties": {
            "logic": {
              "enum": [
                "and",
                "or"
              ],
              "type": "string",
              "default": "and"
            },
            "conditions": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "field",
                  "op"
                ],
                "properties": {
                  "op": {
                    "enum": [
                      "eq",
                      "ne",
                      "gt",
                      "gte",
                      "lt",
                      "lte",
                      "in",
                      "nin",
                      "regex",
                      "exists"
                    ],
                    "type": "string"
                  },
                  "field": {
                    "enum": [
                      "id",
                      "amount",
                      "docDate",
                      "merchant",
                      "category",
                      "docType",
                      "invoiceId",
                      "receiptId",
                      "preferredCurrency",
                      "currency",
                      "paymentStatus",
                      "paymentMethod",
                      "paymentMethodEnding",
                      "fromEmail",
                      "toEmail",
                      "summary",
                      "expenseLocation.primary.countryCode",
                      "expenseLocation.primary.country",
                      "expenseLocation.primary.city",
                      "expenseLocation.primary.stateOrProvince",
                      "expenseLocation.primary.kind",
                      "taxAmount",
                      "subtotal",
                      "isRecurring",
                      "recurringType",
                      "entityId"
                    ],
                    "type": "string"
                  },
                  "value": {}
                },
                "additionalProperties": false
              },
              "minItems": 1
            }
          },
          "description": "Typed filter clause for targeted bulk edits. Allowed fields: id, amount, docDate, merchant, category, docType, invoiceId, receiptId, preferredCurrency, currency, paymentStatus, paymentMethod, paymentMethodEnding, fromEmail, toEmail, summary, expenseLocation.primary.countryCode, expenseLocation.primary.country, expenseLocation.primary.city, expenseLocation.primary.stateOrProvince, expenseLocation.primary.kind, taxAmount, subtotal, isRecurring, recurringType, entityId. Allowed ops: eq, ne, gt, gte, lt, lte, in, nin, regex, exists.",
          "additionalProperties": false
        },
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, shows preview without making changes. If false, executes the bulk edit."
        },
        "changes": {
          "type": "object",
          "properties": {
            "labels": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 64,
                "minLength": 1
              },
              "maxItems": 50,
              "description": "Replace labels with this exact set"
            },
            "category": {
              "type": "string",
              "description": "New category to apply"
            },
            "entityId": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ],
              "description": "Legal entity ID to assign to matching documents. Use null to clear it."
            },
            "merchant": {
              "type": "string",
              "description": "New vendor/supplier/merchant name to apply. Not for 'Billed to'."
            },
            "paymentStatus": {
              "enum": [
                "paid",
                "unpaid",
                "partial",
                "refunded",
                "unknown"
              ],
              "type": "string",
              "description": "New payment status to apply"
            },
            "shouldClearLabels": {
              "type": "boolean",
              "description": "If true, remove all labels from matching documents"
            }
          },
          "description": "Changes to apply to matching documents",
          "additionalProperties": false
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "category": {
          "type": "string",
          "description": "Specific category to filter for editing"
        },
        "merchant": {
          "type": "string",
          "description": "Specific merchant to filter for editing"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 100,
          "minItems": 1,
          "description": "Exact document IDs to edit. Use this for deterministic single-document or hand-picked multi-document edits."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 183 lines
  • documents_resolve-duplicates unknown never probed

    Analyze a selected set of documents as possible duplicates. Use dryRun=true (default) to preview which document should be kept first. Use dryRun=false with masterId set to the document ID the user chose to keep.

    mcp-tool

    {
      "type": "object",
      "required": [
        "documentIds",
        "context",
        "llm_model"
      ],
      "properties": {
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, preview duplicate resolution. If false, keep the chosen document and archive the duplicates."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "masterId": {
          "type": "string",
          "description": "The document ID to keep. Required only when dryRun=false and must be one of documentIds."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentIds": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "maxItems": 20,
          "minItems": 2,
          "description": "Document IDs to analyze as a possible duplicate set"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 41 lines
  • documents_unlink-duplicate unknown never probed

    Remove one document from its duplicate group. If the selected document is the group master, the remaining duplicates are either dissolved or reassigned to a replacement master.

    mcp-tool

    {
      "type": "object",
      "required": [
        "documentId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "minLength": 1,
          "description": "Document ID to remove from its duplicate group"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "replacementMasterId": {
          "type": "string",
          "minLength": 1,
          "description": "Optional duplicate child ID to promote when unlinking the current master"
        }
      }
    }
    arguments 32 lines
  • documents_delete unknown never probed

    Soft-delete a document (receipt, invoice, etc.). The document is archived and can be recovered. Also archives any duplicate documents and cleans up cross-references.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The document ID to delete"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • files_upload unknown never probed

    Upload a receipt, invoice, or financial document for processing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "fileName",
        "mimeType",
        "base64Data",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "fileName": {
          "type": "string",
          "minLength": 1,
          "description": "Original file name including extension"
        },
        "mimeType": {
          "enum": [
            "image/jpeg",
            "image/png",
            "image/gif",
            "image/webp",
            "image/bmp",
            "image/tiff",
            "application/pdf"
          ],
          "type": "string",
          "description": "MIME type of the file"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "base64Data": {
          "type": "string",
          "minLength": 1,
          "description": "Base64-encoded file content"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 47 lines
  • integrations_unlink unknown never probed

    Unlink a document from an integration (supports Xero and QuickBooks). Set dryRun=true (default) to preview, including invoice details and orphaned attachments. Set dryRun=false to execute. This action is IRREVERSIBLE.

    mcp-tool

    {
      "type": "object",
      "required": [
        "documentId",
        "exportRecordId",
        "context",
        "llm_model"
      ],
      "properties": {
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, shows preview without making changes. If false, executes the unlinking."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "description": "The receipt history document ID"
        },
        "exportRecordId": {
          "type": "string",
          "description": "The export record ID linking the document to the integration"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 36 lines
  • automations_execute unknown never probed

    Create an automation from a natural language description. Approval includes the generated automation details before creation.

    mcp-tool

    {
      "type": "object",
      "required": [
        "naturalLanguageAutomation",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "naturalLanguageAutomation": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "description": "Natural language description of the automation to create"
        }
      }
    }
    arguments 28 lines
  • automations_disable changes data unknown never probed

    Disable an automation without deleting it.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The ID of the automation to disable"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • views_list unknown never probed

    List saved document views for the current workspace. These saved views can be reused by automations and workflows.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 100,
          "minimum": 1,
          "description": "Maximum views to return"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 28 lines
  • views_delete unknown never probed

    Delete a saved document view. Use this when a saved filter preset is no longer needed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Saved view ID to delete"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • workspaces_list unknown never probed

    List available workspaces (organizations) for the authenticated user.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • workspace_context_patch unknown never probed

    Update workspace business profile and location/tax context fields used for categorization readiness.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "country": {
          "type": "string"
        },
        "industry": {
          "type": "string"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "subindustry": {
          "type": "string"
        },
        "businessSize": {
          "type": "string"
        },
        "businessType": {
          "type": "string"
        },
        "revenueModel": {
          "type": "string"
        },
        "annualRevenue": {
          "type": "string"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "taxRequirements": {
          "type": "string"
        },
        "tracksInventory": {
          "type": "boolean"
        },
        "businessLocations": {
          "type": "string"
        },
        "exportPreferences": {
          "type": "array",
          "items": {
            "enum": [
              "xero",
              "quickbooks",
              "mercury",
              "google-drive",
              "google-sheets",
              "dropbox",
              "pdf-export",
              "csv-export",
              "zip-export",
              "email-forward"
            ],
            "type": "string"
          }
        },
        "separateReporting": {
          "type": "boolean"
        },
        "differentCountries": {
          "type": "boolean"
        },
        "jurisdictionTracking": {
          "type": "boolean"
        },
        "sellsPhysicalProducts": {
          "type": "boolean"
        },
        "primaryExpenseCategories": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "hasManufacturingWholesale": {
          "type": "boolean"
        }
      }
    }
    arguments 90 lines
  • context_requests_resolve unknown never probed

    Resolve one request-for-context.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hitlRequestId",
        "action",
        "context",
        "llm_model"
      ],
      "properties": {
        "action": {
          "anyOf": [
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "leave_uncategorized"
                  ],
                  "type": "string"
                },
                "reason": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action",
                "context"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "provide_context"
                  ],
                  "type": "string"
                },
                "context": {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                "saveAsMemory": {
                  "type": "boolean",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "archive_document"
                  ],
                  "type": "string"
                },
                "archiveReason": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "suggest_account"
                  ],
                  "type": "string"
                },
                "suggestedAccount": {
                  "type": "object",
                  "required": [
                    "name"
                  ],
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 120,
                      "minLength": 1
                    },
                    "rationale": {
                      "type": "string",
                      "maxLength": 500
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 255
                    },
                    "accountNumber": {
                      "type": "string",
                      "maxLength": 50
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          ]
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "hitlRequestId": {
          "type": "string",
          "minLength": 1
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 135 lines
  • exports_create changes data unknown never probed

    Preview or queue document exports using the same behavior as the in-app Export dropdown. Supports CSV/PDF/ZIP to the user's registered email, email forwarding, and connected export integrations. Use filters or viewId for broad exports. Use docIds only for exact selections of 10 or fewer documents.

    mcp-tool

    {
      "type": "object",
      "required": [
        "format",
        "context",
        "llm_model"
      ],
      "properties": {
        "dateTo": {
          "type": "string",
          "description": "End date filter (ISO format)"
        },
        "docIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10,
          "description": "Specific document IDs to export. Maximum 10; use export filters for larger exports."
        },
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "Preview matching documents when true; queue the export when false"
        },
        "format": {
          "enum": [
            "csv",
            "pdf",
            "zip",
            "forward",
            "xero",
            "quickbooks",
            "mercury",
            "google-drive",
            "google-sheets",
            "dropbox"
          ],
          "type": "string",
          "description": "Export destination/format to queue"
        },
        "labels": {
          "type": "string",
          "description": "Comma-separated label filter"
        },
        "search": {
          "type": "string",
          "description": "Search query filter"
        },
        "viewId": {
          "type": "string",
          "minLength": 1,
          "description": "Saved document view ID to use as the export filter source"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "docType": {
          "type": "string",
          "description": "Comma-separated document type filter, e.g. receipt,invoice"
        },
        "dateFrom": {
          "type": "string",
          "description": "Start date filter (ISO format)"
        },
        "targetId": {
          "type": "string",
          "description": "Tenant/company/account target ID for integrations"
        },
        "forwardTo": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "email"
          },
          "description": "Recipient emails for forward exports"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "merchants": {
          "type": "string",
          "description": "Comma-separated merchant filter"
        },
        "customFields": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Custom CSV field names"
        },
        "csvTemplateId": {
          "type": "string",
          "description": "CSV template ID"
        },
        "integrationId": {
          "type": "string",
          "description": "Integration ID for accounting/storage exports"
        },
        "paymentStatus": {
          "type": "string",
          "description": "Comma-separated payment status filter, e.g. paid,unpaid"
        },
        "timeCapsuleId": {
          "type": "string",
          "description": "Retroactive Scan/time capsule ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeLineItems": {
          "type": "boolean",
          "default": false,
          "description": "Include line items in CSV export"
        },
        "storageNamingFormat": {
          "type": "string",
          "minLength": 1,
          "description": "ZIP storage naming format"
        }
      }
    }
    arguments 125 lines
  • exports_get unknown never probed

    Get one export record by ID for the current workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The export record ID to fetch"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • retroactiveExtractions_getEstimate reads unknown never probed

    Fetch the current status of a Retroactive Scan estimate by jobId. Returns queued/active/completed/failed status, in-flight progress, and the final result when completed.

    mcp-tool

    {
      "type": "object",
      "required": [
        "jobId",
        "context",
        "llm_model"
      ],
      "properties": {
        "jobId": {
          "type": "string",
          "minLength": 1,
          "description": "The estimation job ID returned by retroactiveExtractions.estimate."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • referrals_get_or_create unknown never probed

    Get the authenticated user's referral link and stats, creating their referral profile only when missing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • sources_email_list reads unknown never probed

    List email sources connected to the account, including provider and monitoring status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeInactive": {
          "type": "boolean",
          "description": "Include inactive/disconnected email sources. Default: false (active only)"
        }
      }
    }
    arguments 25 lines
  • sources_mobile-scanners_list unknown never probed

    List mobile scanners connected to the account, including activation and AI chat status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeInactive": {
          "type": "boolean",
          "description": "Include inactive/deactivated scanners. Default: false (active only)"
        }
      }
    }
    arguments 25 lines
  • sources_email_enable-monitoring unknown never probed

    Enable monitoring for an email source to resume syncing new receipts and invoices.

    mcp-tool

    {
      "type": "object",
      "required": [
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "integrationId": {
          "type": "string",
          "minLength": 1,
          "description": "The email integration ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_email_delete unknown never probed

    Delete an email source from the account and stop monitoring it permanently.

    mcp-tool

    {
      "type": "object",
      "required": [
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "integrationId": {
          "type": "string",
          "minLength": 1,
          "description": "The email integration ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_email_disable-monitoring unknown never probed

    Disable monitoring for an email source without removing the connection.

    mcp-tool

    {
      "type": "object",
      "required": [
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "integrationId": {
          "type": "string",
          "minLength": 1,
          "description": "The email integration ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_mobile-scanners_activate changes data unknown never probed

    Activate a mobile scanner so documents from that number are processed again.

    mcp-tool

    {
      "type": "object",
      "required": [
        "scannerId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "scannerId": {
          "type": "string",
          "minLength": 1,
          "description": "The mobile scanner ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_mobile-scanners_enable-ai changes data unknown never probed

    Enable WhatsApp AI assistant replies for a mobile scanner without changing document processing.

    mcp-tool

    {
      "type": "object",
      "required": [
        "scannerId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "scannerId": {
          "type": "string",
          "minLength": 1,
          "description": "The mobile scanner ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_mobile-scanners_deactivate unknown never probed

    Deactivate a mobile scanner without deleting it.

    mcp-tool

    {
      "type": "object",
      "required": [
        "scannerId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "scannerId": {
          "type": "string",
          "minLength": 1,
          "description": "The mobile scanner ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • entities_execute_consolidation_plan changes data unknown never probed

    Execute one approved group from a reviewed legal entity consolidation plan.

    mcp-tool

    {
      "type": "object",
      "required": [
        "planHash",
        "groupId",
        "plan",
        "context",
        "llm_model"
      ],
      "properties": {
        "plan": {
          "type": "object",
          "required": [
            "planHash",
            "generatedAt",
            "maxEntities",
            "totalEntities",
            "groups"
          ],
          "properties": {
            "groups": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "keepEntity",
                  "mergeEntities",
                  "matchReason",
                  "confidence",
                  "policy",
                  "linkedDocumentsCount"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "policy": {
                    "type": "object",
                    "required": [
                      "status",
                      "reason",
                      "executable",
                      "message"
                    ],
                    "properties": {
                      "reason": {
                        "enum": [
                          "same_google_place",
                          "compatible_name_and_location",
                          "conflicting_location",
                          "embedding_only"
                        ],
                        "type": "string"
                      },
                      "status": {
                        "enum": [
                          "executable",
                          "needs_review",
                          "blocked"
                        ],
                        "type": "string"
                      },
                      "message": {
                        "type": "string"
                      },
                      "executable": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  },
                  "confidence": {
                    "type": "number",
                    "maximum": 1,
                    "minimum": 0
                  },
                  "keepEntity": {
                    "type": "object",
                    "required": [
                      "id",
                      "name",
                      "signature"
                    ],
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "city": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      },
                      "taxId": {
                        "type": "string"
                      },
                      "aliases": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "default": []
                      },
                      "country": {
                        "type": "string"
                      },
                      "signature": {
                        "type": "string"
                      },
                      "postalCode": {
                        "type": "string"
                      },
                      "addressLine2": {
                        "type": "string"
                      },
                      "googlePlaceId": {
                        "type": "string"
                      },
                      "streetAddress": {
                        "type": "string"
                      },
                      "stateOrProvince": {
                        "type": "string"
                      },
                      "linkedDocumentsCount": {
                        "type": "integer",
                        "default": 0,
                        "minimum": 0
                      }
                    },
                    "additionalProperties": false
                  },
                  "matchReason": {
                    "enum": [
                      "same_place_id",
                      "embedding_similarity"
                    ],
                    "type": "string"
                  },
                  "mergeEntities": {
                    "type": "array",
                    "items": {
                      "$ref": "#/properties/plan/properties/groups/items/properties/keepEntity"
                    },
                    "minItems": 1
                  },
                  "linkedDocumentsCount": {
                    "type": "integer",
                    "minimum": 0
                  }
                },
                "additionalProperties": false
              }
            },
            "planHash": {
              "type": "string"
            },
            "generatedAt": {
              "type": "string"
            },
            "maxEntities": {
              "type": "integer",
              "minimum": 1
            },
            "totalEntities": {
              "type": "integer",
              "minimum": 0
            }
          },
          "additionalProperties": false
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "groupId": {
          "type": "string"
        },
        "planHash": {
          "type": "string"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 192 lines
  • entities_update changes data unknown never probed

    Apply typed partial updates to one or more legal entities.

    mcp-tool

    {
      "type": "object",
      "required": [
        "updates",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "updates": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "entityId",
              "patch"
            ],
            "properties": {
              "patch": {
                "type": "object",
                "required": [
                  "chartOfAccountsId"
                ],
                "properties": {
                  "chartOfAccountsId": {
                    "anyOf": [
                      {
                        "$ref": "#/properties/updates/items/properties/entityId"
                      },
                      {
                        "enum": [
                          "default"
                        ],
                        "type": "string"
                      }
                    ],
                    "nullable": true,
                    "description": "Chart of accounts used to categorize this entity's documents. Null clears the assignment."
                  }
                },
                "additionalProperties": false
              },
              "entityId": {
                "type": "string"
              }
            },
            "additionalProperties": false
          },
          "maxItems": 50,
          "minItems": 1
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 64 lines
  • entities_delete unknown never probed

    Delete a legal entity and unlink associated documents.

    mcp-tool

    {
      "type": "object",
      "required": [
        "entityId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "entityId": {
          "type": "string",
          "description": "ID of the entity to delete"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 26 lines
  • merchants_list reads unknown never probed

    List and search merchants with document counts, spend totals, currencies, and profile fields.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "page": {
          "type": "integer",
          "default": 1,
          "minimum": 0,
          "description": "Page number",
          "exclusiveMinimum": true
        },
        "limit": {
          "type": "integer",
          "default": 100,
          "maximum": 10000,
          "minimum": 0,
          "description": "Results per page",
          "exclusiveMinimum": true
        },
        "search": {
          "type": "string",
          "description": "Search term to filter merchants by name"
        },
        "sortBy": {
          "enum": [
            "name",
            "totalSpent",
            "count",
            "lastTransaction"
          ],
          "type": "string",
          "default": "name"
        },
        "toDate": {
          "type": "string",
          "description": "Only include documents on or before this date"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "currency": {
          "type": "string",
          "pattern": "^[a-z]{3}$",
          "description": "Only include documents in this source currency"
        },
        "fromDate": {
          "type": "string",
          "description": "Only include documents on or after this date"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 63 lines
  • memories_archive changes data unknown never probed

    Archive a stored long-term memory so it is no longer used at runtime.

    mcp-tool

    {
      "type": "object",
      "required": [
        "memoryId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "memoryId": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • memories_list unknown never probed

    List current long-term memories stored for the current user/workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "kinds": {
          "type": "array",
          "items": {
            "enum": [
              "preference",
              "canonical_mapping",
              "workflow_hint",
              "document_policy",
              "integration_preference",
              "approval_policy_hint",
              "playbook",
              "routing_preference"
            ],
            "type": "string"
          },
          "maxItems": 8
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "statuses": {
          "type": "array",
          "items": {
            "enum": [
              "active",
              "candidate",
              "rejected",
              "archived"
            ],
            "type": "string"
          },
          "maxItems": 4
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentIds": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "maxItems": 20
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "includeDocumentMemories": {
          "type": "boolean",
          "default": true
        }
      }
    }
    arguments 64 lines
  • onboarding_status unknown never probed

    Get the user's onboarding/setup progress including which steps are completed and what's pending.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 21 lines
  • documents_update unknown never probed

    Update a single document by ID. Use this for precise corrections to extracted document fields that should not be applied through bulk edit.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "changes",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "changes": {
          "type": "object",
          "properties": {
            "amount": {
              "type": "number",
              "description": "Document amount in major currency units (for example 12.34)"
            },
            "labels": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 64,
                "minLength": 1
              },
              "maxItems": 50
            },
            "docDate": {
              "type": "string"
            },
            "docType": {
              "enum": [
                "invoice",
                "receipt",
                "credit_note",
                "quote",
                "purchase_order",
                "order_confirmation"
              ],
              "type": "string"
            },
            "summary": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ]
            },
            "taxRate": {
              "type": "number"
            },
            "category": {
              "$ref": "#/properties/changes/properties/merchant"
            },
            "currency": {
              "type": "string",
              "pattern": "^[a-z]{3}$"
            },
            "entityId": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 64,
                  "minLength": 1
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ],
              "description": "Legal entity ID assigned to the document. Use entity_list to resolve the entity ID from a business/entity name."
            },
            "merchant": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1,
              "description": "Vendor/supplier/merchant name shown on the document. Do not use this for 'Billed to'."
            },
            "subtotal": {
              "$ref": "#/properties/changes/properties/amount",
              "description": "Subtotal in major currency units (for example 11.11)"
            },
            "invoiceId": {
              "allOf": [
                {
                  "$ref": "#/properties/changes/properties/merchant"
                }
              ],
              "nullable": true
            },
            "receiptId": {
              "$ref": "#/properties/changes/properties/invoiceId"
            },
            "taxAmount": {
              "$ref": "#/properties/changes/properties/amount",
              "description": "Tax amount in major currency units (for example 1.23)"
            },
            "isRecurring": {
              "type": "boolean"
            },
            "paymentMethod": {
              "anyOf": [
                {
                  "allOf": [
                    {
                      "type": "string",
                      "maxLength": 64,
                      "minLength": 1
                    },
                    {
                      "enum": [
                        "cash",
                        "check",
                        "credit_card",
                        "debit_card",
                        "paypal",
                        "bank_transfer",
                        "other",
                        "unknown"
                      ],
                      "type": "string"
                    }
                  ]
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ]
            },
            "paymentStatus": {
              "enum": [
                "paid",
                "unpaid",
                "partial",
                "refunded",
                "unknown"
              ],
              "type": "string"
            },
            "recurringType": {
              "anyOf": [
                {
                  "enum": [
                    "subscription",
                    "retainer",
                    "membership",
                    "license",
                    "lease",
                    "installment"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ]
            },
            "preferredCurrency": {
              "$ref": "#/properties/changes/properties/currency"
            },
            "paymentMethodEnding": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 16,
                  "minLength": 1
                },
                {
                  "enum": [
                    "null"
                  ],
                  "nullable": true
                }
              ]
            }
          },
          "description": "Single-document edits. Does not support fromEmail or toEmail.",
          "additionalProperties": false
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 210 lines
  • entities_cleanup changes data unknown never probed

    Analyze and clean up the user's own legal entities: enrich with Google Places data, find duplicates via place_id and embedding similarity, and merge them. This is for companies/legal entities/subsidiaries, not merchant or document duplicates.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "Preview changes without executing. Set to false after user confirms."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "maxEntities": {
          "type": "number",
          "default": 200,
          "description": "Maximum number of entities to process in one invocation"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 31 lines
  • memories_save unknown never probed

    Save a long-term memory, preference, canonical mapping, workflow hint, or deterministic document policy.

    mcp-tool

    {
      "type": "object",
      "required": [
        "title",
        "summary",
        "context",
        "llm_model"
      ],
      "properties": {
        "to": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "from": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "kind": {
          "enum": [
            "preference",
            "canonical_mapping",
            "workflow_hint",
            "document_policy"
          ],
          "type": "string",
          "default": "preference"
        },
        "note": {
          "type": "string",
          "nullable": true,
          "maxLength": 500,
          "description": "Optional user note explaining the policy."
        },
        "text": {
          "type": "string",
          "maxLength": 4000,
          "minLength": 1
        },
        "scope": {
          "enum": [
            "user",
            "org",
            "document"
          ],
          "type": "string",
          "default": "org"
        },
        "title": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "amount": {
          "type": "integer",
          "nullable": true,
          "description": "Optional amount in the currency's minor units."
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "maxItems": 20
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "summary": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1
        },
        "currency": {
          "type": "string",
          "nullable": true,
          "maxLength": 3,
          "minLength": 3,
          "description": "Optional ISO currency code for amount matching."
        },
        "merchant": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "mappingType": {
          "enum": [
            "merchant_canonicalization",
            "category_preference",
            "label_preference"
          ],
          "type": "string"
        },
        "policyAction": {
          "enum": [
            "not_recurring",
            "stopped",
            "set_recurring_schedule"
          ],
          "type": "string",
          "description": "Deterministic action to apply when the document policy matcher applies."
        },
        "policyDomain": {
          "enum": [
            "recurring"
          ],
          "type": "string",
          "description": "Document policy domain. Use recurring for subscription or repeat-charge decisions."
        },
        "recurringType": {
          "enum": [
            "subscription",
            "retainer",
            "membership",
            "license",
            "lease",
            "installment"
          ],
          "type": "string",
          "nullable": true,
          "description": "Optional recurring type matcher."
        },
        "chartAccountId": {
          "type": "string",
          "maxLength": 128,
          "minLength": 1
        },
        "amountTolerance": {
          "type": "integer",
          "minimum": 0,
          "nullable": true,
          "description": "Optional amount tolerance in minor currency units."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "setRecurringType": {
          "enum": [
            "subscription",
            "retainer",
            "membership",
            "license",
            "lease",
            "installment"
          ],
          "type": "string",
          "nullable": true,
          "description": "Recurring type to set when policyAction is set_recurring_schedule."
        },
        "sourceDocumentId": {
          "type": "string",
          "nullable": true,
          "maxLength": 64,
          "minLength": 1,
          "description": "Optional source document ID."
        },
        "chartOfAccountsId": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "recurringFrequency": {
          "enum": [
            "weekly",
            "bi-weekly",
            "monthly",
            "quarterly",
            "semi-annual",
            "annual"
          ],
          "type": "string",
          "nullable": true,
          "description": "Optional recurring frequency matcher."
        },
        "setRecurringFrequency": {
          "enum": [
            "weekly",
            "bi-weekly",
            "monthly",
            "quarterly",
            "semi-annual",
            "annual"
          ],
          "type": "string",
          "nullable": true,
          "description": "Recurring frequency to set when policyAction is set_recurring_schedule."
        }
      }
    }
    arguments 203 lines
  • approvals_approve changes data unknown never probed

    Approve a pending request and run the reviewed action.

    mcp-tool

    {
      "type": "object",
      "required": [
        "approvalRequestId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "approvalRequestId": {
          "type": "string",
          "minLength": 1,
          "description": "The approval request ID."
        }
      }
    }
    arguments 27 lines
  • approvals_reject unknown never probed

    Reject a pending request without running the reviewed action.

    mcp-tool

    {
      "type": "object",
      "required": [
        "approvalRequestId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "message": {
          "type": "string",
          "maxLength": 500,
          "minLength": 1
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "approvalRequestId": {
          "type": "string",
          "minLength": 1,
          "description": "The approval request ID."
        }
      }
    }
    arguments 32 lines
  • documents_repair-relationships unknown never probed

    Retroactively diagnose and repair deterministic document relationships for a bounded document set. Uses shared schemas logic to mark true same-type duplicates and link related invoice/receipt documents.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 100,
          "maximum": 500,
          "minimum": 2,
          "description": "Maximum active documents to inspect"
        },
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, preview deterministic repairs without writing changes"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "messageId": {
          "type": "string",
          "minLength": 1,
          "description": "Email message ID whose extracted documents should be repaired"
        },
        "documentIds": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "maxItems": 100,
          "minItems": 2,
          "description": "Specific document IDs to diagnose and repair together"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "processedEntityId": {
          "type": "string",
          "minLength": 1,
          "description": "Processed entity ID whose extracted documents should be repaired"
        }
      }
    }
    arguments 53 lines
  • integrations_send changes data unknown never probed

    Send a document (receipt/invoice) to a supported accounting integration (Xero or QuickBooks). Requires integrationId. targetId is required for Xero/QuickBooks. Set dryRun=true (default) to preview, dryRun=false to queue for sending.

    mcp-tool

    {
      "type": "object",
      "required": [
        "documentId",
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "dryRun": {
          "type": "boolean",
          "default": true,
          "description": "If true, shows preview without sending. If false, queues the document for sending."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "targetId": {
          "type": "string",
          "description": "Optional target ID from listIntegrations. Use for accounting tenants or companies."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "description": "The receipt/invoice document ID to send"
        },
        "integrationId": {
          "type": "string",
          "description": "The integration ID to send to (use listIntegrations to find)"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 40 lines
  • workspaces_list-members unknown never probed

    List members (users) of a workspace (organization), defaulting to the active workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1
        },
        "orgId": {
          "type": "string",
          "minLength": 1
        },
        "offset": {
          "type": "integer",
          "minimum": 0
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 34 lines
  • context_requests_bulk_resolve unknown never probed

    Resolve selected request-for-context records in bulk.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hitlRequestIds",
        "action",
        "context",
        "llm_model"
      ],
      "properties": {
        "action": {
          "anyOf": [
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "leave_uncategorized"
                  ],
                  "type": "string"
                },
                "reason": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action",
                "context"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "provide_context"
                  ],
                  "type": "string"
                },
                "context": {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                "saveAsMemory": {
                  "type": "boolean",
                  "default": false
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "archive_document"
                  ],
                  "type": "string"
                },
                "archiveReason": {
                  "type": "string",
                  "maxLength": 500
                }
              },
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": [
                "action"
              ],
              "properties": {
                "action": {
                  "enum": [
                    "suggest_account"
                  ],
                  "type": "string"
                },
                "suggestedAccount": {
                  "type": "object",
                  "required": [
                    "name"
                  ],
                  "properties": {
                    "name": {
                      "type": "string",
                      "maxLength": 120,
                      "minLength": 1
                    },
                    "rationale": {
                      "type": "string",
                      "maxLength": 500
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 255
                    },
                    "accountNumber": {
                      "type": "string",
                      "maxLength": 50
                    }
                  },
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          ]
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "hitlRequestIds": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "maxItems": 50,
          "minItems": 1
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 140 lines
  • exports_list unknown never probed

    List export records with filters (document, integration, date range) for the current workspace.

    mcp-tool

    {
      "type": "object",
      "required": [
        "context",
        "llm_model"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 20,
          "maximum": 100,
          "minimum": 1,
          "description": "Max records to return (1-100)"
        },
        "dateTo": {
          "type": "string",
          "description": "End date filter (ISO format)"
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0,
          "description": "Pagination offset"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "dateFrom": {
          "type": "string",
          "description": "Start date filter (ISO format)"
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentId": {
          "type": "string",
          "description": "Filter export records by document ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "integrationSlug": {
          "enum": [
            "xero",
            "quickbooks",
            "mercury",
            "google-drive",
            "google-sheets",
            "dropbox",
            "pdf-export",
            "csv-export",
            "zip-export",
            "email-forward"
          ],
          "type": "string",
          "description": "Filter export records by integration (xero, quickbooks, google-drive, etc.)"
        }
      }
    }
    arguments 62 lines
  • retroactiveExtractions_estimate unknown never probed

    Queue a Retroactive Scan estimate for the given email integration and date range. Returns a jobId immediately; poll with getRetroactiveExtractionEstimate. Estimation against a real mailbox can take minutes; use the poll capability rather than waiting.

    mcp-tool

    {
      "type": "object",
      "required": [
        "integrationId",
        "fromDate",
        "toDate",
        "sendersPreference",
        "context",
        "llm_model"
      ],
      "properties": {
        "toDate": {
          "type": "string",
          "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
          "description": "Inclusive end date in YYYY-MM-DD format."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "fromDate": {
          "type": "string",
          "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",
          "description": "Inclusive start date in YYYY-MM-DD format."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "mailboxId": {
          "type": "string",
          "description": "Mailbox/folder id to scope the estimate. Defaults to 'all'."
        },
        "integrationId": {
          "type": "string",
          "minLength": 1,
          "description": "The email integration ID to estimate against (use listIntegrations to find)."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "sendersPreference": {
          "enum": [
            "allowed",
            "blocked"
          ],
          "type": "string",
          "description": "Whether the sender list is an allow-list or block-list."
        }
      }
    }
    arguments 52 lines
  • sources_email_reauthorize unknown never probed

    Prepare reauthorization instructions for an email source with expired or invalid credentials.

    mcp-tool

    {
      "type": "object",
      "required": [
        "integrationId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "integrationId": {
          "type": "string",
          "minLength": 1,
          "description": "The email integration ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • sources_mobile-scanners_delete unknown never probed

    Delete a mobile scanner from the account permanently.

    mcp-tool

    {
      "type": "object",
      "required": [
        "scannerId",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "scannerId": {
          "type": "string",
          "minLength": 1,
          "description": "The mobile scanner ID"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • entities_upsert unknown never probed

    Create a new legal entity or update an existing one.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "country",
        "context",
        "llm_model"
      ],
      "properties": {
        "city": {
          "type": "string",
          "description": "City"
        },
        "name": {
          "type": "string",
          "description": "Legal entity name"
        },
        "email": {
          "type": "string",
          "description": "Email address"
        },
        "taxId": {
          "type": "string",
          "description": "Tax ID / VAT number"
        },
        "aliases": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Alternative names for this entity"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "country": {
          "type": "string",
          "description": "Country name"
        },
        "entityId": {
          "type": "string",
          "description": "Entity ID to update. Omit to create a new entity."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "entityKind": {
          "enum": [
            "individual",
            "organization"
          ],
          "type": "string",
          "nullable": true,
          "description": "Whether the legal entity is an individual or organization. Null clears the assignment."
        },
        "postalCode": {
          "type": "string",
          "description": "Postal/zip code"
        },
        "addressLine2": {
          "type": "string",
          "description": "Address line 2"
        },
        "contactNumber": {
          "type": "string",
          "description": "Phone number"
        },
        "streetAddress": {
          "type": "string",
          "description": "Street address"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "stateOrProvince": {
          "type": "string",
          "description": "State or province"
        },
        "chartOfAccountsId": {
          "anyOf": [
            {
              "$ref": "#/properties/entityId"
            },
            {
              "enum": [
                "default"
              ],
              "type": "string"
            }
          ],
          "nullable": true,
          "description": "Chart of accounts used to categorize this entity's documents. Null clears the assignment."
        }
      }
    }
    arguments 98 lines
  • merchants_merge unknown never probed

    Merge multiple merchant names into one preferred merchant name and save that preference for future use.

    mcp-tool

    {
      "type": "object",
      "required": [
        "keepMerchantName",
        "mergeMerchantNames",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "merchantTaxId": {
          "type": "string",
          "maxLength": 255,
          "description": "Preferred merchant tax ID or VAT number"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "merchantAddress": {
          "type": "string",
          "maxLength": 1000,
          "description": "Preferred merchant address"
        },
        "merchantWebsite": {
          "type": "string",
          "maxLength": 500,
          "description": "Preferred merchant website URL"
        },
        "keepMerchantName": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Preferred merchant name to keep"
        },
        "mergeMerchantNames": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          "minItems": 1,
          "description": "Merchant names to merge into the preferred merchant name"
        }
      }
    }
    arguments 54 lines
  • merchants_rename changes data unknown never probed

    Rename one merchant to a preferred merchant name, optionally updating website, tax ID, and address.

    mcp-tool

    {
      "type": "object",
      "required": [
        "currentMerchantName",
        "newMerchantName",
        "context",
        "llm_model"
      ],
      "properties": {
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "merchantTaxId": {
          "type": "string",
          "maxLength": 255,
          "description": "Preferred merchant tax ID or VAT number"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        },
        "merchantAddress": {
          "type": "string",
          "maxLength": 1000,
          "description": "Preferred merchant address"
        },
        "merchantWebsite": {
          "type": "string",
          "maxLength": 500,
          "description": "Preferred merchant website URL"
        },
        "newMerchantName": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Preferred merchant name to apply"
        },
        "currentMerchantName": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Current merchant name to rename"
        }
      }
    }
    arguments 50 lines
  • memories_recall unknown never probed

    Recall task-relevant long-term memories just in time for an agent task.

    mcp-tool

    {
      "type": "object",
      "required": [
        "intent",
        "context",
        "llm_model"
      ],
      "properties": {
        "kinds": {
          "type": "array",
          "items": {
            "enum": [
              "preference",
              "canonical_mapping",
              "workflow_hint",
              "document_policy",
              "integration_preference",
              "approval_policy_hint",
              "playbook",
              "routing_preference"
            ],
            "type": "string"
          },
          "maxItems": 8,
          "description": "Optional explicit memory kinds to recall. Omit to use the intent defaults."
        },
        "limit": {
          "type": "integer",
          "default": 8,
          "maximum": 20,
          "minimum": 1
        },
        "query": {
          "type": "string",
          "maxLength": 1000,
          "minLength": 1,
          "description": "Current user request or focused search text."
        },
        "intent": {
          "enum": [
            "categorization",
            "document_policy",
            "integration",
            "approval",
            "routing",
            "user_preference",
            "workflow"
          ],
          "type": "string",
          "description": "Task intent that determines which memory kinds are relevant."
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "merchant": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1,
          "description": "Known merchant/vendor to match memory against."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "documentIds": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1
          },
          "maxItems": 20,
          "description": "Known document IDs relevant to this task."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 81 lines
  • automations_delete unknown never probed

    Delete an automation permanently.

    mcp-tool

    {
      "type": "object",
      "required": [
        "id",
        "context",
        "llm_model"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "The ID of the automation to delete"
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 27 lines
  • views_create changes data unknown never probed

    Create a saved document view from document filters. Saved views are reusable inputs for automations and workflows.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "query",
        "context",
        "llm_model"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 255,
          "minLength": 1,
          "description": "Saved view name"
        },
        "sort": {
          "type": "object",
          "required": [
            "field",
            "direction"
          ],
          "properties": {
            "field": {
              "type": "string",
              "minLength": 1,
              "description": "Sort field"
            },
            "direction": {
              "anyOf": [
                {
                  "enum": [
                    1
                  ],
                  "type": "number"
                },
                {
                  "enum": [
                    -1
                  ],
                  "type": "number"
                }
              ],
              "description": "Sort direction: 1 asc, -1 desc"
            }
          },
          "description": "Optional sort configuration for the saved view",
          "additionalProperties": false
        },
        "query": {
          "type": "object",
          "properties": {
            "last4": {
              "type": "string",
              "description": "Card last-4 filter (comma-separated)"
            },
            "labels": {
              "type": "string",
              "description": "Label filter (comma-separated)"
            },
            "search": {
              "type": "string",
              "description": "Text search"
            },
            "source": {
              "type": "string",
              "description": "Source filter (comma-separated: upload,email,whatsapp)"
            },
            "toDate": {
              "type": "string",
              "description": "Absolute to date in YYYY-MM-DD format"
            },
            "docType": {
              "type": "string",
              "description": "Document type filter (comma-separated)"
            },
            "amountEq": {
              "type": "string",
              "description": "Exact amount filter in major units"
            },
            "category": {
              "type": "string",
              "description": "Category filter (comma-separated)"
            },
            "entityId": {
              "type": "string",
              "description": "Entity ID filter (comma-separated)"
            },
            "fromDate": {
              "type": "string",
              "description": "Absolute from date in YYYY-MM-DD format"
            },
            "amountMax": {
              "type": "string",
              "description": "Maximum amount filter in major units"
            },
            "amountMin": {
              "type": "string",
              "description": "Minimum amount filter in major units"
            },
            "merchants": {
              "type": "string",
              "description": "Merchant filter (comma-separated)"
            },
            "integrationId": {
              "type": "string",
              "description": "Integration ID filter (comma-separated)"
            },
            "paymentStatus": {
              "type": "string",
              "description": "Payment status filter (comma-separated)"
            },
            "amountDirection": {
              "enum": [
                "any",
                "in",
                "out"
              ],
              "type": "string",
              "description": "Amount direction filter"
            },
            "relativeDateRange": {
              "enum": [
                "today",
                "yesterday",
                "last_7_days",
                "last_14_days",
                "last_30_days",
                "last_90_days",
                "this_week",
                "last_week",
                "this_month",
                "last_month",
                "this_quarter",
                "last_quarter",
                "this_year",
                "last_year",
                "year_to_date"
              ],
              "type": "string",
              "description": "Relative date range"
            },
            "workspaceMemberId": {
              "type": "string",
              "description": "Workspace member filter (comma-separated user IDs)"
            }
          },
          "description": "Saved document filter query",
          "additionalProperties": false
        },
        "context": {
          "type": "string",
          "description": "Describe the user's underlying goal in one sentence, not merely the tool being called."
        },
        "llm_model": {
          "type": "string",
          "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
        },
        "description": {
          "type": "string",
          "description": "Optional saved view description"
        },
        "conversation_id": {
          "type": "string",
          "description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
        }
      }
    }
    arguments 167 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 7f03fb8cda56d90d.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/7f03fb8cda56d90d/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/7f03fb8cda56d90d/badge.svg)](https://brick.blue/agent/7f03fb8cda56d90d?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on receiptor.ai 1 entry

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.