create_portfolio
Generate a new portfolio on Paper's trading platform by specifying account ID, portfolio name, and type (e.g., INDIVIDUAL, IRA). Integrates with AI assistants via the Paper MCP Server for streamlined portfolio management.
Instructions
Create a new portfolio
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Account ID | |
| name | Yes | Portfolio name | |
| type | Yes | Portfolio type (e.g., INDIVIDUAL, IRA) |
Implementation Reference
- src/index.ts:422-424 (handler)Handler implementation for the 'create_portfolio' tool. It performs a POST request to the '/accounts/portfolios' API endpoint using the provided arguments.case 'create_portfolio': response = await api.post('/accounts/portfolios', args); break;
- src/index.ts:108-120 (schema)Tool definition including name, description, and input schema for 'create_portfolio' used in tool listing.{ name: 'create_portfolio', description: 'Create a new portfolio', inputSchema: { type: 'object', properties: { accountId: { type: 'string', description: 'Account ID' }, name: { type: 'string', description: 'Portfolio name' }, type: { type: 'string', description: 'Portfolio type (e.g., INDIVIDUAL, IRA)' } }, required: ['accountId', 'name', 'type'] } },
- src/index.ts:388-392 (registration)Registration of the tools list handler which includes the 'create_portfolio' tool schema.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools }; });
- src/index.ts:395-565 (registration)Registration of the call tool handler which dispatches to the create_portfolio implementation via switch case.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (!args) { throw new Error('No arguments provided'); } try { let response; switch (name) { // === ACCOUNT MANAGEMENT === case 'get_account': response = await api.get(`/accounts/${args.accountId}`); break; case 'update_account': response = await api.put(`/accounts/${args.accountId}`, { name: args.name }); break; case 'freeze_account': response = await api.put(`/accounts/${args.accountId}/freeze`); break; // === PORTFOLIO OPERATIONS === case 'create_portfolio': response = await api.post('/accounts/portfolios', args); break; case 'get_portfolio': response = await api.get(`/accounts/portfolios/${args.portfolioId}`); break; case 'get_account_portfolios': response = await api.get(`/accounts/${args.accountId}/portfolios`); break; case 'reset_portfolio': response = await api.post(`/accounts/portfolios/${args.portfolioId}/reset`); break; // === POSITIONS === case 'get_portfolio_equities': response = await api.get(`/accounts/portfolios/${args.portfolioId}/equities`); break; case 'get_portfolio_options': response = await api.get(`/accounts/portfolios/${args.portfolioId}/options`); break; // === TRADING === case 'create_order': response = await api.post('/orders', { ...args, assetClass: args.assetClass || 'EQUITY', session: args.session || 'REGULAR', timeInForce: args.timeInForce || 'DAY' }); break; case 'create_batch_orders': response = await api.post('/orders/batch', args.orders); break; case 'get_order': response = await api.get(`/orders/${args.orderId}`); break; case 'cancel_order': response = await api.put(`/orders/${args.orderId}/cancel`); break; case 'get_account_orders': response = await api.get(`/orders/account/${args.accountId}`, { params: { page: args.page || 1, limit: args.limit || 10 } }); break; case 'cancel_all_account_orders': response = await api.delete(`/orders/account/${args.accountId}`); break; case 'get_today_filled_orders': response = await api.get('/orders/filled/today', { params: { page: args.page || 1, limit: args.limit || 10 } }); break; // === MARKET DATA === case 'get_quote': response = await api.get(`/market-data/quote/${args.symbol}`); break; case 'get_batch_quotes': response = await api.post('/market-data/quotes/batch', { symbols: args.symbols }); break; case 'get_market_hours': if (args.exchange) { response = await api.get(`/market-data/market-hours/${args.exchange}`); } else { response = await api.get('/market-data/market-hours'); } break; case 'is_market_open': response = await api.get(`/market-data/is-market-open/${args.symbol}`); break; // === ACTIVITY LOG === case 'get_portfolio_activities': const params: any = { page: args.page || 1, limit: args.limit || 20 }; if (args.category) { params.category = args.category; } response = await api.get(`/activity-log/portfolio/${args.portfolioId}`, { params }); break; case 'get_day_trades': response = await api.get(`/accounts/portfolios/${args.portfolioId}/day-trades`, { params: { page: args.page || 1, limit: args.limit || 50 } }); break; // === MARGIN TRADING === case 'upgrade_to_margin': response = await api.put(`/accounts/portfolios/${args.portfolioId}/margin-upgrade`, { marginAgreement: args.marginAgreement }); break; default: throw new Error(`Unknown tool: ${name}`); } return { content: [ { type: 'text', text: JSON.stringify(response.data, null, 2) } ] }; } catch (error: any) { return { content: [ { type: 'text', text: `Error: ${error.message}\n${error.response?.data ? JSON.stringify(error.response.data) : ''}` } ], isError: true }; } });