What is the Parqet MCP?
The Parqet MCP server is a remote Model Context Protocol server that lets AI agents and other MCP-compatible clients read your portfolio data and add new data. It acts as a bridge between your Parqet account and AI, so you can ask questions about your holdings, performance, transactions, and dividends or ask the agent to create portfolios, holdings, and activities.
The server is hosted at https://mcp.parqet.com and uses OAuth 2.0 via Parqet Connect for authentication. Read and write access use separate OAuth scopes, so write tools only work when you grant permission to update portfolio data.
Write support is limited to creating portfolios and holdings and adding activities. The MCP does not edit or delete existing portfolio data.
Key features
- Portfolio overview: list all your portfolios with names, currencies, and connected brokers
- Portfolio management: create portfolios and add cash, custom, real estate, insurance, P2P, or commodity holdings
- Holdings & valuation: see current positions, market values, weights, and total portfolio worth
- Performance metrics: get XIRR, TTWROR, realized/unrealized gains, dividends, fees, taxes, and net allocations (net exposure)
- Activities: browse or add buys, sells, dividends, transfers, deposits, withdrawals, fees, and taxes
- Multi-portfolio aggregation: query performance across multiple portfolios at once
Authentication
The Parqet MCP server uses OAuth 2.0 authorization code flow via Parqet Connect. It implements RFC 9728 (OAuth Protected Resource Metadata):
- Parqet Connect (
connect.parqet.com) = OAuth authorization server that issues access tokens and enforces the granted permissions - MCP Server (
mcp.parqet.com) = protected resource that accepts bearer tokens and uses them for Parqet Connect API requests - ChatGPT / Claude / other MCP clients = obtain and use tokens
When you connect through an MCP client, you'll be redirected to Parqet to authorize access. The MCP server then uses your access token to read or write data through the Parqet Connect API on your behalf.
Discovery endpoints:
| Endpoint | URL |
|---|---|
| MCP Server Information | https://mcp.parqet.com/.well-known/mcp-server |
| Protected Resource Metadata | https://mcp.parqet.com/.well-known/oauth-protected-resource |
| OAuth Authorization Server | https://mcp.parqet.com/.well-known/oauth-authorization-server |
| Health Check | https://mcp.parqet.com/health |
Supported scopes:
| Scope | Access |
|---|---|
portfolio:read | Read portfolio metadata, holdings, activities, and performance |
portfolio:write | Create portfolios and holdings, and add activities to a portfolio |
Available tools
All tools require authentication. Read tools use readOnlyHint: true; write tools use readOnlyHint: false and idempotentHint: false. Write tools require portfolio:write and should only be called after you confirm the final inputs. Call parqet_get_user first when the portfolio IDs are unknown.
parqet_help
Returns the MCP's current tool-routing instructions and parameter conventions. Use it when the agent is unsure which Parqet tool to call.
Parameters: none
parqet_get_user
Returns the authenticated user's info and their accessible portfolios. Use the portfolio IDs from the response for all other tools.
Parameters: none
Returns: userId, state, permissions[] (each with resourceId and access level)
parqet_list_portfolios
Lists all portfolios with metadata (name, currency, creation date, connected brokers) in a single call.
Parameters: none
Returns: items[] with id, name, currency, createdAt, distinctBrokers
parqet_create_portfolio
Creates a portfolio after you confirm its final name.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
name | string | yes | Portfolio name, 1-80 characters |
Returns: the new portfolio's id, name, and direct Parqet URL
parqet_create_holding
Creates a non-security holding in an existing portfolio. Supported holding types are cash, custom, real_estate, insurance, p2p, and commodity. Securities and cryptocurrencies are resolved from an ISIN or symbol when activities are added, so they do not need to be created first.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioId | string | yes | Portfolio ID |
holding | object | yes | Holding details, including type, name, and fields required by the selected holding type |
All holding types accept an optional externalId. Cash holdings can specify currency and referenceAccountFor. Custom holdings require assetProduct and can include initial valuation quotes. Commodity holdings require the metal identifier plus amount, purity, and unit.
Returns: the new holding's id, portfolioId, type, and name. Use the holding ID when adding activities for it.
parqet_get_portfolio
Gets metadata for a single portfolio by ID.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioId | string | yes | Portfolio ID from parqet_get_user |
Returns: id, name, currency, createdAt
parqet_query_portfolio
Returns a compact, purpose-built portfolio view. This is the preferred tool for most portfolio questions.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
view | string | yes | overview, holdings, dividends, or allocation |
portfolioIds | string | string | yes | One or more portfolio IDs (max 25) |
currency | string | no | Target currency for portfolio values |
intervalType | string | no | relative for preset ranges or absolute for a custom date range |
intervalValue | string | no | Relative range: 1d, 1w, mtd, 1m, 3m, 6m, 1y, ytd, 3y, 5y, 10y, or max |
intervalStart | string | no | ISO 8601 start for an absolute interval |
intervalEnd | string | no | ISO 8601 end for an absolute interval |
assetType | string | string | no | Holding type filter for the holdings view |
includeSold | boolean | no | Include sold holdings in the holdings view |
sortBy | string | no | Sort holdings by value, gain, return, or name |
limit | number | no | Maximum holdings to return, 1-500 |
topHoldingsLimit | number | no | Number of top holdings in overview, or per allocation side, 0-25 |
includeCharts | boolean | no | Include the larger chart/time-series payload |
Returns: compact data for the selected view, including the interval and value currency
parqet_get_activity_summary
Summarizes activities by type, asset type, and currency and automatically follows pagination up to a configurable limit. This is the preferred tool for transaction totals and recent-activity questions.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioId | string | yes | Portfolio ID |
activityType | string | string | no | Filter by one or more activity types |
assetType | string | string | no | Filter by one or more holding asset types |
holdingId | string | string | no | Filter by one or more holding IDs |
maxActivities | number | no | Maximum activities to scan, 10-2,000 (default: 500) |
recentLimit | number | no | Recent activity rows to include, 0-100 (default: 20) |
cursor | string | no | Continue a previously truncated summary |
Returns: grouped totals, counts, recent activities, and completion/pagination metadata
parqet_get_activities
Retrieves raw transaction rows for a portfolio. Results are paginated. Prefer parqet_get_activity_summary unless row-level details are needed.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioId | string | yes | Portfolio ID |
activityType | string | string | no | Filter by type: buy, sell, dividend, interest, transfer_in, transfer_out, fees_taxes, deposit, withdrawal |
assetType | string | string | no | Filter by holding asset type: cash, security, crypto, commodity, custom, insurance, p2p, real_estate |
holdingId | string | string | no | Filter by one or more holding IDs |
limit | number | no | Page size, 10–500 (default: 100) |
cursor | string | no | Pagination cursor from previous response |
Returns: activities[] (each with type, nested asset object discriminated by assetIdentifierType, holdingId, holdingAssetType, shares, price, amount, amountNet, currency, datetime, tax, fee, broker; sell and transfer_out also include realizedGains, realizedGainsNet, avgHoldingPeriod, buyAmountNet), cursor
parqet_add_activities
Adds a batch of 1-100 activities to an existing portfolio after you confirm the portfolio and final activity details.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioId | string | yes | Portfolio ID |
activities | object | yes | One to 100 activities to add |
Each activity requires type, currency, datetime, an asset identifier, and either shares plus price or amount:
| Asset | Identifier fields | Value fields |
|---|---|---|
| Security | assetIdentifierType: "isin", isin | shares, price |
| Cryptocurrency | assetIdentifierType: "crypto_symbol", symbol | shares, price |
| Cash | assetIdentifierType: "cash", holdingId | amount |
| Commodity or real estate | matching assetIdentifierType, holdingId | shares, price |
| Insurance or P2P | matching assetIdentifierType, holdingId | amount |
| Custom asset | assetIdentifierType: "custom_asset", holdingId | shares, price |
Optional fields include tax, fee, description, broker, and externalId. Insurance and P2P activities do not support interest.
Returns: the overall status and requested, created, and failed counts, plus createdActivities and notCreatedActivities
parqet_get_performance
Returns the raw, nested portfolio performance payload. Prefer parqet_query_portfolio unless the complete holdings, quote, performance, or chart payload is needed.
Parameters:
| Name | Type | Required | Description |
|---|---|---|---|
portfolioIds | string | string | yes | One or more portfolio IDs (max 25) |
currency | string | no | Target currency for performance money values |
intervalType | string | no | "relative" for preset ranges, "absolute" for a custom date range. Defaults to relative "max" if omitted |
intervalValue | string | no | Preset range (only for intervalType: "relative"): 1d, 1w, mtd, 1m, 3m, 6m, 1y, ytd, 3y, 5y, 10y, max |
intervalStart | string | no | ISO 8601 datetime for interval start (only for intervalType: "absolute") |
intervalEnd | string | no | ISO 8601 datetime for interval end (only for intervalType: "absolute", defaults to now) |
includeCharts | boolean | no | Include the large chart/time-series payload (default: false) |
Returns:
holdings[]— current positions withasset(name, ISIN/symbol, type),position(shares, purchasePrice, purchaseValue, currentPrice, currentValue, isSold), per-holdingperformance(kpis, gains, dividends, fees, taxes, valuation),quoteandstartQuote(price, currency, exchange, fx),nickname,logokpis.inInterval.xirr— annualized money-weighted returnkpis.inInterval.ttwror— time-weighted returnvaluation.atIntervalEnd— current total portfolio valuerealizedGains.inInterval— profit from sold positionsunrealizedGains.inInterval— paper profit on current holdingsdividends.inInterval— dividend incomefees.inInterval.fees— total fees paidtaxes.inInterval.taxes— total taxes paidnetAllocations.net— net total across positive and negative holdingsnetAllocations.base— larger absolute side used as the allocation basenetAllocations.positive— positive bucket withtotal,shareOfBase, and aholdingsmap by holding IDnetAllocations.negative— negative bucket withtotal,shareOfBase, and aholdingsmap by holding ID
Connect to the Parqet MCP server
Any MCP client that supports Streamable HTTP transport and OAuth 2.0 can connect:
{
"parqet": {
"url": "https://mcp.parqet.com"
}
}
The server uses OAuth for authentication. Your client will be redirected to Parqet Connect to authorize access.
See Connect the Parqet MCP to Claude for a full walkthrough.
Usage examples
Example 1: Check portfolio value and top holdings
Prompt: "What's my portfolio worth and what are my biggest positions?"
The AI will call parqet_get_user to find your portfolios, then parqet_query_portfolio with the overview view to get the current valuation and largest holdings. You'll get a response like:
Your portfolio "Main Account" is currently worth €47,230. Your top 3 positions are:
- iShares MSCI World ETF — €18,500 (39.2%)
- Apple Inc. — €8,200 (17.4%)
- NVIDIA Corp. — €5,100 (10.8%)
Example 2: Review dividend income
Prompt: "How much dividend income did I receive, and from which holdings?"
The AI calls parqet_query_portfolio with the dividends view. You'll see a breakdown of gross/net dividend income, taxes withheld, and which assets paid dividends.
Example 3: Analyze recent transactions
Prompt: "Show me all my stock purchases in the last month."
The AI calls parqet_get_activities with activityType: ["buy"], follows pagination, and filters the rows by date. You'll get a list of recent buys with asset names, share counts, prices, and total amounts.
Example 4: Compare portfolio performance
Prompt: "What's my annualized return across all portfolios?"
The AI calls parqet_get_user to discover all portfolio IDs, then parqet_query_portfolio with all IDs and the overview view. You'll see your XIRR (money-weighted return) and TTWROR (time-weighted return) across all accounts.
Example 5: Look up a specific holding
Prompt: "How many Tesla shares do I have and what's my profit on them?"
The AI calls parqet_query_portfolio with the holdings view and finds Tesla in the result. You'll see your share count, current value, purchase value, and unrealized gain/loss.
Example 6: Understand net exposure
Prompt: "What's my net exposure, and which holdings contribute to negative allocations?"
The AI calls parqet_query_portfolio with the allocation view. You'll get the overall net exposure plus a breakdown of the holdings that make up the positive and negative sides of the portfolio.
Example 7: Create a portfolio
Prompt: "Create a portfolio named Long-term investments."
The AI confirms the final portfolio name with you, then calls parqet_create_portfolio. The response includes a direct link to open the new portfolio in Parqet.
Example 8: Add an activity
Prompt: "Add my purchase of 10 Apple shares at $225 per share on September 15, 2026 to my Main Account portfolio."
The AI resolves the portfolio and asset, asks you to confirm the final transaction details, then calls parqet_add_activities. The result reports whether the activity was created or why it failed.
Write safety
- Write tools should only run after explicit user intent and confirmation of the final inputs
parqet_create_holdingmust be used before adding activities for a new cash, custom, real estate, insurance, P2P, or commodity holding- Activity
externalIdvalues are optional but strongly recommended as deduplication keys; they must be unique within a batch - Activity batches can partially succeed, so clients must inspect
createdActivitiesandnotCreatedActivitiesbefore retrying - A timeout or server error can leave the write outcome unknown; verify the current portfolio data before retrying
- Historical shares and prices should be entered exactly as traded, without adjusting them for later stock splits
Privacy & data handling
- The MCP server only accesses data you explicitly authorize via OAuth
- All communication uses HTTPS/TLS
- No conversation data is collected or stored by the MCP server
- Access tokens are scoped to the permissions you grant during OAuth
- You can revoke access at any time through your Parqet account settings
For details, see the Parqet Privacy Policy.
Support
If you run into issues with the Parqet MCP server:
- Email: [email protected]
- Developer Hub: developer.parqet.com
