Brex MCP Server
Provides access to Brex financial platform data including account information, transactions, expenses, receipts, budgets, spend limits, and team information. Enables expense management operations such as updating expense details, uploading receipts, and matching receipts with expenses.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Brex MCP Servershow me my recent card expenses from last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Brex MCP Server
A Model Context Protocol (MCP) server for integrating with the Brex API, enabling AI agents to interact with financial data and resources.
Overview
This MCP server provides a bridge between AI agents and the Brex financial platform, allowing agents to:
Retrieve account information and transactions
Access expense data and receipts
Manage budget resources and spend limits
View team information
The server implements standardized resource handlers and tools following the MCP specification, enabling secure and efficient access to financial data.
Features
Resources
Account Resources
brex://accounts- List all accountsbrex://accounts/{id}- Access specific account details
Expense Resources
brex://expenses- List all expenses with paginationbrex://expenses/{id}- Access specific expense detailsbrex://expenses/card- List all card expensesbrex://expenses/card/{id}- Access specific card expense details
Note: Expense resources automatically expand merchant and budget information to display human-readable names instead of IDs.
Budget Resources
brex://budgets- List all budgets with paginationbrex://budgets/{id}- Access specific budget detailsbrex://spend_limits- List all spend limitsbrex://spend_limits/{id}- Access specific spend limit detailsbrex://budget_programs- List all budget programsbrex://budget_programs/{id}- Access specific budget program details
Team Resources
brex://users/me- Get current user information
Tools
Receipt Management
match_receipt- Match a receipt with existing expensesupload_receipt- Upload a receipt for a specific expense
Expense Management
update_expense- Update details for a card expense (memo, category, etc.)get_all_expenses- Get all expenses with filtering options and expanded merchant/budget informationget_all_card_expenses- Get all card expenses with filtering options and expanded merchant/budget information
Note: For security reasons, tools that create, update, or delete budgets, spend limits, and budget programs are not implemented in this version.
Installation
Prerequisites
Node.js v18 or higher
Brex API access token
Setup
Clone this repository:
git clone https://github.com/dennisonbertram/brex-mcp-server.git
cd brex-mcp-serverInstall dependencies:
npm installCreate a
.envfile with your Brex API token:
BREX_API_KEY=your_token_here
BREX_API_URL=https://platform.brexapis.com
PORT=3000
NODE_ENV=development
RATE_LIMIT_REQUESTS=1000
RATE_LIMIT_WINDOW_MS=60000
LOG_LEVEL=infoBuild the server:
npm run buildConfiguration with Claude
To use with Claude Desktop, you need to add the server to Claude's configuration file:
On macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
On Windows: %APPDATA%\Claude\claude_desktop_config.json
Open Claude for Desktop and go to settings by clicking on the Claude menu and selecting "Settings..."
Click on "Developer" in the left sidebar, then click "Edit Config"
Update the configuration file with the Brex MCP server settings:
{
"mcpServers": {
"brex-server": {
"command": "node",
"args": [
"/path/to/brex-mcp-server/build/index.js"
],
"env": {
"BREX_API_KEY": "your_brex_api_key_here",
"BREX_API_URL": "https://platform.brexapis.com",
"PORT": "3000",
"NODE_ENV": "development",
"RATE_LIMIT_REQUESTS": "1000",
"RATE_LIMIT_WINDOW_MS": "60000",
"LOG_LEVEL": "info"
}
}
}
}Make sure to:
Replace
/path/to/brex-mcp-serverwith the actual path where you installed the serverReplace
your_brex_api_key_herewith your actual Brex API keyUse absolute paths for the server location
Only the BREX_API_KEY and BREX_API_URL values are required; the other environment variables have sensible defaults but can be customized if needed.
Save the file and restart Claude for Desktop
Verify the server is working by checking for the hammer icon in the bottom right corner of the input box
Development
For development with auto-rebuild:
npm run devLint your code:
npm run lintRun tests:
npm run testDebugging
Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector for debugging.
Security Considerations
This server implements several security measures:
Read-only operations for sensitive financial resources
No storage of API credentials in code
Rate limiting for API requests
Proper error handling and logging
Implementation Status
For a detailed implementation plan and status of various features, see documentation/implementation_plan.md.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Author
Dennison Bertram - dennison@dennisonbertram.com
Available Tools
9 toolsget_account_detailsC
Get detailed information about a Brex account
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | ID of the Brex account |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('Get') but doesn't clarify if this is a read-only operation, what permissions are required, whether it returns real-time or cached data, or any rate limits. This is a significant gap for a tool that likely accesses sensitive account information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized for a simple retrieval tool and front-loaded with the core action, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'detailed information' includes (e.g., balance, settings, transactions), the return format, or error handling. For a tool that likely returns structured account data, this leaves the agent with insufficient context to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'accountId' parameter clearly documented. The description doesn't add any additional meaning beyond what the schema provides (e.g., format examples or sourcing guidance), so it meets the baseline for high schema coverage without compensating value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('detailed information about a Brex account'), making the purpose understandable. However, it doesn't explicitly differentiate from siblings like 'get_all_accounts' (which likely lists multiple accounts) or 'get_budget' (which focuses on budget data), leaving some ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an account ID), exclusions, or compare to siblings like 'get_all_accounts' for bulk retrieval or 'get_budget' for financial details, leaving the agent to infer usage from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_accountsB
Get all Brex accounts with pagination support
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of items per page (default: 50, max: 100) | |
| max_items | No | Maximum total number of items to retrieve across all pages | |
| status | No | Filter accounts by status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'pagination support,' which is useful context beyond the input schema, but fails to describe critical behaviors like rate limits, authentication needs, error handling, or what the return format looks like (e.g., list structure, metadata). For a read operation with pagination, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Get all Brex accounts') and adds a key behavioral trait ('with pagination support'). There is no wasted verbiage, and every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (pagination, filtering), lack of annotations, and no output schema, the description is minimally adequate but incomplete. It covers the basic purpose and hints at pagination but misses details on return values, error cases, and usage context. It's sufficient for a simple read tool but could be more comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, providing clear details for all three parameters (page_size, max_items, status). The description adds no additional parameter semantics beyond what's in the schema, such as default behaviors or interaction effects. According to the rules, with high schema coverage (>80%), the baseline is 3 even without param info in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('all Brex accounts'), making the purpose unambiguous. It distinguishes from sibling tools like 'get_account_details' by specifying it retrieves all accounts rather than details of a specific one. However, it doesn't explicitly differentiate from other list tools like 'get_all_expenses' beyond the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to prefer 'get_all_accounts' over 'get_account_details' or other sibling tools, nor does it specify prerequisites or exclusions. The mention of 'pagination support' hints at usage for large datasets but isn't explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_card_expensesC
Get all Brex card expenses with pagination and filtering support
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of items per page (default: 50, max: 100) | |
| max_items | No | Maximum total number of items to retrieve across all pages | |
| status | No | Filter card expenses by status | |
| payment_status | No | Filter card expenses by payment status | |
| start_date | No | Filter card expenses created on or after this date (ISO format) | |
| end_date | No | Filter card expenses created on or before this date (ISO format) | |
| merchant_name | No | Filter card expenses by merchant name (partial match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions 'pagination and filtering support', which hints at large-scale data handling, but fails to describe critical behaviors like rate limits, authentication needs, response format, error conditions, or whether this is a read-only operation. For a tool with 7 parameters and no annotations, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Get all Brex card expenses') and adds key features ('with pagination and filtering support'). Every word earns its place with zero waste, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no output schema, no annotations), the description is incomplete. It lacks details on return values, error handling, pagination mechanics, and behavioral constraints. For a data retrieval tool with filtering and pagination, more context is needed to guide effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 7 parameters. The description adds no parameter-specific semantics beyond mentioning 'filtering support' generically, which doesn't enhance understanding of individual parameters. Baseline 3 is appropriate when schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and resource 'all Brex card expenses', making the purpose evident. It distinguishes from siblings like 'get_expenses' by specifying 'card expenses' and mentions 'pagination and filtering support' which adds specificity. However, it doesn't explicitly differentiate from 'get_all_expenses' which might be similar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_expenses' or 'get_all_expenses'. It mentions 'pagination and filtering support' which implies usage for bulk retrieval with filters, but offers no explicit when/when-not instructions or named alternatives, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_expensesC
Get all Brex expenses with pagination and filtering support
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Number of items per page (default: 50, max: 100) | |
| max_items | No | Maximum total number of items to retrieve across all pages | |
| expense_type | No | Filter expenses by type | |
| status | No | Filter expenses by status | |
| payment_status | No | Filter expenses by payment status | |
| start_date | No | Filter expenses created on or after this date (ISO format) | |
| end_date | No | Filter expenses created on or before this date (ISO format) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions pagination and filtering support, which is helpful, but doesn't address important aspects like rate limits, authentication requirements, error conditions, or what the response format looks like. For a tool with 7 parameters and no output schema, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that communicates the core functionality and key features (pagination and filtering) without any wasted words. It's appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain the response format, error handling, or important behavioral aspects. While the schema covers parameters well, the description fails to provide the broader context needed for effective tool use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters thoroughly with descriptions and enum values. The description adds minimal value beyond confirming filtering exists, but doesn't provide additional context about parameter interactions or usage patterns beyond what's in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('all Brex expenses') with additional functionality ('with pagination and filtering support'). It distinguishes from some siblings like 'get_account_details' but doesn't explicitly differentiate from 'get_expenses' or 'get_all_card_expenses', which appear to be similar expense-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_expenses' or 'get_all_card_expenses'. It mentions pagination and filtering support but doesn't explain when these features are needed or when other tools might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expensesC
Get expenses from Brex
| Name | Required | Description | Default |
|---|---|---|---|
| expense_type | No | Type of expenses to retrieve | |
| status | No | Status filter for expenses | |
| payment_status | No | Payment status filter for expenses | |
| limit | No | Maximum number of expenses to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states the basic action without disclosing behavioral traits like pagination, rate limits, authentication needs, or response format. It fails to address whether this is a read-only operation, what happens on errors, or if it supports sorting, making it inadequate for a tool with multiple parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single sentence, 'Get expenses from Brex', which is front-loaded and wastes no words. However, it may be overly terse given the tool's complexity, as it omits necessary context that could aid the agent in proper tool selection and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no annotations, and no output schema, the description is incomplete. It lacks details on behavior, output format, error handling, and differentiation from siblings, making it insufficient for an agent to reliably invoke the tool without guessing or relying solely on the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear enum values and descriptions for all parameters, so the description adds no additional semantic meaning. The baseline score of 3 reflects that the schema adequately documents parameters, but the description doesn't compensate or enhance understanding beyond what's already structured.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get expenses from Brex' restates the tool name with minimal elaboration, making it tautological. It specifies the resource ('expenses') and source ('Brex') but lacks a clear verb beyond 'Get' and doesn't differentiate from sibling tools like 'get_all_expenses' or 'get_all_card_expenses', leaving ambiguity about scope or filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as 'get_all_expenses' or 'get_all_card_expenses'. The description implies a general retrieval but offers no context on prerequisites, exclusions, or specific use cases, leaving the agent to infer usage from parameters alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsC
Get transactions for a Brex account
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | ID of the Brex account | |
| limit | No | Maximum number of transactions to return (default: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states a read operation ('Get'), which implies it's non-destructive, but doesn't mention permissions, rate limits, pagination, or response format. For a tool with two parameters and no annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded and appropriately sized for a simple tool, making it easy to parse without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (2 parameters, no annotations, no output schema) and multiple sibling tools, the description is incomplete. It doesn't explain return values, error handling, or how it differs from similar tools, leaving the agent with insufficient context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear documentation for both parameters ('accountId' and 'limit'). The description adds no additional meaning beyond what the schema provides, such as context for how 'limit' interacts with default behavior. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get transactions for a Brex account' clearly states the verb ('Get') and resource ('transactions'), but it's vague about scope (e.g., time range, transaction types) and doesn't distinguish from siblings like 'get_card_transactions' or 'get_cash_transactions'. It provides a basic purpose but lacks specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as 'get_card_transactions' or 'get_cash_transactions'. The description implies usage for any Brex account transactions but offers no context, exclusions, or prerequisites, leaving the agent to guess based on tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_receiptA
Create a pre-signed URL for uploading a receipt that will be automatically matched with existing expenses
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_name | Yes | Name of the receipt file (e.g., 'receipt.jpg') | |
| receipt_type | No | Type of the receipt (optional) | |
| notify_email | No | Email address to notify after matching (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the creation of a pre-signed URL and automatic matching, but doesn't address important behavioral aspects like authentication requirements, rate limits, what happens after matching, whether this is a read-only or write operation, or error conditions. Significant gaps remain for a tool that presumably creates resources.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that efficiently communicates the core functionality. Every word earns its place - 'pre-signed URL' specifies the output type, 'uploading a receipt' specifies the action, and 'automatically matched with existing expenses' specifies the purpose. No wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters, no annotations, and no output schema, the description provides adequate basic purpose but lacks important contextual information. It doesn't explain what the pre-signed URL looks like, what format the receipt should be in, how matching works, or what happens after matching. The description is complete enough to understand what the tool does but not how to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already documents all three parameters thoroughly. The description doesn't add any meaningful parameter semantics beyond what's in the schema - it doesn't explain how parameters affect the matching process, provide examples of receipt_type values, or clarify the notification workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Create a pre-signed URL for uploading a receipt') and the outcome ('that will be automatically matched with existing expenses'), distinguishing it from the sibling 'upload_receipt' tool which lacks the matching functionality. The verb+resource combination is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context for receipt matching with existing expenses, but doesn't explicitly state when to use this versus alternatives like 'upload_receipt' or when not to use it. The context is clear but lacks explicit sibling differentiation or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_expenseC
Update an existing card expense
| Name | Required | Description | Default |
|---|---|---|---|
| expense_id | Yes | ID of the expense to update | |
| memo | No | Memo text to attach to the expense (optional) | |
| category | No | Category of the expense (optional) | |
| budget_id | No | ID of the budget to associate with the expense (optional) | |
| department_id | No | ID of the department to associate with the expense (optional) | |
| location_id | No | ID of the location to associate with the expense (optional) | |
| custom_fields | No | Custom fields to update (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. 'Update an existing card expense' implies a mutation operation, but the description doesn't disclose any behavioral traits: no mention of required permissions, whether the update is reversible, what happens to fields not specified, rate limits, or what the response looks like. For a mutation tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states the core purpose without any wasted words. It's appropriately sized for a tool with a clear name and good schema documentation. Every word earns its place, and the structure is front-loaded with the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't address critical context: what permissions are needed, what the response contains, whether the update is atomic, or how errors are handled. The agent has insufficient information to understand the full behavioral implications of invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, meaning all parameters are documented in the input schema. The description adds no additional parameter semantics beyond what's already in the schema (it doesn't explain parameter relationships, constraints, or examples). With complete schema coverage, the baseline score of 3 is appropriate - the description doesn't add value but doesn't need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update') and resource ('an existing card expense'), making the purpose immediately understandable. However, it doesn't differentiate this tool from potential sibling update tools (none are listed, but the agent might assume other update tools exist). The description is specific but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites (like needing to identify an expense first), no comparison with other expense-related tools (like 'get_expense' or 'upload_receipt'), and no indication of when this update would be appropriate versus creating a new expense. The agent must infer usage context from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_receiptC
Upload a receipt image to match with expenses
| Name | Required | Description | Default |
|---|---|---|---|
| receipt_data | Yes | Base64-encoded image data | |
| receipt_name | Yes | Name of the receipt file (e.g., 'receipt.jpg') | |
| content_type | Yes | MIME type of the receipt (e.g., 'image/jpeg') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral insight. It states the upload purpose but doesn't disclose permissions needed, rate limits, whether this creates a new expense record, how matching works, or what happens on failure. For a mutation tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized for a straightforward upload operation and front-loads the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after upload (e.g., returns a match ID, creates an expense), error conditions, or system behavior. The agent lacks critical context to use this tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing complete parameter documentation (base64 data, filename, MIME type). The description adds no parameter-specific information beyond what's in the schema, so it meets the baseline for high schema coverage without compensating value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Upload') and resource ('a receipt image'), with the purpose 'to match with expenses' providing specific context. It distinguishes from most sibling tools (which are primarily 'get' operations), though it doesn't explicitly differentiate from 'match_receipt' which appears related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'match_receipt' or 'update_expense'. It doesn't mention prerequisites, sequencing, or exclusion criteria, leaving the agent to infer usage context from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v1.0.0- First observed
get_account_details - First observed
get_all_accounts - First observed
get_all_card_expenses - First observed
get_all_expenses - First observed
get_expenses - First observed
get_transactions - First observed
match_receipt - First observed
update_expense - First observed
upload_receipt
TDQS
Scored across 9 tools
The tools have some clear distinctions, such as between get_all_accounts and get_account_details, but there is significant overlap between get_all_expenses, get_all_card_expenses, and get_expenses, which could confuse an agent about which to use for expense retrieval. The match_receipt and upload_receipt tools also have related purposes, though their descriptions help differentiate them slightly.
Most tools follow a consistent verb_noun pattern (e.g., get_account_details, update_expense, upload_receipt), with clear verbs like 'get', 'match', 'update', and 'upload'. The only minor deviation is get_all_accounts vs. get_account_details, but overall the naming is predictable and readable across the set.
With 9 tools, the server is well-scoped for managing Brex accounts, expenses, and receipts. This count is appropriate for the financial domain, covering core operations without being overwhelming, and each tool appears to serve a distinct function in the workflow.
The tool set covers key areas like account retrieval, expense management, and receipt handling, with good CRUD-like operations (e.g., get, update). However, there are minor gaps, such as no tool for creating new expenses or deleting data, which might limit full lifecycle management, but agents can likely work around these for common tasks.
Related MCP Connectors
- BankSyncOAuthio.banksync
Connect AI agents to bank accounts, transactions, balances, and investments.
Connects AI agents to live, verified financial data from 18,000+ institutions — ready to reason from
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
Personal-finance workspace for AI agents: accounts, spending, budgets, goals, and investments.