Algorand MCP

// Direct URI templates for resources export const URI_TEMPLATES = { // Algod resources ALGOD_ACCOUNT: 'algorand://algod/accounts/{address}', ALGOD_ACCOUNT_APPLICATION: 'algorand://algod/accounts/{address}/application/{app-id}', ALGOD_ACCOUNT_ASSET: 'algorand://algod/accounts/{address}/asset/{asset-id}', ALGOD_APPLICATION: 'algorand://algod/applications/{app-id}', ALGOD_APPLICATION_BOX: 'algorand://algod/applications/{app-id}/box/{name}', ALGOD_APPLICATION_BOXES: 'algorand://algod/applications/{app-id}/boxes', ALGOD_ASSET: 'algorand://algod/assets/{asset-id}', ALGOD_PENDING_TXN: 'algorand://algod/transactions/pending/{txid}', ALGOD_PENDING_TXNS_BY_ADDRESS: 'algorand://algod/accounts/{address}/transactions/pending', ALGOD_PENDING_TXNS: 'algorand://algod/transactions/pending', ALGOD_TXN_PARAMS: 'algorand://algod/transactions/params', ALGOD_STATUS: 'algorand://algod/status', ALGOD_STATUS_AFTER_BLOCK: 'algorand://algod/status/wait-for-block-after/{round}', // Indexer resources INDEXER_ACCOUNT: 'algorand://indexer/accounts/{address}', INDEXER_ACCOUNT_TRANSACTIONS: 'algorand://indexer/accounts/{address}/transactions', INDEXER_ACCOUNT_APPS_LOCAL_STATE: 'algorand://indexer/accounts/{address}/apps-local-state', INDEXER_ACCOUNT_CREATED_APPS: 'algorand://indexer/accounts/{address}/created-applications', INDEXER_ASSETS: 'algorand://indexer/assets', INDEXER_ASSET: 'algorand://indexer/assets/{asset-id}', INDEXER_ASSET_BALANCES: 'algorand://indexer/assets/{asset-id}/balances', INDEXER_ASSET_TRANSACTIONS: 'algorand://indexer/assets/{asset-id}/transactions', INDEXER_ASSET_BALANCE_BY_ADDRESS: 'algorand://indexer/assets/{asset-id}/balances/{address}', INDEXER_ASSET_TRANSACTION_BY_ID: 'algorand://indexer/assets/{asset-id}/transactions/{txid}', INDEXER_TRANSACTION: 'algorand://indexer/transactions/{txid}', INDEXER_TRANSACTIONS: 'algorand://indexer/transactions', INDEXER_APPLICATION: 'algorand://indexer/applications/{app-id}', INDEXER_APPLICATION_BOX: 'algorand://indexer/applications/{app-id}/box/{name}', INDEXER_APPLICATION_BOXES: 'algorand://indexer/applications/{app-id}/boxes', INDEXER_APPLICATION_LOGS: 'algorand://indexer/applications/{app-id}/logs', INDEXER_APPLICATIONS: 'algorand://indexer/applications' }; // Mapping from URI templates to API endpoints export const URI_TO_ENDPOINT = { // Algod endpoints [URI_TEMPLATES.ALGOD_ACCOUNT]: '/v2/accounts/{address}', [URI_TEMPLATES.ALGOD_ACCOUNT_APPLICATION]: '/v2/accounts/{address}/application/{app-id}', [URI_TEMPLATES.ALGOD_ACCOUNT_ASSET]: '/v2/accounts/{address}/asset/{asset-id}', [URI_TEMPLATES.ALGOD_APPLICATION]: '/v2/applications/{app-id}', [URI_TEMPLATES.ALGOD_APPLICATION_BOX]: '/v2/applications/{app-id}/box/{name}', [URI_TEMPLATES.ALGOD_APPLICATION_BOXES]: '/v2/applications/{app-id}/boxes', [URI_TEMPLATES.ALGOD_ASSET]: '/v2/assets/{asset-id}', [URI_TEMPLATES.ALGOD_PENDING_TXN]: '/v2/transactions/pending/{txid}', [URI_TEMPLATES.ALGOD_PENDING_TXNS_BY_ADDRESS]: '/v2/accounts/{address}/transactions/pending', [URI_TEMPLATES.ALGOD_PENDING_TXNS]: '/v2/transactions/pending', [URI_TEMPLATES.ALGOD_TXN_PARAMS]: '/v2/transactions/params', [URI_TEMPLATES.ALGOD_STATUS]: '/v2/status', [URI_TEMPLATES.ALGOD_STATUS_AFTER_BLOCK]: '/v2/status/wait-for-block-after/{round}', // Indexer endpoints [URI_TEMPLATES.INDEXER_ACCOUNT]: '/v2/accounts/{address}', [URI_TEMPLATES.INDEXER_ACCOUNT_TRANSACTIONS]: '/v2/accounts/{address}/transactions', [URI_TEMPLATES.INDEXER_ACCOUNT_APPS_LOCAL_STATE]: '/v2/accounts/{address}/apps-local-state', [URI_TEMPLATES.INDEXER_ACCOUNT_CREATED_APPS]: '/v2/accounts/{address}/created-applications', [URI_TEMPLATES.INDEXER_ASSETS]: '/v2/assets', [URI_TEMPLATES.INDEXER_ASSET]: '/v2/assets/{asset-id}', [URI_TEMPLATES.INDEXER_ASSET_BALANCES]: '/v2/assets/{asset-id}/balances', [URI_TEMPLATES.INDEXER_ASSET_TRANSACTIONS]: '/v2/assets/{asset-id}/transactions', [URI_TEMPLATES.INDEXER_ASSET_BALANCE_BY_ADDRESS]: '/v2/assets/{asset-id}/balances/{address}', [URI_TEMPLATES.INDEXER_ASSET_TRANSACTION_BY_ID]: '/v2/assets/{asset-id}/transactions/{txid}', [URI_TEMPLATES.INDEXER_TRANSACTION]: '/v2/transactions/{txid}', [URI_TEMPLATES.INDEXER_TRANSACTIONS]: '/v2/transactions', [URI_TEMPLATES.INDEXER_APPLICATION]: '/v2/applications/{app-id}', [URI_TEMPLATES.INDEXER_APPLICATION_BOX]: '/v2/applications/{app-id}/box/{name}', [URI_TEMPLATES.INDEXER_APPLICATION_BOXES]: '/v2/applications/{app-id}/boxes', [URI_TEMPLATES.INDEXER_APPLICATION_LOGS]: '/v2/applications/{app-id}/logs', [URI_TEMPLATES.INDEXER_APPLICATIONS]: '/v2/applications' }; // Helper function to convert MCP URI to API endpoint export function mcpUriToEndpoint(uri: string): string { // Extract the path part after algorand:// const path = uri.replace(/^algorand:\/\//, ''); // Find matching template for (const [template, endpoint] of Object.entries(URI_TO_ENDPOINT)) { const templatePath = template.replace(/^algorand:\/\//, ''); const pattern = new RegExp('^' + templatePath.replace(/\{[^}]+\}/g, '([^/]+)') + '$'); const templateMatch = path.match(pattern); if (templateMatch) { // Extract parameter values const params = templatePath.match(/\{([^}]+)\}/g) || []; let result = endpoint; // Replace parameters in endpoint params.forEach((param, index) => { result = result.replace(param, templateMatch[index + 1]); }); return result; } } throw new Error(`No matching endpoint found for URI: ${uri}`); }