technicalIndicators_htDcphase
Analyze stock price trends using the Hilbert Transform - Dominant Cycle Phase to identify dominant market cycles and phases for informed trading decisions on MCP Avantage.
Instructions
Hilbert Transform - Dominant Cycle Phase
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| datatype | No | Data format for the response. | json |
| interval | Yes | Time interval (e.g., "daily", "60min", "weekly"). Check Alpha Vantage docs for valid intervals per indicator. | |
| month | No | Specific month for intraday intervals (YYYY-MM format). | |
| series_type | Yes | The desired price type. | |
| symbol | Yes | The stock symbol (e.g., "IBM"). |
Input Schema (JSON Schema)
{
"additionalProperties": false,
"description": "Parameters for HT_DCPHASE.",
"properties": {
"datatype": {
"default": "json",
"description": "Data format for the response.",
"enum": [
"json",
"csv"
],
"type": "string"
},
"interval": {
"description": "Time interval (e.g., \"daily\", \"60min\", \"weekly\"). Check Alpha Vantage docs for valid intervals per indicator.",
"type": "string"
},
"month": {
"description": "Specific month for intraday intervals (YYYY-MM format).",
"type": "string"
},
"series_type": {
"description": "The desired price type.",
"enum": [
"close",
"open",
"high",
"low"
],
"type": "string"
},
"symbol": {
"description": "The stock symbol (e.g., \"IBM\").",
"type": "string"
}
},
"required": [
"symbol",
"interval",
"series_type"
],
"type": "object"
}
Implementation Reference
- src/index.ts:38-115 (handler)Generic handler function that executes all AVantage-based tools, including technicalIndicators_htDcphase. Manages API key, AVantage instance via resourceManager, calls the specific library method av.technicalIndicators.htDcphase(params), and returns JSON data or errors.async function executeAvantageTool<TArgs, TResult>( toolName: string, args: TArgs, context: Context<Record<string, unknown> | undefined>, // Use the imported Context type directly avantageMethod: ( av: AVantage, args: TArgs ) => Promise<{ error?: boolean; reason?: string; data?: TResult }> ): Promise<string> { logger.info(`Executing '${toolName}' tool for request ID: ${context}`); logger.debug(`Args for ${toolName}: ${JSON.stringify(args)}`); // --- Authentication & Resource Management --- // Access extraArgs safely - it might be null or undefined const extraArgsApiKey = context.extraArgs?.apiKey as string | undefined; const apiKey = extraArgsApiKey || config.apiKey; if (!apiKey) { logger.error(`'${toolName}' failed: Alpha Vantage API key missing.`); throw new UserError(apiKeyErrorMessage); } logger.debug( `Using AV API key (source: ${extraArgsApiKey ? "extraArgs" : "environment"}) for ${toolName}` ); try { // Get or create AVantage instance managed by ResourceManager const av = await resourceManager.getResource<AVantage>( apiKey, // Cache key is the resolved API key "avantage_client", // Type identifier for logging async (key) => { // Factory Function logger.info( `Creating new AVantage instance for key ending ...${key.slice(-4)}` ); // AVantage library reads AV_PREMIUM from process.env internally return new AVantage(key); }, async (avInstance) => { // Cleanup Function (no-op needed for AVantage) logger.debug(`Destroying AVantage instance (no-op)`); } ); // --- Library Call --- const result = await avantageMethod(av, args); // --- Response Handling --- if (result.error) { logger.warn( `'${toolName}' failed. Reason from avantage: ${result.reason}` ); throw new UserError(result.reason || `Tool '${toolName}' failed.`); } if (result.data === undefined || result.data === null) { logger.warn(`'${toolName}' completed successfully but returned no data.`); return "null"; // Return string "null" for empty data } logger.info(`'${toolName}' completed successfully.`); // Stringify the data part of the response return JSON.stringify(result.data); } catch (error: any) { logger.error( `Error during execution of '${toolName}': ${error.message}`, error ); // If it's already a UserError, rethrow it if (error instanceof UserError) { throw error; } // Otherwise, wrap it in a UserError throw new UserError( `An unexpected error occurred while executing tool '${toolName}': ${error.message}` ); } }
- src/index.ts:1195-1208 (registration)Registers the MCP tool 'technicalIndicators_htDcphase' with description, input schema, and execute handler delegating to executeAvantageTool with specific AVantage method.name: "technicalIndicators_htDcphase", description: "Hilbert Transform - Dominant Cycle Phase", parameters: schemas.TechnicalIndicatorsHtDcphaseParamsSchema, execute: ( args, context // Let type be inferred ) => executeAvantageTool( "technicalIndicators_htDcphase", args, context, (av, params) => av.technicalIndicators.htDcphase(params) ), });
- src/schemas.ts:235-235 (schema)Zod schema for input parameters of technicalIndicators_htDcphase tool, extending common indicator params (symbol, interval, etc.) with required series_type (open, high, low, close).export const TechnicalIndicatorsHtDcphaseParamsSchema = TechnicalIndicatorsCommonIndicatorParamsSchema.extend({ series_type: SeriesTypeSchema }).describe('Parameters for HT_DCPHASE.');
- src/schemas.ts:204-209 (schema)Base Zod schema extended by htDcphase params schema, defining common fields like symbol, interval.export const TechnicalIndicatorsCommonIndicatorParamsSchema = z.object({ symbol: z.string().describe('The stock symbol (e.g., "IBM").'), interval: z.string().describe('Time interval (e.g., "daily", "60min", "weekly"). Check Alpha Vantage docs for valid intervals per indicator.'), datatype: DatatypeSchema.default('json').optional(), month: z.string().optional().describe('Specific month for intraday intervals (YYYY-MM format).'), }).describe('Common parameters for many technical indicators.')
- src/index.ts:64-81 (helper)Resource manager usage within handler to lazily create and cache AVantage API client instance per API key.// Get or create AVantage instance managed by ResourceManager const av = await resourceManager.getResource<AVantage>( apiKey, // Cache key is the resolved API key "avantage_client", // Type identifier for logging async (key) => { // Factory Function logger.info( `Creating new AVantage instance for key ending ...${key.slice(-4)}` ); // AVantage library reads AV_PREMIUM from process.env internally return new AVantage(key); }, async (avInstance) => { // Cleanup Function (no-op needed for AVantage) logger.debug(`Destroying AVantage instance (no-op)`); } );