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 "Install 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 but provides minimal information. It doesn't indicate whether this is a read-only operation, what authentication is required, whether there are rate limits, what format the detailed information returns, or any error conditions. While 'Get' implies a read operation, the lack of behavioral details is a significant gap for a tool with no annotation coverage.
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 - a single sentence that directly states the tool's purpose without any wasted words. It's front-loaded with the core functionality and doesn't include unnecessary elaboration. For a simple retrieval tool, this level of conciseness is appropriate and efficient.
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 for a tool that presumably returns detailed account information. It doesn't specify what 'detailed information' includes, what format it returns, or any behavioral constraints. For a financial account tool with no structured output documentation, the description should provide more context about what information agents can expect to receive.
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 single parameter 'accountId' clearly documented as 'ID of the Brex account'. The description doesn't add any parameter information beyond what the schema provides, which is acceptable given the high schema coverage. The baseline score of 3 reflects adequate but not exceptional parameter documentation.
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 distinguish this tool from its sibling 'get_all_accounts' - both appear to retrieve account information, but this one seems focused on a single account while the sibling retrieves all accounts. The description could be more specific about what 'detailed information' includes.
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. With sibling tools like 'get_all_accounts' and 'get_transactions' available, there's no indication whether this tool should be used for single account details versus the sibling for multiple accounts, or what specific use cases warrant this tool. The agent must infer usage from the name 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 not in the schema. However, it doesn't describe other key behaviors like authentication requirements, rate limits, error handling, or what the return format looks like (e.g., list structure, metadata). For a list tool with no annotations, 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 with zero wasted words. It's front-loaded with the core purpose ('Get all Brex accounts') and adds only essential behavioral context ('with pagination support'). Every element earns its place.
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 no annotations and no output schema, the description is minimally adequate for a list tool. It covers the core purpose and pagination behavior but lacks details on authentication, rate limits, error cases, and return format. For a tool with 3 parameters and no structured safety/behavior annotations, it should provide more contextual guidance to be complete.
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 three parameters. The description doesn't add any parameter-specific information beyond what's in the schema (e.g., it doesn't explain how pagination parameters interact or provide examples). Baseline 3 is appropriate when the schema does all the parameter documentation 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 accounts'), making the purpose unambiguous. It distinguishes from siblings like 'get_account_details' by emphasizing 'all' accounts rather than specific details. However, it doesn't explicitly differentiate from other list tools like 'get_all_expenses' beyond the resource type.
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 choose 'get_all_accounts' over 'get_account_details' for individual accounts, or how it relates to other list tools like 'get_all_expenses'. There's no context about prerequisites, limitations, or typical use cases.
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?
No annotations are provided, so the description carries the full burden. It mentions 'Get transactions' but doesn't disclose behavioral traits such as whether this is a read-only operation, if it requires specific permissions, rate limits, pagination details, or error handling. This leaves significant gaps for an agent to understand how to use it safely and effectively.
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 front-loaded and appropriately sized, making it easy to parse quickly.
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 the tool returns (e.g., transaction format, fields), behavioral aspects like safety or performance, or how it fits with sibling tools. For a tool with 2 parameters and no structured context, more detail is needed to guide an agent 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, clearly documenting both parameters ('accountId' and 'limit'). The description adds no additional meaning beyond what the schema provides, such as explaining transaction types or date ranges. With high schema coverage, the baseline score of 3 is appropriate as the schema handles 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 clearly states the verb ('Get') and resource ('transactions for a Brex account'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'get_expenses' or 'get_all_expenses' that might retrieve similar financial 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. With siblings like 'get_expenses' and 'get_all_expenses' available, it's unclear if this tool is for specific account transactions, all transactions, or how it differs, offering no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_receiptB
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. While it mentions the creation of a pre-signed URL and automatic matching, it doesn't describe what happens after upload, whether there are rate limits, authentication requirements, error conditions, or what the matching process entails. The description is insufficient for a mutation tool with zero annotation coverage.
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 without unnecessary words. It's front-loaded with the main action and outcome, making it easy to parse quickly.
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 that creates pre-signed URLs (implying file upload and backend processing) with no annotations and no output schema, the description is incomplete. It doesn't explain what the pre-signed URL is used for, what format the response takes, or what happens after matching. The agent lacks crucial information about this tool's behavior and outputs.
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%, so all parameters are documented in the input schema. The description doesn't add any parameter-specific information beyond what's already in the schema properties. This meets the baseline expectation when schema documentation is complete.
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'). It distinguishes from sibling tools like 'upload_receipt' by specifying the pre-signed URL creation and automatic matching functionality.
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 'upload_receipt' or other expense-related tools. It doesn't mention prerequisites, constraints, or typical use cases, leaving the agent with no contextual decision-making information.
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' implies a mutation operation, but the description doesn't specify what happens during updates (e.g., whether fields are overwritten or merged, if changes are reversible, permission requirements, or rate limits). This leaves significant gaps for an agent to understand the tool's behavior.
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 purpose without any wasted words. It's appropriately sized for a straightforward update operation and is front-loaded with 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?
For a mutation tool with 7 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what the tool returns, error conditions, or behavioral nuances. While the schema covers parameters well, the overall context for safe and effective use is incomplete.
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%, with each parameter clearly documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema (like explaining relationships between parameters or special constraints). This meets the baseline expectation when schema coverage is complete.
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 target resource ('an existing card expense'), making the purpose immediately understandable. However, it doesn't differentiate this tool from potential sibling update operations (like updating transactions or receipts) that might exist in the broader system, though none are listed among the provided siblings.
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 (like needing an existing expense ID), when not to use it (e.g., for creating new expenses), or how it relates to sibling tools like 'get_all_card_expenses' or 'upload_receipt'.
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 the full burden of behavioral disclosure. It states the action ('upload') but doesn't mention whether this is a mutation (likely yes), what permissions are required, how errors are handled, or what happens after upload (e.g., does it trigger matching automatically?). For a tool that likely modifies data, 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 directly states the tool's purpose without unnecessary words. It is front-loaded and wastes no space, making it easy for an agent to parse quickly.
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 of an upload operation with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., a receipt ID, match status), error conditions, or side effects, leaving the agent with insufficient context to use it effectively beyond basic parameter passing.
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, clearly documenting all three required parameters (receipt_data, receipt_name, content_type) with examples. The description adds no additional parameter semantics beyond what the schema provides, so it meets the baseline of 3 for adequate but not enhanced coverage.
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 ('upload') and resource ('receipt image') with the purpose 'to match with expenses', which is specific and actionable. However, it doesn't explicitly distinguish this tool from its sibling 'match_receipt', which appears related but has a different name, leaving some ambiguity about their distinct roles.
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 other expense-related tools. It lacks context about prerequisites (e.g., whether an expense must exist first) or exclusions, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
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.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MCP-Mirror/crazyrabbitLTC_mcp-brex-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server