get-associated-opportunities
Fetch sales opportunities linked to a specific account in Dynamics 365 to track potential deals and manage customer relationships.
Instructions
Fetch opportunities for a given account from Dynamics 365
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes |
Implementation Reference
- src/tools.ts:72-101 (registration)Registration of the 'get-associated-opportunities' tool, including input schema { accountId: z.string() } and inline handler function that calls d365.getAssociatedOpportunities and returns formatted JSON response or error.
server.tool( "get-associated-opportunities", "Fetch opportunities for a given account from Dynamics 365", { accountId: z.string() }, async (req) => { try { const response = await d365.getAssociatedOpportunities(req.accountId); return { content: [ { type: "text", text: JSON.stringify(response, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error: ${ error instanceof Error ? error.message : "Unknown error" }, please check your input and try again.`, }, ], isError: true, }; } } ); - src/main.ts:202-209 (handler)Core handler logic in Dynamics365 class: validates accountId, constructs OData endpoint to filter opportunities by _customerid_value eq accountId, and calls makeApiRequest to fetch from Dynamics 365 API.
public async getAssociatedOpportunities(accountId: string): Promise<any> { if (!accountId) { throw new Error("Account ID is required to fetch opportunities."); } const endpoint = `api/data/v9.2/opportunities?$filter=_customerid_value eq ${accountId}`; return this.makeApiRequest(endpoint, "GET"); } - src/main.ts:101-146 (helper)Helper method in Dynamics365 class that handles authentication, constructs full API URL, sets headers, makes fetch request to Dynamics 365 API, and processes response or error.
private async makeApiRequest( endpoint: string, method: string, body?: any, additionalHeaders?: Record<string, string> ): Promise<any> { const token = await this.authenticate(); const baseUrl = this.d365Url.endsWith("/") ? this.d365Url : `${this.d365Url}/`; const url = `${baseUrl}${endpoint}`; const headers: Record<string, string> = { Authorization: `Bearer ${token}`, Accept: "application/json", "Content-Type": "application/json", "OData-MaxVersion": "4.0", "OData-Version": "4.0", ...additionalHeaders, }; try { const response = await fetch(url, { method, headers, body: body ? JSON.stringify(body) : undefined, }); if (!response.ok) { throw new Error( `API request failed with status: ${ response.status }, message: ${await response.text()}` ); } return await response.json(); } catch (error) { console.error(`API request to ${url} failed:`, error); throw new Error( `Failed to make API request: ${ error instanceof Error ? error.message : String(error) }` ); } }