#
tokens: 49938/50000 34/942 files (page 1/93)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 1 of 93. Use http://codebase.md/goplausible/algorand-mcp?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── llms-install.md
├── llms.txt
├── package.json
├── packages
│   ├── client
│   │   ├── .env.example
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── env.ts
│   │   │   ├── index.ts
│   │   │   └── LocalWallet.ts
│   │   └── tsconfig.json
│   └── server
│       ├── .env.example
│       ├── API specs
│       │   ├── algod_api.json
│       │   ├── indexer_api.json
│       │   ├── mcp.json
│       │   ├── nfd_api.json
│       │   ├── ultrade_api.json
│       │   ├── vestige_api.json
│       │   └── vestige_free_api.json
│       ├── Dockerfile
│       ├── jest.config.js
│       ├── package.json
│       ├── README.md
│       ├── smithery.yaml
│       ├── src
│       │   ├── algorand-client.ts
│       │   ├── env.ts
│       │   ├── index.ts
│       │   ├── resources
│       │   │   ├── index.ts
│       │   │   ├── knowledge
│       │   │   │   ├── ARCs.txt
│       │   │   │   ├── developers-algokit-architecture-decisions.txt
│       │   │   │   ├── developers-algokit-cli.txt
│       │   │   │   ├── developers-algokit-utils-python.txt
│       │   │   │   ├── developers-algokit-utils-typescript.txt
│       │   │   │   ├── developers-clis.txt
│       │   │   │   ├── developers-details.txt
│       │   │   │   ├── developers-liquid-auth.txt
│       │   │   │   ├── developers-nodes.txt
│       │   │   │   ├── developers-puya.txt
│       │   │   │   ├── developers-python.txt
│       │   │   │   ├── developers-sdks-js.txt
│       │   │   │   ├── developers-sdks-python.txt
│       │   │   │   ├── developers-tealscript.txt
│       │   │   │   ├── developers.txt
│       │   │   │   ├── index.ts
│       │   │   │   ├── taxonomy
│       │   │   │   │   ├── algokit-cli:README.md
│       │   │   │   │   ├── algokit:cli:algokit.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-14_sandbox-approach.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2022-11-22_beaker-testing-strategy.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_beaker_productionisation_review.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-11_brew_install.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-01-12_smart-contract-deployment.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-06-06_frontend-templates.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2023-07-19_advanced_generate_command.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-13_native_binaries.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-23_init-wizard-v2.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-01-31_binary_distribution.md
│       │   │   │   │   ├── algokit:cli:architecture-decisions:2024-03-06_local_dev_ui_packaging.md
│       │   │   │   │   ├── algokit:cli:articles:output_stability.md
│       │   │   │   │   ├── algokit:cli:cli:index.md
│       │   │   │   │   ├── algokit:cli:features:compile.md
│       │   │   │   │   ├── algokit:cli:features:completions.md
│       │   │   │   │   ├── algokit:cli:features:config.md
│       │   │   │   │   ├── algokit:cli:features:dispenser.md
│       │   │   │   │   ├── algokit:cli:features:doctor.md
│       │   │   │   │   ├── algokit:cli:features:explore.md
│       │   │   │   │   ├── algokit:cli:features:generate.md
│       │   │   │   │   ├── algokit:cli:features:goal.md
│       │   │   │   │   ├── algokit:cli:features:init.md
│       │   │   │   │   ├── algokit:cli:features:localnet.md
│       │   │   │   │   ├── algokit:cli:features:project:bootstrap.md
│       │   │   │   │   ├── algokit:cli:features:project:deploy.md
│       │   │   │   │   ├── algokit:cli:features:project:link.md
│       │   │   │   │   ├── algokit:cli:features:project:list.md
│       │   │   │   │   ├── algokit:cli:features:project:run.md
│       │   │   │   │   ├── algokit:cli:features:project.md
│       │   │   │   │   ├── algokit:cli:features:tasks:analyze.md
│       │   │   │   │   ├── algokit:cli:features:tasks:ipfs.md
│       │   │   │   │   ├── algokit:cli:features:tasks:mint.md
│       │   │   │   │   ├── algokit:cli:features:tasks:nfd.md
│       │   │   │   │   ├── algokit:cli:features:tasks:opt.md
│       │   │   │   │   ├── algokit:cli:features:tasks:send.md
│       │   │   │   │   ├── algokit:cli:features:tasks:sign.md
│       │   │   │   │   ├── algokit:cli:features:tasks:transfer.md
│       │   │   │   │   ├── algokit:cli:features:tasks:vanity_address.md
│       │   │   │   │   ├── algokit:cli:features:tasks:wallet.md
│       │   │   │   │   ├── algokit:cli:features:tasks.md
│       │   │   │   │   ├── algokit:cli:tutorials:algokit-template.md
│       │   │   │   │   ├── algokit:cli:tutorials:intro.md
│       │   │   │   │   ├── algokit:cli:tutorials:smart-contracts.md
│       │   │   │   │   ├── algokit:docs:testnet_api.md
│       │   │   │   │   ├── algokit:lora:README.md
│       │   │   │   │   ├── algokit:README.md
│       │   │   │   │   ├── algokit:utils:python:markdown:apidocs:algokit_utils:algokit_utils.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:markdown:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:markdown:index.md
│       │   │   │   │   ├── algokit:utils:python:README.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:debugger.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:python:source:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:python:source:index.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:account.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:algorand-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:amount.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app-deploy.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:app.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:asset.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:dispenser-client.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:event-emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction-composer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:capabilities:typed-app-clients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TestLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:testing.TransactionLogger.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account_manager.AccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.MultisigAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_account.SigningAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algo_http_client_with_retry.AlgoHttpClientWithRetry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_creator.AlgorandClientTransactionCreator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client_transaction_sender.AlgorandClientTransactionSender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_algorand_client.AlgorandClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_amount.AlgoAmount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_arc56.Arc56Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.AppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_client.ApplicationClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_deployer.AppDeployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_factory.AppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_app_manager.AppManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_asset_manager.AssetManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_async_event_emitter.AsyncEventEmitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_client_manager.ClientManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_composer.TransactionComposer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_config.UpdatableConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_dispenser_client.TestNetDispenserApiClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_kmd_account_manager.KmdAccountManager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:classes:types_logic_error.LogicError.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnSchemaBreak.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_app.OnUpdate.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.AccountStatus.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.ApplicationOnComplete.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_indexer.SignatureType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:enums:types_lifecycle_events.EventType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account_manager.EnsureFundedResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.AccountConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_account.TransactionSignerAccount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_algorand_client_interface.AlgorandClientInterface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Arc56Contract.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Event.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.Method.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.ProgramSourceInfo.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageKey.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StorageMap.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_arc56.StructField.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallABIArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCallCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCallInterfaceParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployCoreParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientDeployParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.AppSourceMaps.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.FundAppAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppById.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.ResolveAppByIdBase.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_client.SourceMapExport.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_deployer.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_factory.AppFactoryParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.AppInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_manager.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSources.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.AppSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.CallConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.DeclaredSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Hint.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.ReservedSchemaValueSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Schema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.SchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.StateSchemaSpec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app_spec.Struct.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCallTransactionResultOfType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppCompilationResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeploymentParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppDeployMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppLookup.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppMetadata.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppState.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.AppStorageSchema.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxName.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxReference.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValueRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.BoxValuesRequestParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CompiledTeal.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CoreAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.CreateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.RawAppCallArgs.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.TealTemplateParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_app.UpdateAppParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.AssetInformation.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset_manager.BulkAssetOptInOutResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetBulkOptInOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptInParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.AssetOptOutParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_asset.CreateAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.AlgoSdkClients.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppClient.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_client_manager.TypedAppFactory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_composer.BuiltTransactions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_config.Config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.AVMTracesEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourceDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_debugging.TealSourcesDebugEventData.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserFundResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.DispenserLimitResponse.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_dispenser_client.TestNetDispenserApiClientParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_indexer.LookupAssetHoldingsOptions.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_logic_error.LogicErrorDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoClientConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.AlgoConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_network_client.NetworkDetails.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgoKitLogCaptureFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixture.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandFixtureConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.AlgorandTestAutomationContext.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.GetTestAccountParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_testing.LogSnapshotConfig.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.AtomicTransactionComposerToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.ConfirmedTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendAtomicTransactionComposerResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResult.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.SendTransactionResults.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionGroupToSend.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transaction.TransactionToSign.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoRekeyParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.AlgoTransferParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.EnsureFundedReturnType.md
│       │   │   │   │   ├── algokit:utils:typescript:code:interfaces:types_transfer.TransferAssetParams.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:index.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_account.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algo_http_client_with_retry.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_interface.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_creator.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transaction_sender.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client_transfer_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_algorand_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_amount.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_arc56.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_deployer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory_and_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_factory.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_app.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_asset.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_async_event_emitter.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_client_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_composer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_config.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_debugging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client_spec.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_dispenser_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_expand.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_indexer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_kmd_account_manager.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_lifecycle_events.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logging.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_logic_error.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_network_client.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_testing.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transaction.md
│       │   │   │   │   ├── algokit:utils:typescript:code:modules:types_transfer.md
│       │   │   │   │   ├── algokit:utils:typescript:code:README.md
│       │   │   │   │   ├── algokit:utils:typescript:README.md
│       │   │   │   │   ├── algokit:utils:typescript:v7-migration.md
│       │   │   │   │   ├── algokit:utils:typescript:v8-migration.md
│       │   │   │   │   ├── ARCs:ARC-template.md
│       │   │   │   │   ├── ARCs:assets:arc-0012:README.md
│       │   │   │   │   ├── ARCs:assets:arc-0034:TemplateForm.md
│       │   │   │   │   ├── ARCs:assets:arc-0062:README.md
│       │   │   │   │   ├── ARCs:pages:nfts.md
│       │   │   │   │   ├── ARCs:pages:wallets.md
│       │   │   │   │   ├── ARCs:README.md
│       │   │   │   │   ├── ARCs:specs:arc-0000.md
│       │   │   │   │   ├── ARCs:specs:arc-0001.md
│       │   │   │   │   ├── ARCs:specs:arc-0002.md
│       │   │   │   │   ├── ARCs:specs:arc-0003.md
│       │   │   │   │   ├── ARCs:specs:arc-0004.md
│       │   │   │   │   ├── ARCs:specs:arc-0005.md
│       │   │   │   │   ├── ARCs:specs:arc-0006.md
│       │   │   │   │   ├── ARCs:specs:arc-0007.md
│       │   │   │   │   ├── ARCs:specs:arc-0008.md
│       │   │   │   │   ├── ARCs:specs:arc-0009.md
│       │   │   │   │   ├── ARCs:specs:arc-0010.md
│       │   │   │   │   ├── ARCs:specs:arc-0011.md
│       │   │   │   │   ├── ARCs:specs:arc-0012.md
│       │   │   │   │   ├── ARCs:specs:arc-0015.md
│       │   │   │   │   ├── ARCs:specs:arc-0016.md
│       │   │   │   │   ├── ARCs:specs:arc-0018.md
│       │   │   │   │   ├── ARCs:specs:arc-0019.md
│       │   │   │   │   ├── ARCs:specs:arc-0020.md
│       │   │   │   │   ├── ARCs:specs:arc-0021.md
│       │   │   │   │   ├── ARCs:specs:arc-0022.md
│       │   │   │   │   ├── ARCs:specs:arc-0023.md
│       │   │   │   │   ├── ARCs:specs:arc-0025.md
│       │   │   │   │   ├── ARCs:specs:arc-0026.md
│       │   │   │   │   ├── ARCs:specs:arc-0028.md
│       │   │   │   │   ├── ARCs:specs:arc-0032.md
│       │   │   │   │   ├── ARCs:specs:arc-0033.md
│       │   │   │   │   ├── ARCs:specs:arc-0034.md
│       │   │   │   │   ├── ARCs:specs:arc-0035.md
│       │   │   │   │   ├── ARCs:specs:arc-0036.md
│       │   │   │   │   ├── ARCs:specs:arc-0042.md
│       │   │   │   │   ├── ARCs:specs:arc-0047.md
│       │   │   │   │   ├── ARCs:specs:arc-0048.md
│       │   │   │   │   ├── ARCs:specs:arc-0049.md
│       │   │   │   │   ├── ARCs:specs:arc-0054.md
│       │   │   │   │   ├── ARCs:specs:arc-0055.md
│       │   │   │   │   ├── ARCs:specs:arc-0056.md
│       │   │   │   │   ├── ARCs:specs:arc-0059.md
│       │   │   │   │   ├── ARCs:specs:arc-0062.md
│       │   │   │   │   ├── ARCs:specs:arc-0065.md
│       │   │   │   │   ├── ARCs:specs:arc-0069.md
│       │   │   │   │   ├── ARCs:specs:arc-0072.md
│       │   │   │   │   ├── ARCs:specs:arc-0073.md
│       │   │   │   │   ├── ARCs:specs:arc-0074.md
│       │   │   │   │   ├── ARCs:specs:arc-0076.md
│       │   │   │   │   ├── ARCs:specs:arc-0078.md
│       │   │   │   │   ├── ARCs:specs:arc-0079.md
│       │   │   │   │   ├── ARCs:specs:arc-0200.md
│       │   │   │   │   ├── clis_index.md
│       │   │   │   │   ├── developer:docs:about.md
│       │   │   │   │   ├── developer:docs:clis:algokey:algokey.md
│       │   │   │   │   ├── developer:docs:clis:algokey:generate.md
│       │   │   │   │   ├── developer:docs:clis:algokey:import.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:append-auth-addr.md
│       │   │   │   │   ├── developer:docs:clis:algokey:multisig:multisig.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:info.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:part.md
│       │   │   │   │   ├── developer:docs:clis:algokey:part:reparent.md
│       │   │   │   │   ├── developer:docs:clis:algokey:sign.md
│       │   │   │   │   ├── developer:docs:clis:conduit:conduit.md
│       │   │   │   │   ├── developer:docs:clis:conduit:init.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:exporters.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:importers.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:list.md
│       │   │   │   │   ├── developer:docs:clis:conduit:list:processors.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:diagcfg.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:metric.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:metric:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:disable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:enable.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:endpoint.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:name.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:status.md
│       │   │   │   │   ├── developer:docs:clis:diagcfg:telemetry:telemetry.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:restart.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:start.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:status.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:stop.md
│       │   │   │   │   ├── developer:docs:clis:goal:node:wait.md
│       │   │   │   │   ├── developer:docs:clis:goal:protocols.md
│       │   │   │   │   ├── developer:docs:clis:goal:report.md
│       │   │   │   │   ├── developer:docs:clis:goal:version.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:list.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:new.md
│       │   │   │   │   ├── developer:docs:clis:goal:wallet:wallet.md
│       │   │   │   │   ├── developer:docs:clis:indexer:api-config.md
│       │   │   │   │   ├── developer:docs:clis:indexer:daemon.md
│       │   │   │   │   ├── developer:docs:clis:indexer:indexer.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:util.md
│       │   │   │   │   ├── developer:docs:clis:indexer:util:validator.md
│       │   │   │   │   ├── developer:docs:clis:kmd.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:debug.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:remote.md
│       │   │   │   │   ├── developer:docs:clis:tealdbg:tealdbg.md
│       │   │   │   │   ├── developer:docs:details:accounts:create.md
│       │   │   │   │   ├── developer:docs:details:accounts:index.md
│       │   │   │   │   ├── developer:docs:details:accounts:rekey.md
│       │   │   │   │   ├── developer:docs:details:algorand_consensus.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:betanet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:index.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:mainnet.md
│       │   │   │   │   ├── developer:docs:details:algorand-networks:testnet.md
│       │   │   │   │   ├── developer:docs:details:asa.md
│       │   │   │   │   ├── developer:docs:details:atc.md
│       │   │   │   │   ├── developer:docs:details:atomic_transfers.md
│       │   │   │   │   ├── developer:docs:details:conduit.md
│       │   │   │   │   ├── developer:docs:details:crust.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:jsonspec.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v1.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v10.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v2.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v3.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v4.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v5.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v6.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v7.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v8.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:opcodes:v9.md
│       │   │   │   │   ├── developer:docs:details:dapps:avm:teal:specification.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:ABI:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:create.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:innertx.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:state.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:apps:txs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:debugging.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:apps.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:frontend:smartsigs.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:guidelines.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:index.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:modes.md
│       │   │   │   │   ├── developer:docs:details:dapps:smart-contracts:smartsigs:walkthrough.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:beaker.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:pyteal.md
│       │   │   │   │   ├── developer:docs:details:dapps:writing-contracts:python.md
│       │   │   │   │   ├── developer:docs:details:encoding.md
│       │   │   │   │   ├── developer:docs:details:ethereum_to_algorand.md
│       │   │   │   │   ├── developer:docs:details:index.md
│       │   │   │   │   ├── developer:docs:details:indexer.md
│       │   │   │   │   ├── developer:docs:details:parameter_tables.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:index.md
│       │   │   │   │   ├── developer:docs:details:stateproofs:light_client.md
│       │   │   │   │   ├── developer:docs:details:technical_faq.md
│       │   │   │   │   ├── developer:docs:details:transactions:index.md
│       │   │   │   │   ├── developer:docs:details:transactions:offline_transactions.md
│       │   │   │   │   ├── developer:docs:details:transactions:payment_prompts.md
│       │   │   │   │   ├── developer:docs:details:transactions:signatures.md
│       │   │   │   │   ├── developer:docs:details:transactions:transactions.md
│       │   │   │   │   ├── developer:docs:details:useful_resources.md
│       │   │   │   │   ├── developer:docs:get-started:algokit.md
│       │   │   │   │   ├── developer:docs:get-started:basics:what_is_blockchain.md
│       │   │   │   │   ├── developer:docs:get-started:basics:whats_a_dapp.md
│       │   │   │   │   ├── developer:docs:get-started:basics:where_to_start.md
│       │   │   │   │   ├── developer:docs:get-started:basics:why_algorand.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:ft.md
│       │   │   │   │   ├── developer:docs:get-started:tokenization:nft.md
│       │   │   │   │   ├── developer:docs:index.md
│       │   │   │   │   ├── developer:docs:rest-apis:algod.md
│       │   │   │   │   ├── developer:docs:rest-apis:indexer.md
│       │   │   │   │   ├── developer:docs:rest-apis:kmd.md
│       │   │   │   │   ├── developer:docs:rest-apis:restendpoints.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:catchup.md
│       │   │   │   │   ├── developer:docs:run-a-node:operations:switch_networks.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:generate_keys.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:index.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:offline.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:online.md
│       │   │   │   │   ├── developer:docs:run-a-node:participate:renew.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:artifacts.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:config.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:relay.md
│       │   │   │   │   ├── developer:docs:run-a-node:reference:telemetry-config.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:indexer.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:install.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:node-troubleshooting.md
│       │   │   │   │   ├── developer:docs:run-a-node:setup:types.md
│       │   │   │   │   ├── developer:docs:sdks:go:index.md
│       │   │   │   │   ├── developer:docs:sdks:index.md
│       │   │   │   │   ├── developer:docs:sdks:java:index.md
│       │   │   │   │   ├── developer:docs:sdks:javascript:index.md
│       │   │   │   │   ├── developer:docs:sdks:python:index.md
│       │   │   │   │   ├── developer:python:code:example:accounts.md
│       │   │   │   │   ├── developer:python:code:example:arc4_types.md
│       │   │   │   │   ├── developer:python:code:example:assets.md
│       │   │   │   │   ├── developer:python:code:example:box_storage.md
│       │   │   │   │   ├── developer:python:code:example:control_flow.md
│       │   │   │   │   ├── developer:python:code:example:crypto:merkle_tree.md
│       │   │   │   │   ├── developer:python:code:example:defi:amm.md
│       │   │   │   │   ├── developer:python:code:example:defi:auction.md
│       │   │   │   │   ├── developer:python:code:example:defi:htlc_logicsig.md
│       │   │   │   │   ├── developer:python:code:example:defi:marketplace.md
│       │   │   │   │   ├── developer:python:code:example:events:arc28_events.md
│       │   │   │   │   ├── developer:python:code:example:global_storage.md
│       │   │   │   │   ├── developer:python:code:example:governance:simple_voting.md
│       │   │   │   │   ├── developer:python:code:example:hello_world.md
│       │   │   │   │   ├── developer:python:code:example:inner_transactions.md
│       │   │   │   │   ├── developer:python:code:example:local_storage.md
│       │   │   │   │   ├── developer:python:code:example:nft:proof_of_attendance.md
│       │   │   │   │   ├── developer:python:code:example:privacy:zk_whitelist.md
│       │   │   │   │   ├── developer:python:code:example:scratch_storage.md
│       │   │   │   │   ├── developer:python:code:example:self_payment.md
│       │   │   │   │   ├── developer:python:code:example:struct_in_box.md
│       │   │   │   │   ├── developer:python:code:example:subsidize_app_call.md
│       │   │   │   │   ├── developer:python:code:example:transactions.md
│       │   │   │   │   ├── developer:python:code:example:utility:calculator.md
│       │   │   │   │   ├── devportal-code-examples:projects:python-contract-examples:README.md
│       │   │   │   │   ├── devportal-code-examples:README.md
│       │   │   │   │   ├── docs:.walletconnect:index.md
│       │   │   │   │   ├── docs:.walletconnect:walletconnect-schema.md
│       │   │   │   │   ├── docs:README.md
│       │   │   │   │   ├── docs:scripts:example_tracker:example_list.md
│       │   │   │   │   ├── docs:scripts:README.md
│       │   │   │   │   ├── index.md
│       │   │   │   │   ├── liquid_auth_index.md
│       │   │   │   │   ├── liquid-auth:ARCHITECTURE.md
│       │   │   │   │   ├── liquid-auth:decisions:1-Service-Authentication.md
│       │   │   │   │   ├── liquid-auth:decisions:2-Bidirectional-Communication.md
│       │   │   │   │   ├── liquid-auth:decisions:3-Peer-to-Peer-Signaling.md
│       │   │   │   │   ├── liquid-auth:decisions:4-Fido-Extension.md
│       │   │   │   │   ├── liquid-auth:decisions:README.md
│       │   │   │   │   ├── liquid-auth:docs:architecture.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:authenticate.md
│       │   │   │   │   ├── liquid-auth:docs:clients:android:provider-service:register.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:authentication.md
│       │   │   │   │   ├── liquid-auth:docs:clients:browser:example.md
│       │   │   │   │   ├── liquid-auth:docs:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:README.md
│       │   │   │   │   ├── liquid-auth:docs:server:environment-variables.md
│       │   │   │   │   ├── liquid-auth:docs:server:integrations.md
│       │   │   │   │   ├── liquid-auth:docs:server:introduction.md
│       │   │   │   │   ├── liquid-auth:docs:server:running-locally.md
│       │   │   │   │   ├── liquid-auth:README.md
│       │   │   │   │   ├── liquid-auth:SEQUENCE.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md
│       │   │   │   │   ├── liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md
│       │   │   │   │   ├── liquid-auth:sites:express-dapp:README.md
│       │   │   │   │   ├── liquid-auth:VISION.md
│       │   │   │   │   ├── puya_index.md
│       │   │   │   │   ├── puya:docs:algopy_testing:index.md
│       │   │   │   │   ├── puya:docs:api-algopy.arc4.md
│       │   │   │   │   ├── puya:docs:api-algopy.gtxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.itxn.md
│       │   │   │   │   ├── puya:docs:api-algopy.md
│       │   │   │   │   ├── puya:docs:api-algopy.op.md
│       │   │   │   │   ├── puya:docs:api.md
│       │   │   │   │   ├── puya:docs:compiler.md
│       │   │   │   │   ├── puya:docs:index.md
│       │   │   │   │   ├── puya:docs:language-guide.md
│       │   │   │   │   ├── puya:docs:lg-arc28.md
│       │   │   │   │   ├── puya:docs:lg-arc4.md
│       │   │   │   │   ├── puya:docs:lg-builtins.md
│       │   │   │   │   ├── puya:docs:lg-calling-apps.md
│       │   │   │   │   ├── puya:docs:lg-compile.md
│       │   │   │   │   ├── puya:docs:lg-control.md
│       │   │   │   │   ├── puya:docs:lg-errors.md
│       │   │   │   │   ├── puya:docs:lg-logs.md
│       │   │   │   │   ├── puya:docs:lg-modules.md
│       │   │   │   │   ├── puya:docs:lg-opcode-budget.md
│       │   │   │   │   ├── puya:docs:lg-ops.md
│       │   │   │   │   ├── puya:docs:lg-storage.md
│       │   │   │   │   ├── puya:docs:lg-structure.md
│       │   │   │   │   ├── puya:docs:lg-transactions.md
│       │   │   │   │   ├── puya:docs:lg-types.md
│       │   │   │   │   ├── puya:docs:lg-unsupported-python-features.md
│       │   │   │   │   ├── puya:docs:principles.md
│       │   │   │   │   ├── puya:examples:auction:README.md
│       │   │   │   │   ├── puya:python:testing:docs:algopy.md
│       │   │   │   │   ├── puya:python:testing:docs:api.md
│       │   │   │   │   ├── puya:python:testing:docs:coverage.md
│       │   │   │   │   ├── puya:python:testing:docs:examples.md
│       │   │   │   │   ├── puya:python:testing:docs:faq.md
│       │   │   │   │   ├── puya:python:testing:docs:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:arc4-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:avm-types.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:concepts.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:contract-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:index.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:opcodes.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:signature-testing.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:state-management.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:subroutines.md
│       │   │   │   │   ├── puya:python:testing:docs:testing-guide:transactions.md
│       │   │   │   │   ├── puya:python:testing:examples:README.md
│       │   │   │   │   ├── puya:python:testing:README.md
│       │   │   │   │   ├── puya:README.md
│       │   │   │   │   ├── puya:src:puya:ARCHITECTURE.md
│       │   │   │   │   ├── puya:src:puyapy:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:_vendor:mypy:typeshed:stdlib:_typeshed:README.md
│       │   │   │   │   ├── puya:src:puyapy:awst_build:README.md
│       │   │   │   │   ├── puya:stubs:README.md
│       │   │   │   │   ├── puya:tests:test_expected_output:README.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-bytes-and-strings.md
│       │   │   │   │   ├── puya:typescript:docs:architecture-decisions:2024-05-21_primitive-integer-types.md
│       │   │   │   │   ├── puya:typescript:docs:README.md
│       │   │   │   │   ├── puya:typescript:packages:algo-ts:readme.md
│       │   │   │   │   ├── puya:typescript:README.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIAddressType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayDynamicType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIArrayStaticType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIBoolType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIByteType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIContract.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIInterface.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIMethod.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIStringType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABITupleType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUfixedType.md
│       │   │   │   │   ├── SDKs:javascript:classes:ABIUintType.md
│       │   │   │   │   ├── SDKs:javascript:classes:Algodv2.md
│       │   │   │   │   ├── SDKs:javascript:classes:AtomicTransactionComposer.md
│       │   │   │   │   ├── SDKs:javascript:classes:DryrunResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:Indexer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLocalStatesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogData.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetBalancesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetHoldingsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.AssetsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Block.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockRewards.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeState.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BlockUpgradeVote.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HashFactory.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.HealthCheck.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.IndexerStateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MerkleArrayProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.MiniAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.ParticipationUpdates.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofFields.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofParticipant.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofReveal.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofSigSlot.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofTracking.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateProofVerifier.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.StateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.Transaction.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionApplication.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetFreeze.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionAssetTransfer.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionKeyreg.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionPayment.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureLogicsig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisig.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionSignatureMultisigSubsignature.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:indexerModels.TransactionStateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:Kmd.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSig.md
│       │   │   │   │   ├── SDKs:javascript:classes:LogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Account.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountApplicationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountAssetsInformationResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountParticipation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AccountStateDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AppCallLogs.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Application.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationKVStorage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationLocalState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateOperation.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ApplicationStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Asset.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHolding.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetHoldingReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AssetParams.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.AvmValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockHashResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockLogsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BlockTxidsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Box.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxDescriptor.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxesResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.BuildVersion.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.CompileResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DisassembleResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunSource.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunState.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.DryrunTxnResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ErrorResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.EvalDeltaKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetBlockTimeStampOffsetResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.GetSyncRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.KvDelta.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LedgerStateDeltaForTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.LightBlockHeaderProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.NodeStatusResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PendingTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.PostTransactionsResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.ScratchChange.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateInitialStates.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequest.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateRequestTransactionGroup.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTraceConfig.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionGroupResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateTransactionResult.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulateUnnamedResourcesAccessed.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationEvalOverrides.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationOpcodeTraceUnit.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SimulationTransactionExecTrace.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProof.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.StateProofMessage.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.SupplyResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealKeyValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TealValue.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionGroupLedgerStateDeltasForRoundResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionParametersResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.TransactionProofResponse.md
│       │   │   │   │   ├── SDKs:javascript:classes:modelsv2.Version.md
│       │   │   │   │   ├── SDKs:javascript:classes:SourceMap.md
│       │   │   │   │   ├── SDKs:javascript:classes:Transaction.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABIReferenceType.md
│       │   │   │   │   ├── SDKs:javascript:enums:ABITransactionType.md
│       │   │   │   │   ├── SDKs:javascript:enums:AtomicTransactionComposerStatus.md
│       │   │   │   │   ├── SDKs:javascript:enums:IntDecoding.md
│       │   │   │   │   ├── SDKs:javascript:enums:OnApplicationComplete.md
│       │   │   │   │   ├── SDKs:javascript:enums:TransactionType.md
│       │   │   │   │   ├── SDKs:javascript:examples:README.md
│       │   │   │   │   ├── SDKs:javascript:FAQ.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworkInfo.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractNetworks.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIContractParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIInterfaceParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodArgParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIMethodReturnParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:ABIResult.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Account.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:Address.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:AlgodTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClient.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientError.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BaseHTTPClientResponse.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:BoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:CustomTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedAssetParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedBoxReference.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedGlobalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLocalStateSchema.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedLogicSigAccount.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedMultisig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedSubsig.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:EncodedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:IndexerTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:KMDTokenHeader.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:MultisigMetadata.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SignedTransaction.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:SuggestedParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionParams.md
│       │   │   │   │   ├── SDKs:javascript:interfaces:TransactionWithSigner.md
│       │   │   │   │   ├── SDKs:javascript:modules:indexerModels.md
│       │   │   │   │   ├── SDKs:javascript:modules:modelsv2.md
│       │   │   │   │   ├── SDKs:javascript:modules.md
│       │   │   │   │   ├── SDKs:javascript:README.md
│       │   │   │   │   ├── SDKs:python:algosdk:v2client:harness:README.md
│       │   │   │   │   ├── SDKs:python:examples:README.md
│       │   │   │   │   ├── SDKs:python:README.md
│       │   │   │   │   ├── tealscript:examples_amm_README.md
│       │   │   │   │   ├── tealscript:examples_auction_README.md
│       │   │   │   │   ├── tealscript:examples_big_box_README.md
│       │   │   │   │   ├── tealscript:examples_itxns_README.md
│       │   │   │   │   ├── tealscript:examples_lsig_with_app_README.md
│       │   │   │   │   ├── tealscript:examples_reti_README.md
│       │   │   │   │   ├── tealscript:FEATURES.md
│       │   │   │   │   ├── tealscript:guides_atomic_txn.md
│       │   │   │   │   ├── tealscript:guides_features.md
│       │   │   │   │   ├── tealscript:guides_getting_started.md
│       │   │   │   │   ├── tealscript:guides_inner_transactions.md
│       │   │   │   │   ├── tealscript:guides_lifecycle.md
│       │   │   │   │   ├── tealscript:guides_math.md
│       │   │   │   │   ├── tealscript:guides_methods.md
│       │   │   │   │   ├── tealscript:guides_multiple_contracts.md
│       │   │   │   │   ├── tealscript:guides_pyteal.md
│       │   │   │   │   ├── tealscript:guides_storage.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_arrays.md
│       │   │   │   │   ├── tealscript:guides_Supported Types_numbers.md
│       │   │   │   │   ├── TEALScript:README.md
│       │   │   │   │   ├── tealscript:tests_test_package_README.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0001-intro.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0002-init.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0003-contract.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0004-artifacts.md
│       │   │   │   │   ├── tealscript:tutorials_Hello World_0005-hello.md
│       │   │   │   │   └── tealscript:tutorials_Hello World_0006-test.md
│       │   │   │   └── taxonomy-categories
│       │   │   │       ├── algokit-utils.json
│       │   │   │       ├── algokit.json
│       │   │   │       ├── arcs.json
│       │   │   │       ├── clis.json
│       │   │   │       ├── details.json
│       │   │   │       ├── developers.json
│       │   │   │       ├── liquid-auth.json
│       │   │   │       ├── nodes.json
│       │   │   │       ├── puya.json
│       │   │   │       ├── python.json
│       │   │   │       ├── sdks.json
│       │   │   │       └── tealscript.json
│       │   │   └── wallet
│       │   │       └── index.ts
│       │   ├── tools
│       │   │   ├── accountManager.ts
│       │   │   ├── algodManager.ts
│       │   │   ├── apiManager
│       │   │   │   ├── algod
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── example
│       │   │   │   │   ├── get-balance.ts
│       │   │   │   │   └── index.ts
│       │   │   │   ├── index.ts
│       │   │   │   ├── indexer
│       │   │   │   │   ├── account.ts
│       │   │   │   │   ├── application.ts
│       │   │   │   │   ├── asset.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   └── transaction.ts
│       │   │   │   ├── nfd
│       │   │   │   │   └── index.ts
│       │   │   │   ├── tinyman
│       │   │   │   │   ├── analytics.ts
│       │   │   │   │   ├── bootstrap.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── liquidity.ts
│       │   │   │   │   ├── opt_in.ts
│       │   │   │   │   ├── pool.ts
│       │   │   │   │   ├── remove_liquidity.ts
│       │   │   │   │   └── swap.ts
│       │   │   │   ├── ultrade
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── market.ts
│       │   │   │   │   ├── system.ts
│       │   │   │   │   └── wallet.ts
│       │   │   │   └── vestige
│       │   │   │       ├── assets.ts
│       │   │   │       ├── balances.ts
│       │   │   │       ├── index.ts
│       │   │   │       ├── networks.ts
│       │   │   │       ├── notes.ts
│       │   │   │       ├── pools.ts
│       │   │   │       ├── protocols.ts
│       │   │   │       ├── swaps.ts
│       │   │   │       └── vaults.ts
│       │   │   ├── arc26Manager.ts
│       │   │   ├── index.ts
│       │   │   ├── knowledgeManager.ts
│       │   │   ├── transactionManager
│       │   │   │   ├── accountTransactions.ts
│       │   │   │   ├── appTransactions
│       │   │   │   │   ├── callTxn.ts
│       │   │   │   │   ├── clearTxn.ts
│       │   │   │   │   ├── closeOutTxn.ts
│       │   │   │   │   ├── createTxn.ts
│       │   │   │   │   ├── deleteTxn.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── optInTxn.ts
│       │   │   │   │   ├── test
│       │   │   │   │   │   ├── counter_approval.teal
│       │   │   │   │   │   ├── counter_clear.teal
│       │   │   │   │   │   ├── storage_test_approval_v2.teal
│       │   │   │   │   │   ├── storage_test_approval.teal
│       │   │   │   │   │   └── storage_test_clear.teal
│       │   │   │   │   ├── types.ts
│       │   │   │   │   └── updateTxn.ts
│       │   │   │   ├── assetTransactions.ts
│       │   │   │   ├── generalTransaction.ts
│       │   │   │   └── index.ts
│       │   │   └── utilityManager.ts
│       │   ├── types.ts
│       │   └── utils
│       │       └── responseProcessor.ts
│       ├── tests
│       │   ├── resources
│       │   │   ├── algod
│       │   │   │   ├── account.test.ts
│       │   │   │   ├── application.test.ts
│       │   │   │   ├── asset.test.ts
│       │   │   │   └── transaction.test.ts
│       │   │   └── indexer
│       │   │       ├── account.test.ts
│       │   │       ├── application.test.ts
│       │   │       ├── asset.test.ts
│       │   │       └── transaction.test.ts
│       │   └── tools
│       │       ├── accountManager.test.ts
│       │       ├── algodManager.test.ts
│       │       ├── apiManager
│       │       │   └── example
│       │       │       └── get-balance.test.ts
│       │       ├── transactionManager
│       │       │   ├── accountTransactionManager.test.ts
│       │       │   ├── appTransactionManager.test.ts
│       │       │   ├── assetTransactionManager.test.ts
│       │       │   ├── generalTransactionManager.test.ts
│       │       │   └── transactionManager.test.ts
│       │       └── utilityManager.test.ts
│       └── tsconfig.json
├── README.md
├── rename_files.sh
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/packages/client/.env.example:
--------------------------------------------------------------------------------

```
 1 | ALGORAND_NETWORK=testnet
 2 | ALGORAND_ALGOD_API=https://testnet-api.algonode.cloud/v2
 3 | ALGORAND_ALGOD=https://testnet-api.algonode.cloud
 4 | ALGORAND_INDEXER_API=https://testnet-idx.algonode.cloud/v2
 5 | ALGORAND_INDEXER=https://testnet-idx.algonode.cloud
 6 | ALGORAND_ALGOD_PORT=
 7 | ALGORAND_INDEXER_PORT=
 8 | ALGORAND_TOKEN=
 9 | GOPLAUSIBLE_ACCOUNT=
10 | ALGORAND_AGENT_WALLET=
```

--------------------------------------------------------------------------------
/packages/server/.env.example:
--------------------------------------------------------------------------------

```
 1 | # Algorand Network Configuration
 2 | ALGORAND_NETWORK=testnet
 3 | ALGORAND_ALGOD_API=https://testnet-api.algonode.cloud/v2
 4 | ALGORAND_ALGOD=https://testnet-api.algonode.cloud
 5 | ALGORAND_INDEXER_API=https://testnet-idx.algonode.cloud/v2
 6 | ALGORAND_INDEXER=https://testnet-idx.algonode.cloud
 7 | ALGORAND_ALGOD_PORT=
 8 | ALGORAND_INDEXER_PORT=
 9 | ALGORAND_TOKEN=
10 | ALGORAND_AGENT_WALLET=problem aim online jaguar upper oil flight stumble mystery aerobic toy avoid file tomato moment exclude witness guard lab opera crunch noodle dune abandon broccoli
11 | # NFDomains API Configuration
12 | NFD_API_URL=https://api.nf.domains
13 | NFD_API_KEY=
14 | 
15 | # Tinyman API Configuration
16 | TINYMAN_ACTIVE=false
17 | 
18 | # Ultrade API Configuration
19 | ULTRADE_ACTIVE=true
20 | # Vestige API Configuration
21 | VESTIGE_ACTIVE=false
22 | VESTIGE_API_URL=https://api.vestigelabs.org
23 | VESTIGE_API_KEY=
24 | 
25 | # Number of items per page for paginated responses (default: 5)
26 | ITEMS_PER_PAGE=10
27 | 
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
  1 | .env
  2 | # Logs
  3 | logs
  4 | *.log
  5 | npm-debug.log*
  6 | yarn-debug.log*
  7 | yarn-error.log*
  8 | lerna-debug.log*
  9 | .pnpm-debug.log*
 10 | test-mcp-server
 11 | # Diagnostic reports (https://nodejs.org/api/report.html)
 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
 13 | packages/client-sse/*
 14 | # Runtime data
 15 | pids
 16 | *.pid
 17 | *.seed
 18 | *.pid.lock
 19 | server-sse-agent
 20 | server-sse-agent/*
 21 | server-sse
 22 | server-sse/*
 23 | # Directory for instrumented libs generated by jscoverage/JSCover
 24 | lib-cov
 25 | 
 26 | # Coverage directory used by tools like istanbul
 27 | coverage
 28 | *.lcov
 29 | 
 30 | # nyc test coverage
 31 | .nyc_output
 32 | 
 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
 34 | .grunt
 35 | 
 36 | # Bower dependency directory (https://bower.io/)
 37 | bower_components
 38 | 
 39 | # node-waf configuration
 40 | .lock-wscript
 41 | 
 42 | # Compiled binary addons (https://nodejs.org/api/addons.html)
 43 | build/Release
 44 | 
 45 | # Dependency directories
 46 | node_modules/
 47 | jspm_packages/
 48 | 
 49 | # Snowpack dependency directory (https://snowpack.dev/)
 50 | web_modules/
 51 | 
 52 | # TypeScript cache
 53 | *.tsbuildinfo
 54 | 
 55 | # Optional npm cache directory
 56 | .npm
 57 | 
 58 | # Optional eslint cache
 59 | .eslintcache
 60 | 
 61 | # Optional stylelint cache
 62 | .stylelintcache
 63 | 
 64 | # Microbundle cache
 65 | .rpt2_cache/
 66 | .rts2_cache_cjs/
 67 | .rts2_cache_es/
 68 | .rts2_cache_umd/
 69 | 
 70 | # Optional REPL history
 71 | .node_repl_history
 72 | 
 73 | # Output of 'npm pack'
 74 | *.tgz
 75 | 
 76 | # Yarn Integrity file
 77 | .yarn-integrity
 78 | 
 79 | # dotenv environment variable files
 80 | .env
 81 | .env.development.local
 82 | .env.test.local
 83 | .env.production.local
 84 | .env.local
 85 | 
 86 | # parcel-bundler cache (https://parceljs.org/)
 87 | .cache
 88 | .parcel-cache
 89 | 
 90 | # Next.js build output
 91 | .next
 92 | out
 93 | 
 94 | # Nuxt.js build / generate output
 95 | .nuxt
 96 | dist
 97 | 
 98 | # Gatsby files
 99 | .cache/
100 | # Comment in the public line in if your project uses Gatsby and not Next.js
101 | # https://nextjs.org/blog/next-9-1#public-directory-support
102 | # public
103 | 
104 | # vuepress build output
105 | .vuepress/dist
106 | 
107 | # vuepress v2.x temp and cache directory
108 | .temp
109 | .cache
110 | 
111 | # Docusaurus cache and generated files
112 | .docusaurus
113 | 
114 | # Serverless directories
115 | .serverless/
116 | 
117 | # FuseBox cache
118 | .fusebox/
119 | 
120 | # DynamoDB Local files
121 | .dynamodb/
122 | 
123 | # TernJS port file
124 | .tern-port
125 | 
126 | # Stores VSCode versions used for testing VSCode extensions
127 | .vscode-test
128 | 
129 | # yarn v2
130 | .yarn/cache
131 | .yarn/unplugged
132 | .yarn/build-state.yml
133 | .yarn/install-state.gz
134 | .pnp.*
135 | package-lock.json
136 | sse-server
137 | memory*
138 | *rules
139 | a2*
140 | packages/server/src/resources/.DS_Store
141 | packages/server/src/resources/.DS_Store
142 | packages/server/src/resources/knowledge/.DS_Store
143 | packages/server/src/resources/.DS_Store
144 | packages/server/src/resources/.DS_Store
145 | packages/.DS_Store
146 | .DS_Store
147 | .vscode/settings.json
148 | 
```

--------------------------------------------------------------------------------
/packages/client/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Algorand MCP Client
  2 | 
  3 | ## Overview
  4 | The Algorand MCP Client provides a unified interface for wallet connectivity and transaction signing. It offers seamless integration with multiple wallet providers and secure local wallet functionality, making it easy to manage Algorand accounts and sign transactions.
  5 | 
  6 | ## Requirements
  7 | - Node.js v23.6.1 or later
  8 | - npm v10.2.4 or later
  9 | 
 10 | ## Features
 11 | - Comprehensive wallet connectivity
 12 | - Local wallet with secure storage
 13 | - Support for popular external wallets:
 14 |   - Pera Wallet
 15 |   - Defly Wallet
 16 |   - Daffi Wallet
 17 | - Secure credential management
 18 | - Transaction signing and session management
 19 | - TypeScript support with full type definitions
 20 | 
 21 | ## Installation
 22 | 
 23 | To install or update the Algorand MCP implementation, clone the repository, install the dependencies and build the project":
 24 | 
 25 | First check node version to be 23.6.1 or later:
 26 | ```bash
 27 | node -v
 28 | ```
 29 | 
 30 | Upgrade to 23.6.1 or later if needed!
 31 | 
 32 | Then check the Claude or Cursor container folders to have mcp-servers folder (if not create one):
 33 | ```bash
 34 | mkdir PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 35 | # or for Cursor 
 36 | mkdir PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 37 | ```
 38 | Then clone this repository under mcp-servers folder and install dependencies:
 39 | 
 40 | ```bash
 41 | cd PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 42 | # or for Cursor 
 43 | cd PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 44 | # Clone the repository
 45 | git clone https://github.com/GoPlausible/algorand-mcp.git
 46 | cd algorand-mcp
 47 | # Install dependencies
 48 | npm install
 49 | # Build the project
 50 | npm run build
 51 | ```
 52 | And you are done! Now you can open you MCP config and add the server as :
 53 | 
 54 | ```json
 55 | {
 56 |   "mcpServers": {
 57 |     "algorand-mcp": {
 58 |       "command": "node",
 59 |       "args": [
 60 |         "PATH_ON_YOUR_MACHINE/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
 61 |      ],
 62 |       "env": {
 63 |         "ALGORAND_NETWORK": "testnet",
 64 |         "ALGORAND_ALGOD_API": "https://testnet-api.algonode.cloud/v2",
 65 |         "ALGORAND_ALGOD": "https://testnet-api.algonode.cloud",
 66 |         "ALGORAND_INDEXER_API": "https://testnet-idx.algonode.cloud/v2",
 67 |         "ALGORAND_INDEXER": "https://testnet-idx.algonode.cloud",
 68 |         "ALGORAND_ALGOD_PORT": "",
 69 |         "ALGORAND_INDEXER_PORT": "",
 70 |         "ALGORAND_TOKEN": "",
 71 |         "ALGORAND_AGENT_WALLET": "problem aim online jaguar upper oil flight stumble mystery aerobic toy avoid file tomato moment exclude witness guard lab opera crunch noodle dune abandon broccoli",
 72 |         "NFD_API_URL": "https://api.nf.domains",
 73 |         "NFD_API_KEY": "",
 74 |         "TINYMAN_ACTIVE": "false",
 75 |         "ULTRADE_ACTIVE": "false",
 76 |         "ULTRADE_API_URL": "https://api.ultrade.io",
 77 |         "VESTIGE_ACTIVE": "false",
 78 |         "VESTIGE_API_URL": "https://api.vestigelabs.org",
 79 |         "VESTIGE_API_KEY": "",
 80 |         "ITEMS_PER_PAGE": "10"
 81 | 
 82 |       }
 83 |     }
 84 |   }
 85 | }
 86 | ```
 87 | Make sure yopu change the paths to match your local system's paths.
 88 | 
 89 | For example on MACOS and Claud, the path would be something like this:
 90 | 
 91 | ```json
 92 | {
 93 |   "mcpServers": {
 94 |     "algorand-mcp": {
 95 |       "command": "node",
 96 |       "args": [
 97 |         " /Users/YOUR_USERNAME/Library/Application\ Support/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
 98 |      ]
 99 |     }
100 |   }
101 | }
102 | ```
103 | 
104 | 
105 | ## Project Structure
106 | 
107 | ```
108 | src/
109 | ├── index.ts        # Main client implementation and wallet management
110 | ├── LocalWallet.ts  # Local wallet implementation
111 | └── env.ts         # Environment configuration
112 | ```
113 | 
114 | ## Installation
115 | 
116 | ```bash
117 | npm install @algorand-mcp/client
118 | ```
119 | 
120 | ## Features
121 | 
122 | ### Universal ES Module Support
123 | - Works in both browser and Node.js environments
124 | - No environment-specific dependencies
125 | - Dynamic imports for Node.js modules
126 | - Browser-compatible credential storage
127 | 
128 | ### Wallet Support
129 | 
130 | #### Local Wallet
131 | The Local Wallet provides a secure, environment-aware wallet implementation:
132 | 
133 | **Browser Environment:**
134 | - Uses the Web Credentials API for secure mnemonic storage
135 | - Encrypted storage of sensitive data
136 | - Persistent across sessions
137 | - No external dependencies
138 | 
139 | **Node.js Environment:**
140 | - File-based mnemonic storage
141 | - Encrypted .mnemonic files
142 | - Project directory storage
143 | - Secure file permissions
144 | 
145 | **Methods:**
146 | - `connect()`: Creates new account if none exists
147 | - `reconnectSession()`: Reconnects to existing account
148 | - `disconnect()`: Clears current session
149 | - `signTransactions()`: Signs transaction groups
150 | - `makeTransactionSigner()`: Creates algosdk-compatible signer
151 | 
152 | #### External Wallets
153 | Support for popular Algorand wallets:
154 | 
155 | 1. **Pera Wallet**
156 |    - Most widely used Algorand wallet
157 |    - Mobile and browser support
158 |    - QR code connectivity
159 | 
160 | 2. **Defly Wallet**
161 |    - Advanced features
162 |    - DeFi focused
163 |    - Built-in analytics
164 | 
165 | 3. **Daffi Wallet**
166 |    - User-friendly interface
167 |    - Beginner focused
168 |    - Simple transaction flow
169 | 
170 | **Common Methods:**
171 | - `connect()`: Initiates wallet connection
172 | - `reconnectSession()`: Restores previous session
173 | - `disconnect()`: Ends wallet session
174 | - `signTransactions()`: Signs transaction groups
175 | 
176 | ## Usage
177 | 
178 | ### Basic Setup
179 | 
180 | ```typescript
181 | import { AlgorandMcpClient } from '@algorand-mcp/client';
182 | 
183 | // Initialize client
184 | const client = new AlgorandMcpClient({
185 |   network: 'testnet'  // 'mainnet' or 'localnet'
186 | });
187 | ```
188 | 
189 | ### Local Wallet
190 | 
191 | ```typescript
192 | // Connect to local wallet (creates new if none exists)
193 | const [address] = await client.connect('local');
194 | console.log('Connected address:', address);
195 | 
196 | // Sign transactions
197 | const signedTxns = await client.signTransactions([[
198 |   { txn: someTransaction, message: 'Optional message' }
199 | ]]);
200 | 
201 | // Get algosdk-compatible signer
202 | const signer = await client.makeTransactionSigner();
203 | const signedTxn = await signer([transaction], [0]);
204 | 
205 | // Disconnect
206 | await client.disconnect();
207 | ```
208 | 
209 | ### External Wallets
210 | 
211 | ```typescript
212 | // Connect to Pera Wallet
213 | const addresses = await client.connect('pera');
214 | console.log('Connected addresses:', addresses);
215 | 
216 | // Sign transaction group
217 | const signedTxns = await client.signTransactions([
218 |   [{ txn: tx1 }, { txn: tx2 }]  // Transaction group
219 | ]);
220 | 
221 | // Disconnect
222 | await client.disconnect();
223 | ```
224 | 
225 | ### Session Management
226 | 
227 | ```typescript
228 | // Save session for later
229 | const addresses = await client.connect('pera');
230 | // ... Later, in a new session:
231 | const reconnected = await client.reconnectSession('pera');
232 | if (reconnected) {
233 |   console.log('Session restored');
234 | }
235 | ```
236 | 
237 | ## Advanced Usage
238 | 
239 | ### Multiple Wallet Support
240 | 
241 | ```typescript
242 | // Switch between wallets
243 | await client.connect('pera');
244 | // ... do something with Pera
245 | await client.disconnect();
246 | 
247 | await client.connect('local');
248 | // ... do something with local wallet
249 | await client.disconnect();
250 | ```
251 | 
252 | ### Transaction Signing with Messages
253 | 
254 | ```typescript
255 | const signedTxns = await client.signTransactions([[
256 |   {
257 |     txn: paymentTxn,
258 |     message: 'Send 1 ALGO to Bob'
259 |   },
260 |   {
261 |     txn: assetTxn,
262 |     message: 'Opt into ASA'
263 |   }
264 | ]]);
265 | ```
266 | 
267 | ### Error Handling
268 | 
269 | ```typescript
270 | try {
271 |   await client.connect('pera');
272 | } catch (error) {
273 |   if (error.code === 'user-rejected') {
274 |     console.log('User rejected connection');
275 |   } else if (error.code === 'wallet-not-found') {
276 |     console.log('Wallet not installed');
277 |   } else {
278 |     console.error('Unknown error:', error);
279 |   }
280 | }
281 | ```
282 | 
283 | ## Environment Variables
284 | 
285 | ```bash
286 | # Optional - defaults to testnet
287 | ALGORAND_NETWORK="mainnet"
288 | 
289 | # Optional - for custom node URLs
290 | ALGOD_SERVER="http://localhost:4001"
291 | ALGOD_TOKEN="your_token"
292 | ALGOD_PORT="4001"
293 | ```
294 | 
295 | ## Security Considerations
296 | 
297 | ### Local Wallet
298 | - Mnemonics are always encrypted before storage
299 | - Secure credential management
300 | - Memory is cleared after use
301 | 
302 | ### External Wallets
303 | - No sensitive data is stored by the client
304 | - All signing happens in the wallet
305 | - Session data is encrypted
306 | 
307 | ## Best Practices
308 | 
309 | 1. **Always handle disconnects:**
310 |    ```typescript
311 |    window.addEventListener('beforeunload', () => {
312 |      client.disconnect();
313 |    });
314 |    ```
315 | 
316 | 2. **Provide clear transaction messages:**
317 |    ```typescript
318 |    await client.signTransactions([[{
319 |      txn: transaction,
320 |      message: 'Clear description of what this does'
321 |    }]]);
322 |    ```
323 | 
324 | 3. **Check network before connecting:**
325 |    ```typescript
326 |    if (client.network !== 'mainnet') {
327 |      console.warn('Not connected to mainnet!');
328 |    }
329 |    ```
330 | 
331 | 4. **Implement proper error handling:**
332 |    ```typescript
333 |    try {
334 |      await client.connect('pera');
335 |    } catch (error) {
336 |      handleError(error);
337 |    }
338 |    ```
339 | 
340 | 5. **Clean up resources:**
341 |    ```typescript
342 |    async function cleanup() {
343 |      await client.disconnect();
344 |      // other cleanup
345 |    }
346 |    ```
347 | 
348 | ## Troubleshooting
349 | 
350 | Common issues and solutions:
351 | 
352 | 1. **Wallet not connecting**
353 |    - Check if wallet is installed
354 |    - Verify network matches wallet
355 |    - Clear browser cache if needed
356 | 
357 | 2. **Transaction signing fails**
358 |    - Verify account has sufficient balance
359 |    - Check transaction parameters
360 |    - Ensure wallet is still connected
361 | 
362 | 3. **Session not restoring**
363 |    - Clear stored session data
364 |    - Reconnect from scratch
365 |    - Check for wallet updates
366 | 
367 | ## License
368 | 
369 | MIT
370 | 
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Algorand MCP Implementation
  2 | <!-- [![smithery badge](https://smithery.ai/badge/@GoPlausible/algorand-mcp)](https://smithery.ai/server/@GoPlausible/algorand-mcp) -->
  3 | [![npm downloads](https://img.shields.io/npm/dm/algorand-mcp.svg)](https://www.npmjs.com/package/algorand-mcp)
  4 | [![npm version](https://badge.fury.io/js/algorand-mcp.svg)](https://badge.fury.io/js/algorand-mcp)
  5 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
  6 | 
  7 | ## Overview
  8 | 
  9 | [Model context protocol](https://modelcontextprotocol.io/) or MCP, is an open protocol that standardizes how applications provide context to LLMs. MCP provides specification standards to give LLMs tools, resources and instructions to be more useful and effective.
 10 | 
 11 | ![Screenshot 2025-03-15 at 17 47 54](https://github.com/user-attachments/assets/db561f9f-5f95-4b07-914b-a71f48bb5399)
 12 | 
 13 | [MCP Github](https://github.com/modelcontextprotocol) contains more information and different tools and specifications plus documentation of MCP.
 14 | 
 15 | This repository is a Model Context Protocol (MCP) implementation for Algorand blockchain interactions. The implementation consists of:
 16 | - (PRODUCTION) A server package for blockchain interactions (Node.js only)
 17 | - (WIP) A client package for wallet management and transaction signing (supports both browser and Node.js)
 18 | 
 19 | **📦 Packages in this repository:**
 20 | - **[Algorand MCP Server](packages/server/README.md)** - Algorand MCP server full implementation.
 21 | - **[Algorand MCP Client](packages/client/README.md)** - Algorand MCP Client for client side Wallet management and transaction signing, as well as integration by other Agent hosts.
 22 | 
 23 | **📦 NPM:**
 24 | - **[Algorand MCP Server NPM package](https://www.npmjs.com/package/algorand-mcp)** - Algorand MCP server implementation via NPM package installation.
 25 | 
 26 | <!-- **📦 Smithery:**
 27 | - **[Algorand MCP Server on Smithery](https://smithery.ai/server/@GoPlausible/algorand-mcp)** - Algorand MCP server implementation via smithery. -->
 28 | 
 29 | 
 30 | ## Features
 31 | - **Complete Algorand Documentation Integration**
 32 |   - **Full Algorand knowledge taxonomy**
 33 |   - **Comprehensive developer documentation**
 34 |   - **ARCs, SDKs, and tools documentation**
 35 |   - **Direct document access via knowledge tool**
 36 | - Complete Algorand blockchain interaction capabilities
 37 | - Extensive wallet management system
 38 | - Comprehensive transaction handling
 39 | - Rich blockchain state querying
 40 | - Built-in security features
 41 | - Support for Claude Desktop and Cursor integration
 42 | 
 43 | ## Requirements
 44 | - Node.js v23.6.1 or later
 45 | - npm v10.2.4 or later
 46 | 
 47 | ## Installation
 48 | 
 49 | To install or update the Algorand MCP implementation, clone the repository, install the dependencies and build the project":
 50 | 
 51 | First check node version to be 23.6.1 or later:
 52 | ```bash
 53 | node -v
 54 | ```
 55 | 
 56 | Upgrade to 23.6.1 or later if needed!
 57 | 
 58 | Then check the Claude or Cursor container folders to have mcp-servers folder (if not create one):
 59 | ```bash
 60 | mkdir PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 61 | # or for Cursor 
 62 | mkdir PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 63 | ```
 64 | Then clone this repository under mcp-servers folder and install dependencies:
 65 | 
 66 | ```bash
 67 | cd PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 68 | # or for Cursor 
 69 | cd PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 70 | # Clone the repository
 71 | git clone https://github.com/GoPlausible/algorand-mcp.git
 72 | cd algorand-mcp
 73 | # Install dependencies
 74 | npm install
 75 | # Build the project
 76 | npm run build
 77 | # Edit the .env file to set your configurations
 78 | ```
 79 | And you are done! Now you can open you MCP config and add the server as :
 80 | 
 81 | ```json
 82 | {
 83 |   "mcpServers": {
 84 |     "algorand-mcp": {
 85 |       "command": "node",
 86 |       "args": [
 87 |         "PATH_ON_YOUR_MACHINE/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
 88 |      ],
 89 |       "env": {
 90 |         "ALGORAND_NETWORK": "testnet",
 91 |         "ALGORAND_ALGOD_API": "https://testnet-api.algonode.cloud/v2",
 92 |         "ALGORAND_ALGOD": "https://testnet-api.algonode.cloud",
 93 |         "ALGORAND_INDEXER_API": "https://testnet-idx.algonode.cloud/v2",
 94 |         "ALGORAND_INDEXER": "https://testnet-idx.algonode.cloud",
 95 |         "ALGORAND_ALGOD_PORT": "",
 96 |         "ALGORAND_INDEXER_PORT": "",
 97 |         "ALGORAND_TOKEN": "",
 98 |         "ALGORAND_AGENT_WALLET": "problem aim online jaguar upper oil flight stumble mystery aerobic toy avoid file tomato moment exclude witness guard lab opera crunch noodle dune abandon broccoli",
 99 |         "NFD_API_URL": "https://api.nf.domains",
100 |         "NFD_API_KEY": "",
101 |         "TINYMAN_ACTIVE": "false",
102 |         "ULTRADE_ACTIVE": "false",
103 |         "VESTIGE_ACTIVE": "false",
104 |         "ULTRADE_API_URL": "https://api.ultrade.io",
105 |         "VESTIGE_API_URL": "https://api.vestigelabs.org",
106 |         "VESTIGE_API_KEY": "",
107 |         "ITEMS_PER_PAGE": "10"
108 | 
109 |       }
110 |     }
111 |   }
112 | }
113 | ```
114 | Make sure yopu change the paths to match your local system's paths.
115 | 
116 | For example on MACOS and Claud, the path would be something like this:
117 | 
118 | ```json
119 | {
120 |   "mcpServers": {
121 |     "algorand-mcp": {
122 |       "command": "node",
123 |       "args": [
124 |         " /Users/YOUR_USERNAME/Library/Application\ Support/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
125 |      ]
126 |     }
127 |   }
128 | }
129 | ```
130 | 
131 | ## Project Architecture
132 | 
133 | The project follows a modular architecture with two main packages:
134 | 
135 | 1. **Server Package (`@algorand-mcp/server`)**
136 |    - Provides MCP tools and resources
137 |    - Manages blockchain interactions
138 |    - Handles transaction creation and submission
139 |    - Offers comprehensive blockchain queries
140 | 
141 | 2. **Client Package (`@algorand-mcp/client`)**
142 |    - Handles wallet connections and transaction signing
143 |    - Supports both local and external wallets
144 |    - Universal compatibility (browser/Node.js)
145 |    - Secure credential management
146 |    - Still work in progress (Server works irrelevant to client status)
147 | 
148 | ## Project Structure
149 | 
150 | ```
151 | algorand-mcp/
152 | ├── packages/
153 | │   ├── client/                    # Client Package
154 | │   │   ├── src/
155 | │   │   │   ├── index.ts          # Client entry point and wallet management
156 | │   │   │   └── LocalWallet.ts    # Local wallet implementation
157 | │   │   ├── package.json
158 | │   │   └── tsconfig.json
159 | │   └── server/                    # Server Package
160 | │       ├── src/
161 | │       │   ├── resources/         # MCP Resources (User-invokable endpoints)
162 | │       │   │   ├── knowledge/     # Documentation and taxonomy
163 | │       │   │   │   ├── taxonomy/  # Markdown documentation
164 | │       │   │   │   └── index.ts   # Knowledge resource handler
165 | │       │   │   ├── wallet/       # Wallet management
166 | │       │   │   │   └── index.ts   # Wallet resource handler
167 | │       │   │   └── index.ts       # Resource registration
168 | │       │   ├── tools/            # MCP Tools (Agent-invokable operations)
169 | │       │   │   ├── accountManager.ts     # Account operations
170 | │       │   │   ├── algodManager.ts       # Node interactions
171 | │       │   │   ├── utilityManager.ts     # Utility functions
172 | │       │   │   ├── apiManager/       # API Tools
173 | │       │   │   │   ├── algod/           # Algod API tools
174 | │       │   │   │   ├── indexer/         # Indexer API tools
175 | │       │   │   │   ├── nfd/            # NFDomains tools
176 | │       │   │   │   ├── vestige/        # Vestige DeFi tools
177 | │       │   │   │   ├── tinyman/        # Tinyman AMM tools
178 | │       │   │   │   └── ultrade/        # Ultrade DEX tools
179 | │       │   │   └── transactionManager/   # Transaction handling
180 | │       │   ├── env.ts            # Environment configuration
181 | │       │   └── index.ts          # Server entry point
182 | │       ├── package.json
183 | │       └── tsconfig.json
184 | ├── package.json                   # Root package file
185 | └── tsconfig.json                 # Root TypeScript config
186 | ```
187 | 
188 | ## Core Functionalities
189 | 
190 | ### Server Features
191 | - Account management
192 | - Asset operations
193 | - Application interactions
194 | - Transaction creation and submission
195 | - Blockchain state queries
196 | - Comprehensive utility functions
197 | - Standardized response format
198 | - Built-in pagination support
199 | - NFDomains integration
200 | - Vestige DeFi analytics (optional, disabled by default)
201 | - Tinyman AMM integration (optional, disabled by default)
202 | - Ultrade DEX integration (optional, disabled by default)
203 | - Knowledge taxonomy resources:
204 |   - Full documentation taxonomy (algorand://knowledge/taxonomy)
205 |   - Category-specific documentation:
206 |     - ARCs (algorand://knowledge/taxonomy/arcs)
207 |     - SDKs (algorand://knowledge/taxonomy/sdks)
208 |     - AlgoKit (algorand://knowledge/taxonomy/algokit)
209 |     - AlgoKit Utils (algorand://knowledge/taxonomy/algokit-utils)
210 |     - TEALScript (algorand://knowledge/taxonomy/tealscript)
211 |     - Puya (algorand://knowledge/taxonomy/puya)
212 |     - Liquid Auth (algorand://knowledge/taxonomy/liquid-auth)
213 |     - Python (algorand://knowledge/taxonomy/python)
214 |     - Developer Docs (algorand://knowledge/taxonomy/developers)
215 |     - CLI Tools (algorand://knowledge/taxonomy/clis)
216 |     - Node Management (algorand://knowledge/taxonomy/nodes)
217 |     - Technical Details (algorand://knowledge/taxonomy/details)
218 | 
219 | ### Client Features (Work in Progress)
220 | - Local wallet with secure storage
221 | - External wallet support (Pera, Defly, Daffi)
222 | - Transaction signing
223 | - Session management
224 | - Universal ES module support
225 | 
226 | ## Response Format
227 | 
228 | All responses follow a standardized format:
229 | 
230 | ```typescript
231 | {
232 |   "data": {
233 |     // Response data here
234 |   },
235 |   "metadata": {  // Only for paginated responses
236 |     "totalItems": number,
237 |     "itemsPerPage": number,
238 |     "currentPage": number,
239 |     "totalPages": number,
240 |     "hasNextPage": boolean,
241 |     "pageToken": string,
242 |     "arrayField": string  // Name of paginated array field
243 |   }
244 | }
245 | ```
246 | 
247 | Errors are returned in a standardized format:
248 | ```typescript
249 | {
250 |   "error": {
251 |     "code": string,
252 |     "message": string
253 |   }
254 | }
255 | ```
256 | 
257 | ## Available Tools and Resources
258 | 
259 | The Algorand MCP implementation provides 125 tools and resources for blockchain interaction:
260 | - 40 base tools (account, asset, application, transaction management)
261 | - 30 API tools (algod and indexer)
262 | - 6 NFDomains (NFD) tools for name services
263 | - 28 Vestige tools for DeFi analytics
264 | - 9 Tinyman tools for AMM interactions
265 | - 12 Ultrade tools for DEX functionality
266 | 
267 | ### API Tools
268 | 
269 | #### Algod API Tools
270 | - api_algod_get_account_info: Get current account balance, assets, and auth address
271 | - api_algod_get_account_application_info: Get account-specific application information
272 | - api_algod_get_account_asset_info: Get account-specific asset information
273 | - api_algod_get_application_by_id: Get application information
274 | - api_algod_get_application_box: Get application box by name
275 | - api_algod_get_application_boxes: Get all application boxes
276 | - api_algod_get_asset_by_id: Get current asset information
277 | - api_algod_get_pending_transaction: Get pending transaction information
278 | - api_algod_get_pending_transactions_by_address: Get pending transactions for an address
279 | - api_algod_get_pending_transactions: Get all pending transactions
280 | - api_algod_get_transaction_params: Get suggested transaction parameters
281 | - api_algod_get_node_status: Get current node status
282 | - api_algod_get_node_status_after_block: Get node status after a specific round
283 | 
284 | #### Indexer API Tools
285 | - api_indexer_lookup_account_by_id: Get account information
286 | - api_indexer_lookup_account_assets: Get account assets
287 | - api_indexer_lookup_account_app_local_states: Get account application local states
288 | - api_indexer_lookup_account_created_applications: Get applications created by account
289 | - api_indexer_search_for_accounts: Search for accounts with various criteria
290 | - api_indexer_lookup_applications: Get application information
291 | - api_indexer_lookup_application_logs: Get application log messages
292 | - api_indexer_search_for_applications: Search for applications
293 | - api_indexer_lookup_asset_by_id: Get asset information and configuration
294 | - api_indexer_lookup_asset_balances: Get accounts holding this asset
295 | - api_indexer_lookup_asset_transactions: Get transactions involving this asset
296 | - api_indexer_search_for_assets: Search for assets
297 | - api_indexer_lookup_transaction_by_id: Get transaction information
298 | - api_indexer_lookup_account_transactions: Get account transaction history
299 | - api_indexer_search_for_transactions: Search for transactions
300 | 
301 | #### NFDomains (NFD) API Tools
302 | - api_nfd_get_nfd: Get NFD by name or application ID
303 | - api_nfd_get_nfds_for_addresses: Get NFDs for specific addresses
304 | - api_nfd_get_nfd_activity: Get activity/changes for NFDs
305 | - api_nfd_get_nfd_analytics: Get analytics data for NFDs
306 | - api_nfd_browse_nfds: Browse NFDs with various filters
307 | - api_nfd_search_nfds: Search NFDs with various filters
308 | 
309 | #### Vestige API Tools
310 | 
311 | 1. View Tools:
312 | - api_vestige_view_networks: Get all networks
313 | - api_vestige_view_network_by_id: Get network by id
314 | - api_vestige_view_protocols: Get all protocols
315 | - api_vestige_view_protocol_by_id: Get protocol by id
316 | - api_vestige_view_protocol_volumes: Get protocol volumes at specific day
317 | - api_vestige_view_assets: Get data about assets
318 | - api_vestige_view_assets_list: Get asset list
319 | - api_vestige_view_assets_search: Search assets by query
320 | - api_vestige_view_asset_price: Get asset prices
321 | - api_vestige_view_asset_candles: Get asset candles
322 | - api_vestige_view_asset_history: Get asset volume, swaps, total lockup, vwap and confidence history
323 | - api_vestige_view_asset_composition: Get asset lockups based on protocol and pair
324 | - api_vestige_view_pools: Get pools
325 | - api_vestige_view_vaults: Get all vaults
326 | - api_vestige_view_balances: Get balances by network id, protocol id and asset id
327 | - api_vestige_view_notes: Get notes by network id and optionally asset id
328 | - api_vestige_view_first_asset_notes: Get first note for assets
329 | - api_vestige_view_asset_notes_count: Get notes count for assets
330 | - api_vestige_view_swaps: Get swaps
331 | 
332 | 2. Swap Tools:
333 | - api_vestige_get_best_v4_swap_data: Get best V4 swap data
334 | - api_vestige_get_v4_swap_discount: Get V4 swap discount
335 | - api_vestige_get_v4_swap_data_transactions: Get V4 swap data transactions
336 | - api_vestige_get_aggregator_stats: Get aggregator stats
337 | 
338 | 3. Currency Tools:
339 | - api_vestige_view_currency_prices: Get all latest currency prices
340 | - api_vestige_view_currency_price_history: Get currency prices by timestamp range
341 | - api_vestige_view_currency_price: Get currency price by timestamp
342 | - api_vestige_view_currency_average_price: Get average price for currency
343 | - api_vestige_view_currency_prices_simple_30d: Get currency prices for last 30 days
344 | 
345 | #### Tinyman API Tools
346 | - api_tinyman_get_pool: Get Tinyman pool information by asset pair
347 | - api_tinyman_get_pool_analytics: Get analytics for a Tinyman pool
348 | - api_tinyman_get_pool_creation_quote: Get quote for creating a new pool
349 | - api_tinyman_get_liquidity_quote: Get quote for adding liquidity
350 | - api_tinyman_get_remove_liquidity_quote: Get quote for removing liquidity
351 | - api_tinyman_get_swap_quote: Get quote for swapping assets
352 | - api_tinyman_get_asset_optin_quote: Get quote for opting into pool token
353 | - api_tinyman_get_validator_optin_quote: Get quote for opting into validator
354 | - api_tinyman_get_validator_optout_quote: Get quote for opting out of validator
355 | 
356 | #### Ultrade API Tools
357 | 1. Wallet Tools:
358 | - api_ultrade_wallet_signin_message: Generate message from the sign in data
359 | - api_ultrade_wallet_signin: Sign in to trading account
360 | - api_ultrade_wallet_add_key: Add a trading key
361 | - api_ultrade_wallet_revoke_key: Revoke a trading key
362 | - api_ultrade_wallet_keys: Get trading keys
363 | - api_ultrade_wallet_key_message: Generate message from the trading key data
364 | - api_ultrade_wallet_trades: Get filtered wallet trades
365 | - api_ultrade_wallet_transactions: Get filtered wallet transactions
366 | - api_ultrade_wallet_withdraw: Withdraw token
367 | - api_ultrade_wallet_withdraw_message: Generate message from the withdrawal data
368 | 
369 | 2. Market Tools:
370 | - api_ultrade_market_symbols: Get market symbols
371 | - api_ultrade_market_details: Get market details
372 | - api_ultrade_market_price: Get last market price by pair symbol
373 | - api_ultrade_market_depth: Get order book depth
374 | - api_ultrade_market_last_trades: Get last trades
375 | - api_ultrade_market_history: Get market history
376 | - api_ultrade_market_assets: Get trading assets
377 | - api_ultrade_market_fee_rates: Get fee rates
378 | - api_ultrade_market_chains: Get blockchain chains
379 | - api_ultrade_market_withdrawal_fee: Get withdrawal fee
380 | - api_ultrade_market_operation_details: Get operation details
381 | - api_ultrade_market_settings: Get market settings
382 | - api_ultrade_market_orders: Get orders
383 | - api_ultrade_market_open_orders: Get open orders
384 | - api_ultrade_market_order_by_id: Get order by ID
385 | - api_ultrade_market_order_message: Generate message from the order data
386 | - api_ultrade_market_create_order: Create new order
387 | - api_ultrade_market_create_orders: Create new orders
388 | - api_ultrade_market_cancel_order: Cancel open order
389 | - api_ultrade_market_cancel_orders: Cancel multiple open orders
390 | 
391 | 3. System Tools:
392 | - api_ultrade_system_time: Get current system time
393 | - api_ultrade_system_maintenance: Get system maintenance status
394 | - api_ultrade_system_version: Get system version
395 | 
396 | ### Account Management Tools
397 | - create_account: Create a new Algorand account
398 | - rekey_account: Rekey an account to a new address
399 | - validate_address: Check if an Algorand address is valid
400 | - encode_address: Encode a public key to an Algorand address
401 | - decode_address: Decode an Algorand address to a public key
402 | 
403 | ### Application Tools
404 | - make_app_create_txn: Create an application creation transaction
405 | - make_app_update_txn: Create an application update transaction
406 | - make_app_delete_txn: Create an application delete transaction
407 | - make_app_optin_txn: Create an application opt-in transaction
408 | - make_app_closeout_txn: Create an application close-out transaction
409 | - make_app_clear_txn: Create an application clear state transaction
410 | - make_app_call_txn: Create an application call transaction
411 | - get_application_address: Get the address for a given application ID
412 | - compile_teal: Compile TEAL source code
413 | - disassemble_teal: Disassemble TEAL bytecode back to source
414 | 
415 | ### Asset Tools
416 | - make_asset_create_txn: Create an asset creation transaction
417 | - make_asset_config_txn: Create an asset configuration transaction
418 | - make_asset_destroy_txn: Create an asset destroy transaction
419 | - make_asset_freeze_txn: Create an asset freeze transaction
420 | - make_asset_transfer_txn: Create an asset transfer transaction
421 | 
422 | ### Transaction Tools
423 | - send_raw_transaction: Submit signed transactions to the network
424 | - simulate_raw_transactions: Simulate raw transactions
425 | - simulate_transactions: Simulate transactions with detailed configuration
426 | - make_payment_txn: Create a payment transaction
427 | - assign_group_id: Assign a group ID to a list of transactions
428 | - sign_transaction: Sign a transaction with a secret key
429 | 
430 | ### Key Management Tools
431 | - mnemonic_to_mdk: Convert a mnemonic to a master derivation key
432 | - mdk_to_mnemonic: Convert a master derivation key to a mnemonic
433 | - secret_key_to_mnemonic: Convert a secret key to a mnemonic
434 | - mnemonic_to_secret_key: Convert a mnemonic to a secret key
435 | - seed_from_mnemonic: Generate a seed from a mnemonic
436 | - mnemonic_from_seed: Generate a mnemonic from a seed
437 | - sign_bytes: Sign arbitrary bytes with a secret key
438 | 
439 | ### Utility Tools
440 | - bytes_to_bigint: Convert bytes to a BigInt
441 | - bigint_to_bytes: Convert a BigInt to bytes
442 | - encode_uint64: Encode a uint64 to bytes
443 | - decode_uint64: Decode bytes to a uint64
444 | - generate_algorand_uri: Generate an Algorand URI and QR code according to ARC-26 specification
445 | 
446 | ## Dependencies
447 | 
448 | - algosdk: Algorand JavaScript SDK
449 | - @perawallet/connect: Pera Wallet connector
450 | - @blockshake/defly-connect: Defly Wallet connector
451 | - @daffiwallet/connect: Daffi Wallet connector
452 | 
453 | ## License
454 | 
455 | MIT
456 | 
```

--------------------------------------------------------------------------------
/packages/server/README.md:
--------------------------------------------------------------------------------

```markdown
   1 | [![smithery badge](https://smithery.ai/badge/@GoPlausible/algorand-mcp)](https://smithery.ai/server/@GoPlausible/algorand-mcp)
   2 | [![npm version](https://badge.fury.io/js/algorand-mcp.svg)](https://badge.fury.io/js/algorand-mcp)
   3 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
   4 | # Algorand MCP Server
   5 | 
   6 | ## Overview
   7 | The Algorand MCP Server provides a comprehensive set of tools and resources for interacting with the Algorand blockchain through the Model Context Protocol (MCP). Running exclusively in Node.js environments, it enables seamless blockchain interactions with built-in support for account management, asset operations, application interactions, and blockchain queries.
   8 | 
   9 | ## Requirements
  10 | - Node.js v23.6.1 or later
  11 | - npm v10.2.4 or later
  12 | 
  13 | ## Features
  14 | - 125 total tools:
  15 |   - 40 base tools (account, asset, application, transaction management)
  16 |   - 30 API tools (algod and indexer)
  17 |   - 6 NFDomains (NFD) tools for name services
  18 |   - 28 Vestige tools for DeFi analytics
  19 |   - 9 Tinyman tools for AMM interactions
  20 |   - 12 Ultrade tools for DEX functionality
  21 | - 30 resource endpoints for data access
  22 | - Built-in default configuration for quick setup
  23 | - Comprehensive transaction management
  24 | - Complete application lifecycle support
  25 | - Asset creation and management
  26 | - Real-time and historical data access
  27 | - NFDomains integration for name resolution and management
  28 | - Vestige integration for DeFi analytics and tracking (optional, disabled by default)
  29 | - Tinyman AMM integration for decentralized trading (optional, disabled by default)
  30 | - Ultrade DEX integration for trading and market operations (optional, disabled by default)
  31 | 
  32 | ## Project Structure
  33 | 
  34 | ```
  35 | src/
  36 | ├── resources/                # MCP Resources (User-invokable endpoints)
  37 | │   ├── knowledge/           # Documentation and taxonomy
  38 | │   │   ├── taxonomy/        # Markdown documentation
  39 | │   │   ├── taxonomy-categories/ # Category JSON definitions
  40 | │   │   └── index.ts         # Knowledge resource handler
  41 | │   ├── wallet/             # Wallet management
  42 | │   │   └── index.ts         # Wallet resource handler
  43 | │   └── index.ts             # Resource registration
  44 | ├── tools/                  # MCP Tools (Agent-invokable operations)
  45 | │   ├── accountManager.ts    # Account operations
  46 | │   ├── algodManager.ts      # Node interactions
  47 | │   ├── utilityManager.ts    # Utility functions
  48 | │   ├── apiManager/      # API Tools (Agent-accessible resource data)
  49 | │   │   ├── algod/          # Algod API tools
  50 | │   │   ├── indexer/        # Indexer API tools
  51 | │   │   ├── nfd/            # NFDomains tools
  52 | │   │   ├── vestige/        # Vestige DeFi tools
  53 | │   │   ├── tinyman/        # Tinyman AMM tools
  54 | │   │   └── ultrade/        # Ultrade DEX tools
  55 | │   └── transactionManager/ # Transaction handling
  56 | └── index.ts               # Server entry point
  57 | ```
  58 | 
  59 | ## MCP Components
  60 | 
  61 | ### Resources
  62 | User-invokable endpoints that provide direct access to data and services:
  63 | 
  64 | 1. Knowledge Resources:
  65 |    - algorand://knowledge/taxonomy - Full documentation taxonomy
  66 |    - algorand://knowledge/taxonomy/{category} - Category-specific documentation
  67 | 
  68 | Knowledge Tool:
  69 | - get_knowledge_doc - Get markdown content for specified knowledge documents
  70 |   - Parameters: `{ documents: string[] }` (e.g., ["ARCs:specs:arc-0020.md"])
  71 |   - Returns: Document content in markdown format
  72 | 
  73 | 2. Wallet Resources:
  74 |    - algorand://wallet/account - Account information and balances
  75 |    - algorand://wallet/assets - Account Asset holdings and details
  76 | 
  77 | ### API Tools
  78 | Agent-invokable tools that provide direct access to various Algorand ecosystem APIs. These tools are designed to be used by Agent LLMs to interact with:
  79 | 
  80 | - Algorand Node (algod) API for real-time blockchain data
  81 | - Indexer API for historical blockchain data
  82 | - NFDomains API for name services
  83 | - Vestige API for DeFi analytics
  84 | - Tinyman API for AMM operations
  85 | - Ultrade API for DEX functionality
  86 | 
  87 | Each API tool follows a consistent naming convention with the `api_` prefix for clarity and better UX.
  88 | 
  89 | ## Installation
  90 | 
  91 | To install or update the Algorand MCP implementation, clone the repository, install the dependencies and build the project":
  92 | 
  93 | First check node version to be 23.6.1 or later:
  94 | ```bash
  95 | node -v
  96 | ```
  97 | 
  98 | Upgrade to 23.6.1 or later if needed!
  99 | 
 100 | Then check the Claude or Cursor container folders to have mcp-servers folder (if not create one):
 101 | ```bash
 102 | mkdir PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 103 | # or for Cursor 
 104 | mkdir PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 105 | ```
 106 | Then clone this repository under mcp-servers folder and install dependencies:
 107 | 
 108 | ```bash
 109 | cd PATH_ON_YOUR_MACHINE/Claude/mcp-servers
 110 | # or for Cursor 
 111 | cd PATH_ON_YOUR_MACHINE/Cursor/mcp-servers
 112 | # Clone the repository
 113 | git clone https://github.com/GoPlausible/algorand-mcp.git
 114 | cd algorand-mcp
 115 | # Install dependencies
 116 | npm install
 117 | # Build the project
 118 | npm run build
 119 | # Edit the .env file to set your configurations
 120 | ```
 121 | And you are done! Now you can open you MCP config and add the server as :
 122 | 
 123 | ```json
 124 | {
 125 |   "mcpServers": {
 126 |     "algorand-mcp": {
 127 |       "command": "node",
 128 |       "args": [
 129 |         "PATH_ON_YOUR_MACHINE/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
 130 |      ],
 131 |       "env": {
 132 |         "ALGORAND_NETWORK": "testnet",
 133 |         "ALGORAND_ALGOD_API": "https://testnet-api.algonode.cloud/v2",
 134 |         "ALGORAND_ALGOD": "https://testnet-api.algonode.cloud",
 135 |         "ALGORAND_INDEXER_API": "https://testnet-idx.algonode.cloud/v2",
 136 |         "ALGORAND_INDEXER": "https://testnet-idx.algonode.cloud",
 137 |         "ALGORAND_ALGOD_PORT": "",
 138 |         "ALGORAND_INDEXER_PORT": "",
 139 |         "ALGORAND_TOKEN": "",
 140 |         "ALGORAND_AGENT_WALLET": "problem aim online jaguar upper oil flight stumble mystery aerobic toy avoid file tomato moment exclude witness guard lab opera crunch noodle dune abandon broccoli",
 141 |         "NFD_API_URL": "https://api.nf.domains",
 142 |         "NFD_API_KEY": "",
 143 |         "TINYMAN_ACTIVE": "false",
 144 |         "ULTRADE_ACTIVE": "false",
 145 |         "ULTRADE_API_URL": "https://api.ultrade.io",
 146 |         "VESTIGE_ACTIVE": "false",
 147 |         "VESTIGE_API_URL": "https://api.vestigelabs.org",
 148 |         "VESTIGE_API_KEY": "",
 149 |         "ITEMS_PER_PAGE": "10"
 150 | 
 151 |       }
 152 |     }
 153 |   }
 154 | }
 155 | ```
 156 | Make sure yopu change the paths to match your local system's paths.
 157 | 
 158 | For example on MACOS and Claud, the path would be something like this:
 159 | 
 160 | ```json
 161 | {
 162 |   "mcpServers": {
 163 |     "algorand-mcp": {
 164 |       "command": "node",
 165 |       "args": [
 166 |         " /Users/YOUR_USERNAME/Library/Application\ Support/Claude/mcp-servers/algorand-mcp/packages/server/dist/index.js"
 167 |      ]
 168 |     }
 169 |   }
 170 | }
 171 | ```
 172 | 
 173 | ## Available Tools
 174 | 
 175 | ### Knowledge Resources
 176 | Static URIs for accessing Algorand's comprehensive documentation:
 177 | 
 178 | - algorand://knowledge/taxonomy - Full documentation taxonomy
 179 | - algorand://knowledge/taxonomy/arcs - ARCs documentation
 180 | - algorand://knowledge/taxonomy/sdks - SDKs documentation
 181 | - algorand://knowledge/taxonomy/algokit - AlgoKit documentation
 182 | - algorand://knowledge/taxonomy/algokit-utils - AlgoKit Utils documentation
 183 | - algorand://knowledge/taxonomy/tealscript - TEALScript documentation
 184 | - algorand://knowledge/taxonomy/puya - Puya documentation
 185 | - algorand://knowledge/taxonomy/liquid-auth - Liquid Auth documentation
 186 | - algorand://knowledge/taxonomy/python - Python development resources
 187 | - algorand://knowledge/taxonomy/developers - Developer documentation
 188 | - algorand://knowledge/taxonomy/clis - CLI tools documentation
 189 | - algorand://knowledge/taxonomy/nodes - Node management documentation
 190 | - algorand://knowledge/taxonomy/details - Technical details documentation
 191 | 
 192 | Each resource provides direct access to its respective documentation category in markdown format.
 193 | 
 194 | ### API Tools
 195 | API tools are designed to be used by Agent LLMs to perform various operations on the Algorand blockchain and to be easily invokable by LLM Agents. They are categorized into different sections based on their functionality.
 196 | 
 197 | 
 198 | #### Algod API Tools
 199 | - api_algod_get_account_info: Get current account balance, assets, and auth address from algod
 200 | - api_algod_get_account_application_info: Get account-specific application information from algod
 201 | - api_algod_get_account_asset_info: Get account-specific asset information from algod
 202 | - api_algod_get_application_by_id: Get application information
 203 | - api_algod_get_application_box: Get application box by name
 204 | - api_algod_get_application_boxes: Get all application boxes
 205 | - api_algod_get_asset_by_id: Get current asset information from algod
 206 | - api_algod_get_pending_transaction: Get pending transaction information
 207 | - api_algod_get_pending_transactions_by_address: Get pending transactions for an address
 208 | - api_algod_get_pending_transactions: Get all pending transactions
 209 | - api_algod_get_transaction_params: Get suggested transaction parameters
 210 | - api_algod_get_node_status: Get current node status
 211 | - api_algod_get_node_status_after_block: Get node status after a specific round
 212 | 
 213 | #### Indexer API Tools
 214 | - api_indexer_lookup_account_by_id: Get account information from indexer
 215 | - api_indexer_lookup_account_transactions: Get account transaction history
 216 | - api_indexer_lookup_account_assets: Get account assets
 217 | - api_indexer_lookup_account_app_local_states: Get account application local states
 218 | - api_indexer_lookup_account_created_applications: Get applications created by this account
 219 | - api_indexer_lookup_applications: Get application information from indexer
 220 | - api_indexer_lookup_application_logs: Get application log messages
 221 | - api_indexer_lookup_application_box: Get application box by name
 222 | - api_indexer_lookup_application_boxes: Get all application boxes
 223 | - api_indexer_lookup_asset_by_id: Get asset information and configuration
 224 | - api_indexer_lookup_asset_balances: Get accounts holding this asset and their balances
 225 | - api_indexer_lookup_asset_transactions: Get transactions involving this asset
 226 | - api_indexer_lookup_transaction_by_id: Get transaction information by ID
 227 | - api_indexer_search_accounts: Search for accounts with various criteria
 228 | - api_indexer_search_for_applications: Search for applications with various criteria
 229 | - api_indexer_search_for_assets: Search for assets with various criteria
 230 | - api_indexer_search_for_transactions: Search for transactions with various criteria
 231 | 
 232 | #### NFDomains (NFD) API Tools
 233 | - api_nfd_get_nfd: Get a specific NFD by name or application ID
 234 | - api_nfd_get_nfds_for_addresses: Get NFDs for specific addresses
 235 | - api_nfd_get_nfd_activity: Get activity/changes for NFDs
 236 | - api_nfd_get_nfd_analytics: Get analytics data for NFDs
 237 | - api_nfd_browse_nfds: Browse NFDs with various filters
 238 | - api_nfd_search_nfds: Search NFDs with various filters
 239 | 
 240 | #### Vestige API Tools
 241 | 
 242 | 1. View Tools:
 243 | - api_vestige_view_networks: Get all networks
 244 | - api_vestige_view_network_by_id: Get network by id
 245 | - api_vestige_view_protocols: Get all protocols
 246 | - api_vestige_view_protocol_by_id: Get protocol by id
 247 | - api_vestige_view_protocol_volumes: Get protocol volumes at specific day
 248 | - api_vestige_view_assets: Get data about assets
 249 | - api_vestige_view_assets_list: Get asset list
 250 | - api_vestige_view_assets_search: Search assets by query
 251 | - api_vestige_view_asset_price: Get asset prices
 252 | - api_vestige_view_asset_candles: Get asset candles
 253 | - api_vestige_view_asset_history: Get asset volume, swaps, total lockup, vwap and confidence history
 254 | - api_vestige_view_asset_composition: Get asset lockups based on protocol and pair
 255 | - api_vestige_view_pools: Get pools
 256 | - api_vestige_view_vaults: Get all vaults
 257 | - api_vestige_view_balances: Get balances by network id, protocol id and asset id
 258 | - api_vestige_view_notes: Get notes by network id and optionally asset id
 259 | - api_vestige_view_first_asset_notes: Get first note for assets
 260 | - api_vestige_view_asset_notes_count: Get notes count for assets
 261 | - api_vestige_view_swaps: Get swaps
 262 | 
 263 | 2. Swap Tools:
 264 | - api_vestige_get_best_v4_swap_data: Get best V4 swap data
 265 | - api_vestige_get_v4_swap_discount: Get V4 swap discount
 266 | - api_vestige_get_v4_swap_data_transactions: Get V4 swap data transactions
 267 | - api_vestige_get_aggregator_stats: Get aggregator stats
 268 | 
 269 | 3. Currency Tools:
 270 | - api_vestige_view_currency_prices: Get all latest currency prices
 271 | - api_vestige_view_currency_price_history: Get currency prices by timestamp range
 272 | - api_vestige_view_currency_price: Get currency price by timestamp
 273 | - api_vestige_view_currency_average_price: Get average price for currency
 274 | - api_vestige_view_currency_prices_simple_30d: Get currency prices for last 30 days
 275 | 
 276 | #### Tinyman API Tools
 277 | - api_tinyman_get_pool: Get Tinyman pool information by asset pair
 278 |   - Parameters: asset1Id, asset2Id, version (v1_1 or v2)
 279 |   - Returns: Pool status, validator app ID, assets, and reserves
 280 | 
 281 | - api_tinyman_get_pool_analytics: Get analytics for a Tinyman pool
 282 |   - Parameters: asset1Id, asset2Id, version
 283 |   - Returns: Pool status, emptiness check, pair ratio, and reserves
 284 | 
 285 | - api_tinyman_get_pool_creation_quote: Get quote for creating a new pool
 286 |   - Parameters: asset1Id, asset2Id, initiatorAddr, version
 287 |   - Returns: Transaction count and estimated fees
 288 | 
 289 | - api_tinyman_get_liquidity_quote: Get quote for adding liquidity
 290 |   - Parameters: asset1Id, asset2Id, asset1Amount, asset2Amount, mode (initial/flexible/singleAsset), version
 291 |   - Returns: Liquidity quote with expected pool tokens
 292 | 
 293 | - api_tinyman_get_remove_liquidity_quote: Get quote for removing liquidity
 294 |   - Parameters: asset1Id, asset2Id, poolTokenAmount, initiatorAddr, slippage, singleAssetMode, version
 295 |   - Returns: Remove liquidity quote with expected asset amounts
 296 | 
 297 | - api_tinyman_get_swap_quote: Get quote for swapping assets
 298 |   - Parameters: assetIn, assetOut, amount, mode (fixedInput/fixedOutput), version
 299 |   - Returns: Swap quote with expected output/input amount
 300 | 
 301 | - api_tinyman_get_asset_optin_quote: Get quote for opting into pool token
 302 |   - Parameters: assetId, initiatorAddr
 303 |   - Returns: Transaction count and estimated fees
 304 | 
 305 | - api_tinyman_get_validator_optin_quote: Get quote for opting into validator
 306 |   - Parameters: initiatorAddr, version
 307 |   - Returns: Transaction count and estimated fees
 308 | 
 309 | - api_tinyman_get_validator_optout_quote: Get quote for opting out of validator
 310 |   - Parameters: initiatorAddr, version
 311 |   - Returns: Transaction count and estimated fees
 312 | 
 313 | #### Ultrade API Tools
 314 | 
 315 | 1. Wallet Tools:
 316 | - api_ultrade_wallet_signin_message: Generate message from the sign in data
 317 |   - Parameters: data (address, technology), customMessage (optional)
 318 |   - Returns: Message to be signed
 319 | 
 320 | - api_ultrade_wallet_signin: Sign in to trading account
 321 |   - Parameters: message, signature, data (address, technology), referralToken (optional)
 322 |   - Returns: Session token
 323 | 
 324 | - api_ultrade_wallet_add_key: Add a trading key
 325 |   - Parameters: message, signature, walletAddress, walletToken
 326 |   - Returns: Trading key details
 327 | 
 328 | - api_ultrade_wallet_revoke_key: Revoke a trading key
 329 |   - Parameters: message, signature, walletAddress, walletToken
 330 |   - Returns: Operation status
 331 | 
 332 | - api_ultrade_wallet_keys: Get trading keys
 333 |   - Parameters: walletAddress, walletToken
 334 |   - Returns: List of trading keys
 335 | 
 336 | - api_ultrade_wallet_key_message: Generate message from the trading key data
 337 |   - Parameters: tkAddress, loginAddress, loginChainId, expiredDate (optional), addKey, type
 338 |   - Returns: Message to be signed
 339 | 
 340 | - api_ultrade_wallet_trades: Get filtered wallet trades
 341 |   - Parameters: walletAddress, walletToken (optional), tradingKey (optional)
 342 |   - Returns: List of trades
 343 | 
 344 | - api_ultrade_wallet_transactions: Get filtered wallet transactions
 345 |   - Parameters: walletAddress, walletToken (optional), tradingKey (optional)
 346 |   - Returns: List of transactions
 347 | 
 348 | - api_ultrade_wallet_withdraw: Withdraw token
 349 |   - Parameters: message, signature, walletAddress, walletToken
 350 |   - Returns: Withdrawal status
 351 | 
 352 | - api_ultrade_wallet_withdraw_message: Generate message from the withdrawal data
 353 |   - Parameters: data (withdrawal details), customMessage (optional)
 354 |   - Returns: Message to be signed
 355 | 
 356 | 2. Market Tools:
 357 | - api_ultrade_market_symbols: Get market symbols
 358 |   - Returns: List of available trading pairs
 359 | 
 360 | - api_ultrade_market_details: Get market details
 361 |   - Parameters: symbol
 362 |   - Returns: Detailed market information
 363 | 
 364 | - api_ultrade_market_price: Get last market price by pair symbol
 365 |   - Parameters: symbol
 366 |   - Returns: Current market price
 367 | 
 368 | - api_ultrade_market_depth: Get order book depth
 369 |   - Parameters: symbol, depth
 370 |   - Returns: Order book with bids and asks
 371 | 
 372 | - api_ultrade_market_last_trades: Get last trades
 373 |   - Parameters: symbol, limit (optional)
 374 |   - Returns: Recent trade history
 375 | 
 376 | - api_ultrade_market_history: Get market history
 377 |   - Parameters: symbol, interval, startTime, endTime, limit (optional)
 378 |   - Returns: Historical market data
 379 | 
 380 | - api_ultrade_market_assets: Get trading assets
 381 |   - Returns: List of supported assets
 382 | 
 383 | - api_ultrade_market_fee_rates: Get fee rates
 384 |   - Returns: Current trading fee rates
 385 | 
 386 | - api_ultrade_market_chains: Get blockchain chains
 387 |   - Returns: Supported blockchain networks
 388 | 
 389 | - api_ultrade_market_withdrawal_fee: Get withdrawal fee
 390 |   - Parameters: tokenIndex, tokenChainId, recipientChainId
 391 |   - Returns: Withdrawal fee information
 392 | 
 393 | - api_ultrade_market_operation_details: Get operation details
 394 |   - Parameters: operationId
 395 |   - Returns: Operation status and details
 396 | 
 397 | - api_ultrade_market_settings: Get market settings
 398 |   - Parameters: domain
 399 |   - Returns: Market configuration
 400 | 
 401 | - api_ultrade_market_orders: Get orders
 402 |   - Parameters: walletAddress, walletToken, tradingKey (optional), companyId (optional)
 403 |   - Returns: List of orders
 404 | 
 405 | - api_ultrade_market_open_orders: Get open orders
 406 |   - Parameters: walletAddress, walletToken, tradingKey (optional), symbol (optional)
 407 |   - Returns: List of active orders
 408 | 
 409 | - api_ultrade_market_order_by_id: Get order by ID
 410 |   - Parameters: orderId, walletAddress, walletToken, tradingKey (optional)
 411 |   - Returns: Order details
 412 | 
 413 | - api_ultrade_market_order_message: Generate message from the order data
 414 |   - Parameters: data (order details)
 415 |   - Returns: Message to be signed
 416 | 
 417 | - api_ultrade_market_create_order: Create new order
 418 |   - Parameters: message, signature, walletAddress, walletToken
 419 |   - Returns: Order creation status
 420 | 
 421 | - api_ultrade_market_create_orders: Create new orders
 422 |   - Parameters: orders (array of message/signature pairs), walletAddress, walletToken
 423 |   - Returns: Batch order creation status
 424 | 
 425 | - api_ultrade_market_cancel_order: Cancel open order
 426 |   - Parameters: orderId, walletAddress, walletToken
 427 |   - Returns: Order cancellation status
 428 | 
 429 | - api_ultrade_market_cancel_orders: Cancel multiple open orders
 430 |   - Parameters: orderIds, walletAddress, walletToken
 431 |   - Returns: Batch cancellation status
 432 | 
 433 | 3. System Tools:
 434 | - api_ultrade_system_time: Get current system time
 435 |   - Returns: Server timestamp
 436 | 
 437 | - api_ultrade_system_maintenance: Get system maintenance status
 438 |   - Returns: Maintenance mode information
 439 | 
 440 | - api_ultrade_system_version: Get system version
 441 |   - Returns: Current API version
 442 | 
 443 | ### Account Management Tools
 444 | 
 445 | 1. `create_account`
 446 |    - Creates a new Algorand account
 447 |    - Returns address and mnemonic
 448 |    - No parameters required
 449 | 
 450 | 2. `rekey_account`
 451 |    - Rekeys an account to a new address
 452 |    - Parameters:
 453 |      ```typescript
 454 |      {
 455 |        sourceAddress: string,  // Account to rekey
 456 |        targetAddress: string   // New authorized address
 457 |      }
 458 |      ```
 459 | 
 460 | 3. `mnemonic_to_mdk`
 461 |    - Converts mnemonic to master derivation key
 462 |    - Parameters: `{ mnemonic: string }`
 463 | 
 464 | 4. `mdk_to_mnemonic`
 465 |    - Converts master derivation key to mnemonic
 466 |    - Parameters: `{ mdk: string }`
 467 | 
 468 | 5. `secret_key_to_mnemonic`
 469 |    - Converts secret key to mnemonic
 470 |    - Parameters: `{ secretKey: string }`
 471 | 
 472 | 6. `mnemonic_to_secret_key`
 473 |    - Converts mnemonic to secret key
 474 |    - Parameters: `{ mnemonic: string }`
 475 | 
 476 | 7. `seed_from_mnemonic`
 477 |    - Generates seed from mnemonic
 478 |    - Parameters: `{ mnemonic: string }`
 479 | 
 480 | 8. `mnemonic_from_seed`
 481 |    - Generates mnemonic from seed
 482 |    - Parameters: `{ seed: string }`
 483 | 
 484 | 9. `validate_address`
 485 |    - Validates Algorand address format
 486 |    - Parameters: `{ address: string }`
 487 | 
 488 | 10. `encode_address`
 489 |     - Encodes public key to address
 490 |     - Parameters: `{ publicKey: string }`
 491 | 
 492 | 11. `decode_address`
 493 |     - Decodes address to public key
 494 |     - Parameters: `{ address: string }`
 495 | 
 496 | ### Application Tools
 497 | 
 498 | 12. `make_app_create_txn`
 499 |     - Creates application creation transaction
 500 |     - Parameters:
 501 |       ```typescript
 502 |       {
 503 |         from: string,
 504 |         approvalProgram: string,
 505 |         clearProgram: string,
 506 |         numGlobalByteSlices: number,
 507 |         numGlobalInts: number,
 508 |         numLocalByteSlices: number,
 509 |         numLocalInts: number,
 510 |         extraPages?: number,
 511 |         note?: string,
 512 |         lease?: string,
 513 |         rekeyTo?: string,
 514 |         appArgs?: string[],
 515 |         accounts?: string[],
 516 |         foreignApps?: number[],
 517 |         foreignAssets?: number[]
 518 |       }
 519 |       ```
 520 | 
 521 | 13. `make_app_update_txn`
 522 |     - Creates application update transaction
 523 |     - Parameters: Similar to create with appIndex
 524 | 
 525 | 14. `make_app_delete_txn`
 526 |     - Creates application deletion transaction
 527 |     - Parameters: `{ from: string, appIndex: number }`
 528 | 
 529 | 15. `make_app_optin_txn`
 530 |     - Creates application opt-in transaction
 531 |     - Parameters: `{ from: string, appIndex: number }`
 532 | 
 533 | 16. `make_app_closeout_txn`
 534 |     - Creates application close-out transaction
 535 |     - Parameters: `{ from: string, appIndex: number }`
 536 | 
 537 | 17. `make_app_clear_txn`
 538 |     - Creates application clear state transaction
 539 |     - Parameters: `{ from: string, appIndex: number }`
 540 | 
 541 | 18. `make_app_call_txn`
 542 |     - Creates application call transaction
 543 |     - Parameters:
 544 |       ```typescript
 545 |       {
 546 |         from: string,
 547 |         appIndex: number,
 548 |         appArgs?: string[],
 549 |         accounts?: string[],
 550 |         foreignApps?: number[],
 551 |         foreignAssets?: number[]
 552 |       }
 553 |       ```
 554 | 
 555 | 19. `get_application_address`
 556 |     - Gets application's escrow address
 557 |     - Parameters: `{ appId: number }`
 558 | 
 559 | ### Asset Tools
 560 | 
 561 | 20. `make_asset_create_txn`
 562 |     - Creates asset creation transaction
 563 |     - Parameters:
 564 |       ```typescript
 565 |       {
 566 |         from: string,
 567 |         total: number,
 568 |         decimals: number,
 569 |         defaultFrozen: boolean,
 570 |         unitName?: string,
 571 |         assetName?: string,
 572 |         assetURL?: string,
 573 |         assetMetadataHash?: string,
 574 |         manager?: string,
 575 |         reserve?: string,
 576 |         freeze?: string,
 577 |         clawback?: string
 578 |       }
 579 |       ```
 580 | 
 581 | 21. `make_asset_config_txn`
 582 |     - Creates asset configuration transaction
 583 |     - Parameters:
 584 |       ```typescript
 585 |       {
 586 |         from: string,
 587 |         assetIndex: number,
 588 |         manager?: string,
 589 |         reserve?: string,
 590 |         freeze?: string,
 591 |         clawback?: string,
 592 |         strictEmptyAddressChecking: boolean
 593 |       }
 594 |       ```
 595 | 
 596 | 22. `make_asset_destroy_txn`
 597 |     - Creates asset destruction transaction
 598 |     - Parameters: `{ from: string, assetIndex: number }`
 599 | 
 600 | 23. `make_asset_freeze_txn`
 601 |     - Creates asset freeze transaction
 602 |     - Parameters:
 603 |       ```typescript
 604 |       {
 605 |         from: string,
 606 |         assetIndex: number,
 607 |         freezeTarget: string,
 608 |         freezeState: boolean
 609 |       }
 610 |       ```
 611 | 
 612 | 24. `make_asset_transfer_txn`
 613 |     - Creates asset transfer transaction
 614 |     - Parameters:
 615 |       ```typescript
 616 |       {
 617 |         from: string,
 618 |         to: string,
 619 |         assetIndex: number,
 620 |         amount: number,
 621 |         closeRemainderTo?: string
 622 |       }
 623 |       ```
 624 | 
 625 | ### Transaction Tools
 626 | 
 627 | 25. `make_payment_txn`
 628 |     - Creates payment transaction
 629 |     - Parameters:
 630 |       ```typescript
 631 |       {
 632 |         from: string,
 633 |         to: string,
 634 |         amount: number,
 635 |         closeRemainderTo?: string
 636 |       }
 637 |       ```
 638 | 
 639 | 26. `assign_group_id`
 640 |     - Assigns group ID to transactions
 641 |     - Parameters: `{ transactions: Transaction[] }`
 642 | 
 643 | 27. `sign_transaction`
 644 |     - Signs transaction with secret key
 645 |     - Parameters:
 646 |       ```typescript
 647 |       {
 648 |         transaction: Transaction,
 649 |         sk: string
 650 |       }
 651 |       ```
 652 | 
 653 | 28. `sign_bytes`
 654 |     - Signs arbitrary bytes
 655 |     - Parameters: `{ bytes: string, sk: string }`
 656 | 
 657 | 29. `send_raw_transaction`
 658 |     - Broadcasts signed transactions
 659 |     - Parameters: `{ signedTxns: string[] }`
 660 | 
 661 | 30. `simulate_raw_transactions`
 662 |     - Simulates raw transactions
 663 |     - Parameters: `{ txns: string[] }`
 664 | 
 665 | ### Key Management Tools
 666 | 
 667 | 31. `generate_key_pair`
 668 |     - Generates new public/private key pair
 669 |     - Parameters: None
 670 |     - Returns: `{ publicKey: string, privateKey: string }`
 671 | 
 672 | 32. `derive_key`
 673 |     - Derives a key from a master key
 674 |     - Parameters: `{ masterKey: string, index: number }`
 675 | 
 676 | ### Utility Tools
 677 | 
 678 | 33. `encode_obj`
 679 |     - Encodes object to msgpack
 680 |     - Parameters: `{ obj: any }`
 681 | 
 682 | 34. `decode_obj`
 683 |     - Decodes msgpack to object
 684 |     - Parameters: `{ bytes: string }`
 685 | 
 686 | 35. `bytes_to_bigint`
 687 |     - Converts bytes to BigInt
 688 |     - Parameters: `{ bytes: string }`
 689 | 
 690 | 36. `bigint_to_bytes`
 691 |     - Converts BigInt to bytes
 692 |     - Parameters: `{ value: string, size: number }`
 693 | 
 694 | 37. `encode_uint64`
 695 |     - Encodes uint64 to bytes
 696 |     - Parameters: `{ value: string }`
 697 | 
 698 | 38. `decode_uint64`
 699 |     - Decodes bytes to uint64
 700 |     - Parameters: `{ bytes: string }`
 701 | 
 702 | 39. `compile_teal`
 703 |     - Compiles TEAL source code
 704 |     - Parameters: `{ source: string }`
 705 | 
 706 | 40. `disassemble_teal`
 707 |     - Disassembles TEAL bytecode
 708 |     - Parameters: `{ bytecode: string }`
 709 | 
 710 | ## Available Resources
 711 | 
 712 | ### Algod Resources (Real-time State)
 713 | 
 714 | 1. `algorand://algod/accounts/{address}`
 715 |    - Gets current account information
 716 |    - Returns: Balance, assets, auth address
 717 | 
 718 | 2. `algorand://algod/accounts/{address}/application/{app-id}`
 719 |    - Gets account's application state
 720 |    - Returns: Local state for specific app
 721 | 
 722 | 3. `algorand://algod/accounts/{address}/asset/{asset-id}`
 723 |    - Gets account's asset holding
 724 |    - Returns: Asset balance and frozen state
 725 | 
 726 | 4. `algorand://algod/applications/{app-id}`
 727 |    - Gets application information
 728 |    - Returns: Global state, creator, approval/clear programs
 729 | 
 730 | 5. `algorand://algod/applications/{app-id}/box/{name}`
 731 |    - Gets application box contents
 732 |    - Returns: Box value
 733 | 
 734 | 6. `algorand://algod/applications/{app-id}/boxes`
 735 |    - Lists all application boxes
 736 |    - Returns: Box names and sizes
 737 | 
 738 | 7. `algorand://algod/assets/{asset-id}`
 739 |    - Gets asset information
 740 |    - Returns: Asset parameters and current state
 741 | 
 742 | 8. `algorand://algod/transactions/pending/{txid}`
 743 |    - Gets pending transaction
 744 |    - Returns: Transaction details
 745 | 
 746 | 9. `algorand://algod/accounts/{address}/transactions/pending`
 747 |    - Lists pending transactions for account
 748 |    - Returns: Array of transactions
 749 | 
 750 | 10. `algorand://algod/transactions/pending`
 751 |     - Lists all pending transactions
 752 |     - Returns: Array of transactions
 753 | 
 754 | 11. `algorand://algod/transactions/params`
 755 |     - Gets suggested parameters
 756 |     - Returns: Current network parameters
 757 | 
 758 | 12. `algorand://algod/status`
 759 |     - Gets node status
 760 |     - Returns: Current round, versions
 761 | 
 762 | ### Block Resources
 763 | 
 764 | 1. `algorand://algod/blocks/latest`
 765 |    - Gets latest block information
 766 |    - Returns: Latest block header and transactions
 767 | 
 768 | 2. `algorand://algod/blocks/{round}`
 769 |    - Gets specific block information
 770 |    - Returns: Block header and transactions
 771 | 
 772 | 3. `algorand://algod/blocks/{round}/transactions`
 773 |    - Gets transactions in specific block
 774 |    - Returns: Array of transactions
 775 | 
 776 | 4. `algorand://indexer/blocks/{round}`
 777 |    - Gets historical block information
 778 |    - Returns: Block details with transactions
 779 | 
 780 | ### Health Resources
 781 | 
 782 | 5. `algorand://algod/health`
 783 |    - Gets node health status
 784 |    - Returns: Node health information
 785 | 
 786 | 6. `algorand://indexer/health`
 787 |    - Gets indexer health status
 788 |    - Returns: Indexer health information
 789 | 
 790 | ### Genesis Resources
 791 | 
 792 | 7. `algorand://algod/genesis`
 793 |    - Gets genesis information
 794 |    - Returns: Network genesis configuration
 795 | 
 796 | 8. `algorand://indexer/genesis`
 797 |    - Gets historical genesis information
 798 |    - Returns: Network genesis details
 799 | 
 800 | ### Network Resources
 801 | 
 802 | 9. `algorand://algod/versions`
 803 |    - Gets supported protocol versions
 804 |    - Returns: Supported versions information
 805 | 
 806 | 10. `algorand://algod/metrics`
 807 |     - Gets node metrics
 808 |     - Returns: Performance metrics
 809 | 
 810 | ### Supply Resources
 811 | 
 812 | 11. `algorand://algod/ledger/supply`
 813 |     - Gets current supply information
 814 |     - Returns: Total and online stake
 815 | 
 816 | 12. `algorand://indexer/supply`
 817 |     - Gets historical supply information
 818 |     - Returns: Historical supply data
 819 | 
 820 | ### Participation Resources
 821 | 
 822 | 13. `algorand://algod/participation`
 823 |     - Gets participation key information
 824 |     - Returns: Key registration info
 825 | 
 826 | 14. `algorand://algod/participation/keys`
 827 |     - Lists participation keys
 828 |     - Returns: Array of keys
 829 | 
 830 | 15. `algorand://algod/participation/keys/{id}`
 831 |     - Gets specific participation key
 832 |     - Returns: Key details
 833 | 
 834 | ### Fee Resources
 835 | 
 836 | 16. `algorand://algod/transactions/fee`
 837 |     - Gets suggested fee
 838 |     - Returns: Current fee information
 839 | 
 840 | 17. `algorand://indexer/fee-distribution`
 841 |     - Gets historical fee distribution
 842 |     - Returns: Fee statistics
 843 | 
 844 | ### Protocol Resources
 845 | 
 846 | 18. `algorand://algod/protocol`
 847 |     - Gets current protocol parameters
 848 |     - Returns: Protocol configuration
 849 | 
 850 | 19. `algorand://indexer/protocol-upgrades`
 851 |     - Gets protocol upgrade history
 852 |     - Returns: Upgrade information
 853 | 
 854 | ### Node Resources
 855 | 
 856 | 20. `algorand://algod/ready`
 857 |     - Checks if node is ready
 858 |     - Returns: Readiness status
 859 | 
 860 | 21. `algorand://algod/sync`
 861 |     - Gets node sync status
 862 |     - Returns: Sync information
 863 | 
 864 | 22. `algorand://algod/peers`
 865 |     - Lists connected peers
 866 |     - Returns: Peer information
 867 | 
 868 | 23. `algorand://algod/catchup`
 869 |     - Gets catchup information
 870 |     - Returns: Catchup status
 871 | 
 872 | ### Compile Resources
 873 | 
 874 | 24. `algorand://algod/compile/teal`
 875 |     - Compiles TEAL program
 876 |     - Returns: Compilation result
 877 | 
 878 | 25. `algorand://algod/compile/teal/disassemble`
 879 |     - Disassembles TEAL bytecode
 880 |     - Returns: Source code
 881 | 
 882 | 26. `algorand://algod/compile/teal/dryrun`
 883 |     - Dry runs TEAL program
 884 |     - Returns: Execution result
 885 | 
 886 | ### Debug Resources
 887 | 
 888 | 27. `algorand://algod/debug/accounts/{address}`
 889 |     - Gets detailed account debug info
 890 |     - Returns: Internal state
 891 | 
 892 | 28. `algorand://algod/debug/txns/{txid}`
 893 |     - Gets transaction debug info
 894 |     - Returns: Execution details
 895 | 
 896 | 29. `algorand://algod/debug/blocks/{round}`
 897 |     - Gets block debug info
 898 |     - Returns: Internal state
 899 | 
 900 | 30. `algorand://algod/debug/ledger`
 901 |     - Gets ledger debug info
 902 |     - Returns: Database state
 903 | 
 904 | ### Indexer Resources (Historical Data)
 905 | 
 906 | 31. `algorand://indexer/accounts/{address}`
 907 |     - Gets account history
 908 |     - Returns: Historical account state
 909 | 
 910 | 32. `algorand://indexer/accounts/{address}/transactions`
 911 |     - Gets account transactions
 912 |     - Returns: Transaction history
 913 | 
 914 | 33. `algorand://indexer/accounts/{address}/apps-local-state`
 915 |     - Gets account's application states
 916 |     - Returns: All local states
 917 | 
 918 | 34. `algorand://indexer/accounts/{address}/created-applications`
 919 |     - Gets created applications
 920 |     - Returns: Applications created by account
 921 | 
 922 | 35. `algorand://indexer/applications/{app-id}`
 923 |     - Gets application history
 924 |     - Returns: Historical application state
 925 | 
 926 | 36. `algorand://indexer/applications/{app-id}/logs`
 927 |     - Gets application logs
 928 |     - Returns: Historical log messages
 929 | 
 930 | 37. `algorand://indexer/applications/{app-id}/box/{name}`
 931 |     - Gets historical box state
 932 |     - Returns: Box value at specific round
 933 | 
 934 | 38. `algorand://indexer/applications/{app-id}/boxes`
 935 |     - Lists historical boxes
 936 |     - Returns: Box names at specific round
 937 | 
 938 | 39. `algorand://indexer/applications`
 939 |     - Searches applications
 940 |     - Returns: Matching applications
 941 | 
 942 | 40. `algorand://indexer/assets/{asset-id}`
 943 |     - Gets asset history
 944 |     - Returns: Historical asset state
 945 | 
 946 | 41. `algorand://indexer/assets/{asset-id}/balances`
 947 |     - Gets asset holders
 948 |     - Returns: Accounts holding asset
 949 | 
 950 | 42. `algorand://indexer/assets/{asset-id}/transactions`
 951 |     - Gets asset transactions
 952 |     - Returns: Transactions involving asset
 953 | 
 954 | 43. `algorand://indexer/assets/{asset-id}/balances/{address}`
 955 |     - Gets historical asset balance
 956 |     - Returns: Account's asset balance
 957 | 
 958 | 44. `algorand://indexer/assets/{asset-id}/transactions/{txid}`
 959 |     - Gets specific asset transaction
 960 |     - Returns: Transaction details
 961 | 
 962 | 45. `algorand://indexer/assets`
 963 |     - Searches assets
 964 |     - Returns: Matching assets
 965 | 
 966 | 46. `algorand://indexer/transactions/{txid}`
 967 |     - Gets transaction details
 968 |     - Returns: Historical transaction
 969 | 
 970 | 47. `algorand://indexer/transactions`
 971 |     - Searches transactions
 972 |     - Returns: Matching transactions
 973 | 
 974 | ## Response Format
 975 | 
 976 | All responses follow a standardized format using ResponseProcessor:
 977 | 
 978 | ```typescript
 979 | {
 980 |   "data": {
 981 |     // Response data here
 982 |   },
 983 |   "metadata": {  // Only for paginated responses
 984 |     "totalItems": number,
 985 |     "itemsPerPage": number,
 986 |     "currentPage": number,
 987 |     "totalPages": number,
 988 |     "hasNextPage": boolean,
 989 |     "pageToken": string,
 990 |     "arrayField": string  // Name of paginated array field
 991 |   }
 992 | }
 993 | ```
 994 | 
 995 | 
 996 | ## Error Handling
 997 | 
 998 | The server provides detailed error messages for common issues:
 999 | 
1000 | - Invalid parameters
1001 | - Network connection errors
1002 | - Transaction failures
1003 | - Resource not found errors
1004 | - Authorization errors
1005 | 
1006 | Errors are returned in a standardized format:
1007 | ```typescript
1008 | {
1009 |   "error": {
1010 |     "code": string,
1011 |     "message": string
1012 |   }
1013 | }
1014 | ```
1015 | 
1016 | 
1017 | ## License
1018 | MIT
1019 | 
```

--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Contributing to Algorand MCP
  2 | 
  3 | This guide will help you understand how to contribute new tools to the Algorand MCP server. We follow strict patterns and conventions to maintain code quality and consistency.
  4 | 
  5 | ## Project Structure
  6 | 
  7 | ```
  8 | packages/server/src/
  9 | ├── tools/
 10 | │   ├── apiManager/          # Resource-specific tool implementations
 11 | │   │   ├── [provider]/         # Provider-specific directory (e.g., tinyman, ultrade)
 12 | │   │   │   ├── index.ts        # Exports all tools
 13 | │   │   │   └── [feature].ts    # Feature-specific implementations
 14 | │   └── utils/                  # Shared utilities
 15 | │     └── responseProcessor.ts  # Response formatting utility
 16 | ├── algorand-client/            # Algorand client integration
 17 | │   └── index.ts                # Client initialization and configuration
 18 | └── API specs/                  # API specifications and documentation 
 19 | ```
 20 | 
 21 | ## Adding New Tools
 22 | 
 23 | ### 1. Create Provider Directory
 24 | 
 25 | Create a new directory under `packages/server/src/tools/apiManager/` for your provider:
 26 | 
 27 | ```bash
 28 | mkdir packages/server/src/tools/apiManager/your-provider
 29 | ```
 30 | 
 31 | ### 2. Implement Tool Handlers
 32 | 
 33 | Create separate files for different features. Each file should:
 34 | - Export tool handlers
 35 | - Define input schemas
 36 | - Implement error handling
 37 | - Include documentation
 38 | 
 39 | Example structure:
 40 | 
 41 | ```typescript
 42 | // packages/server/src/tools/apiManager/your-provider/feature.ts
 43 | 
 44 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
 45 | 
 46 | // Define input schema
 47 | export const featureToolSchema = {
 48 |   type: 'object',
 49 |   properties: {
 50 |     param1: {
 51 |       type: 'string',
 52 |       description: 'Description of parameter'
 53 |     },
 54 |     // ... other parameters
 55 |   },
 56 |   required: ['param1']
 57 | };
 58 | 
 59 | // Implement tool handler
 60 | export const featureTool = async (args: any) => {
 61 |   try {
 62 |     // Input validation
 63 |     if (!args.param1) {
 64 |       throw new McpError(
 65 |         ErrorCode.InvalidParams,
 66 |         'Missing required parameter: param1'
 67 |       );
 68 |     }
 69 | 
 70 |     // Implementation
 71 |     const result = await yourImplementation(args);
 72 | 
 73 |     // Return result directly - MCP server handles wrapping
 74 |     return result;
 75 |   } catch (error) {
 76 |     // Error handling
 77 |     if (error instanceof McpError) {
 78 |       throw error;
 79 |     }
 80 |     throw new McpError(
 81 |       ErrorCode.InternalError,
 82 |       `Feature operation failed: ${error.message}`
 83 |     );
 84 |   }
 85 | };
 86 | ```
 87 | 
 88 | ### 3. Create Index File
 89 | 
 90 | Create an `index.ts` file to export all tools:
 91 | 
 92 | ```typescript
 93 | // packages/server/src/tools/apiManager/your-provider/index.ts
 94 | 
 95 | import { McpError, ErrorCode, Tool } from '@modelcontextprotocol/sdk/types.js';
 96 | import { featureTool, featureToolSchema } from './feature.js';
 97 | 
 98 | // Define tool configurations
 99 | export const providerTools: Tool[] = [
100 |   {
101 |     name: 'api_provider_feature',
102 |     description: 'Feature description',
103 |     handler: featureTool,
104 |     inputSchema: featureToolSchema
105 |   }
106 | ];
107 | 
108 | // Handle provider tools
109 | export async function handleProviderTools(name: string, args: any): Promise<any> {
110 |   switch (name) {
111 |     case 'api_provider_feature':
112 |       return featureTool(args);
113 |     default:
114 |       throw new McpError(
115 |         ErrorCode.MethodNotFound,
116 |         `Unknown tool: ${name}`
117 |       );
118 |   }
119 | }
120 | ```
121 | 
122 | ## Code Style Guidelines
123 | 
124 | 1. **TypeScript**
125 |    - Use strict type checking
126 |    - Define interfaces for all data structures
127 |    - Use type guards for runtime checks
128 | 
129 | 2. **Async/Await**
130 |    - Use async/await for asynchronous operations
131 |    - Properly handle promises and errors
132 | 
133 | 3. **Error Handling**
134 |    - Use McpError for standardized error reporting
135 |    - Include descriptive error messages
136 |    - Add appropriate error context
137 | 
138 | 4. **Naming Conventions**
139 |    - PascalCase for classes and types
140 |    - camelCase for functions and variables
141 |    - snake_case for tool names
142 | 
143 | ## Response Processing
144 | 
145 | ### ResponseProcessor Overview
146 | The ResponseProcessor is a utility class that handles response formatting and pagination in a standardized way. It provides:
147 | 1. Automatic pagination for large arrays and objects
148 | 2. Consistent response wrapping
149 | 3. Deep object traversal and processing
150 | 4. Page token generation and handling
151 | 
152 | ### Key Features
153 | 1. **Automatic Pagination**
154 |    - Handles arrays longer than `env.items_per_page`
155 |    - Generates page tokens for navigation
156 |    - Maintains metadata about pagination state
157 | 
158 | 2. **Deep Object Processing**
159 |    - Recursively processes nested objects
160 |    - Handles arrays at any level of nesting
161 |    - Preserves object structure while paginating
162 | 
163 | 3. **Smart Pagination**
164 |    - Skips pagination for special cases (e.g., application global-state)
165 |    - Handles both arrays and objects with many keys
166 |    - Preserves data integrity during pagination
167 | 
168 | ### Usage Patterns
169 | 
170 | 1. **Direct Usage**
171 | ```typescript
172 | import { ResponseProcessor } from '../../utils/responseProcessor.js';
173 | 
174 | // Process a simple response
175 | const result = ResponseProcessor.processResponse(data);
176 | 
177 | // Process with pagination
178 | const result = ResponseProcessor.processResponse(data, pageToken);
179 | ```
180 | 
181 | 2. **Response Structure**
182 | ```typescript
183 | // Input: Any data structure
184 | const data = {
185 |   field1: 'value1',
186 |   arrayField: [1, 2, 3, ...],
187 |   nestedObject: {
188 |     subArray: [...]
189 |   }
190 | };
191 | 
192 | // Output: Processed and paginated response
193 | {
194 |   content: [{
195 |     type: 'text',
196 |     text: JSON.stringify({
197 |       data: {
198 |         field1: 'value1',
199 |         arrayField: [1, 2, 3], // Paginated if needed
200 |         nestedObject: {
201 |           subArray: [...] // Also paginated if needed
202 |         }
203 |       },
204 |       metadata: { // Only present if pagination occurred
205 |         totalItems: 100,
206 |         itemsPerPage: 10,
207 |         currentPage: 1,
208 |         totalPages: 10,
209 |         hasNextPage: true,
210 |         pageToken: 'base64token',
211 |         arrayField: 'arrayField' // Indicates which field was paginated
212 |       }
213 |     }, null, 2)
214 |   }]
215 | }
216 | ```
217 | 
218 | 3. **Pagination Control**
219 | ```typescript
220 | // Environment configuration
221 | env.items_per_page = 10; // Default page size
222 | 
223 | // Automatic pagination triggers when:
224 | // - Arrays have more items than items_per_page
225 | // - Objects have more keys than items_per_page
226 | ```
227 | 
228 | ### Best Practices
229 | 
230 | 1. **Return Raw Data**
231 | ```typescript
232 | // Good: Let ResponseProcessor handle wrapping
233 | return accountInfo;
234 | 
235 | // Bad: Manual wrapping
236 | return {
237 |   content: [{
238 |     type: 'text',
239 |     text: JSON.stringify(accountInfo)
240 |   }]
241 | };
242 | ```
243 | 
244 | 2. **Handle Page Tokens**
245 | ```typescript
246 | export const yourTool = async (args: { pageToken?: string }) => {
247 |   // Get data
248 |   const data = await getData();
249 |   
250 |   // Let ResponseProcessor handle pagination
251 |   return data;
252 | };
253 | ```
254 | 
255 | 3. **Preserve Data Structure**
256 | ```typescript
257 | // ResponseProcessor maintains structure while paginating
258 | const response = {
259 |   summary: "Account info",
260 |   details: {
261 |     assets: [...], // Will be paginated if needed
262 |     apps: [...] // Will be paginated if needed
263 |   }
264 | };
265 | ```
266 | 
267 | ### Error Handling
268 | ```typescript
269 | try {
270 |   const data = await getData();
271 |   return data; // ResponseProcessor will handle wrapping
272 | } catch (error) {
273 |   throw new McpError(
274 |     ErrorCode.InternalError,
275 |     `Operation failed: ${error.message}`
276 |   );
277 | }
278 | ```
279 | 
280 | ## Response Handling
281 | 
282 | ### Direct Response Pattern
283 | Tools should return their data directly. The MCP server framework handles:
284 | 1. Response wrapping
285 | 2. Pagination for large datasets
286 | 3. Metadata generation
287 | 
288 | Example of server-handled pagination:
289 | ```json
290 | {
291 |   "data": {
292 |     "address": "...",
293 |     "assets": [...]
294 |   },
295 |   "metadata": {
296 |     "totalItems": 355,
297 |     "itemsPerPage": 10,
298 |     "currentPage": 1,
299 |     "totalPages": 36,
300 |     "hasNextPage": true,
301 |     "pageToken": "cGFnZV8y",
302 |     "arrayField": "assets"
303 |   }
304 | }
305 | ```
306 | 
307 | ### Pagination Support
308 | - The MCP server automatically handles pagination for large arrays
309 | - Tools can accept pageToken parameter for subsequent pages
310 | - No need to manually implement pagination logic
311 | 
312 | ## Current Example Implementation
313 | 
314 | The example tool demonstrates these concepts:
315 | 
316 | ```typescript
317 | // packages/server/src/tools/apiManager/example/get-balance.ts
318 | 
319 | import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
320 | import { algodClient } from '../../../algorand-client.js';
321 | 
322 | export const getBalanceToolSchema: { type: "object", properties: any, required: string[] } = {
323 |   type: "object",
324 |   properties: {
325 |     address: {
326 |       type: 'string',
327 |       description: 'Algorand address in standard format (58 characters)'
328 |     }
329 |   },
330 |   required: ['address']
331 | };
332 | 
333 | export const getBalanceTool = async (args: { address: string }) => {
334 |   try {
335 |     // Input validation
336 |     if (!args.address) {
337 |       throw new McpError(
338 |         ErrorCode.InvalidParams,
339 |         'Missing required parameter: address'
340 |       );
341 |     }
342 | 
343 |     if (!/^[A-Z2-7]{58}$/.test(args.address)) {
344 |       throw new McpError(
345 |         ErrorCode.InvalidParams,
346 |         'Invalid Algorand address format'
347 |       );
348 |     }
349 | 
350 |     // Get account information using Algorand client
351 |     const accountInfo = await algodClient.accountInformation(args.address).do();
352 | 
353 |     // Return account info directly - MCP server handles pagination
354 |     return accountInfo;
355 |   } catch (error: unknown) {
356 |     // Handle specific Algorand API errors
357 |     if (error instanceof McpError) {
358 |       throw error;
359 |     }
360 | 
361 |     // Format error response
362 |     const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
363 |     throw new McpError(
364 |       ErrorCode.InternalError,
365 |       `Failed to get account balance: ${errorMessage}`
366 |     );
367 |   }
368 | };
369 | ```
370 | 
371 | Key features demonstrated:
372 | 1. Proper import paths with .js extensions
373 | 2. TypeScript type definitions
374 | 3. Input validation
375 | 4. Direct response pattern
376 | 5. Error handling
377 | 6. Integration with Algorand client
378 | 7. Automatic pagination support
379 | 
380 | ## Testing Requirements
381 | 
382 | 1. Create test files mirroring your tool structure:
383 | 
384 | ```typescript
385 | // packages/server/tests/tools/apiManager/your-provider/feature.test.ts
386 | 
387 | describe('Your Provider Feature Tool', () => {
388 |   it('should handle valid input correctly', async () => {
389 |     // Test implementation
390 |   });
391 | 
392 |   it('should handle invalid input appropriately', async () => {
393 |     // Test error cases
394 |   });
395 | 
396 |   // Add more test cases
397 | });
398 | ```
399 | 
400 | 
401 | 
402 | ## Documentation Standards
403 | 
404 | 1. **JSDoc Comments**
405 | ```typescript
406 | /**
407 |  * Description of what the tool does
408 |  * @param {Object} args - Tool arguments
409 |  * @param {string} args.param1 - Description of parameter
410 |  * @returns {Promise<Object>} Description of return value
411 |  * @throws {McpError} Description of possible errors
412 |  */
413 | ```
414 | 
415 | 2. **Usage Examples**
416 | ```typescript
417 | // Include example usage in comments
418 | /*
419 | Example usage:
420 | {
421 |   "param1": "example-value",
422 |   "param2": 123
423 | }
424 | 
425 | Example response:
426 | {
427 |   "data": {
428 |     // Tool-specific data
429 |   },
430 |   "metadata": {
431 |     // Pagination metadata if applicable
432 |   }
433 | }
434 | */
435 | ```
436 | 
437 | 3. **Error Documentation**
438 | - Document all possible error cases
439 | - Include error codes and messages
440 | - Provide troubleshooting guidance
441 | 
442 | ## Best Practices
443 | 
444 | 1. **Input Validation**
445 |    - Validate all input parameters
446 |    - Use type guards for runtime checks
447 |    - Provide clear error messages
448 | 
449 | 2. **Response Handling**
450 |    - Return raw data directly
451 |    - Let MCP server handle response wrapping
452 |    - Let MCP server handle pagination
453 | 
454 | 3. **Performance**
455 |    - Implement caching where appropriate
456 |    - Handle rate limits
457 |    - Optimize network requests
458 | 
459 | 4. **Security**
460 |    - Validate all inputs
461 |    - Sanitize sensitive data
462 |    - Handle credentials securely
463 | 
464 | ## Review Process
465 | 
466 | 1. **Code Review Checklist**
467 |    - Follows project structure
468 |    - Implements proper error handling
469 |    - Includes comprehensive tests
470 |    - Provides clear documentation
471 |    - Follows naming conventions
472 |    - Handles edge cases
473 | 
474 | 2. **Testing Requirements**
475 |    - All tests pass
476 |    - Adequate test coverage
477 |    - Integration tests included
478 |    - Performance tests if applicable
479 | 
480 | 3. **Documentation Requirements**
481 |    - JSDoc comments complete
482 |    - Usage examples provided
483 |    - Error cases documented
484 |    - README updates if needed
485 | 
486 | ## Getting Help
487 | 
488 | - Review existing implementations in `packages/server/src/tools/apiManager/`
489 | - Check test files for examples
490 | - Consult project maintainers
491 | - Reference API specifications in `packages/server/API specs/`
492 | 
493 | Remember to follow the established patterns and maintain consistency with the existing codebase.
494 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:crypto:merkle_tree.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:defi:amm.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:defi:auction.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:defi:htlc_logicsig.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:defi:marketplace.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:events:arc28_events.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:governance:simple_voting.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:nft:proof_of_attendance.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:privacy:zk_whitelist.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:transactions.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:python:code:example:utility:calculator.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/liquid-auth:services:liquid-auth-api-js:src:auth:auth.controller.get.user.md:
--------------------------------------------------------------------------------

```markdown
1 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/liquid-auth:services:liquid-auth-api-js:src:attestation:attestation.controller.post.request.md:
--------------------------------------------------------------------------------

```markdown
1 | # TITLE
2 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/tealscript:tests_test_package_README.md:
--------------------------------------------------------------------------------

```markdown
1 | This is a simple package that is used to test importing things from npm packages.
2 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/tealscript:examples_itxns_README.md:
--------------------------------------------------------------------------------

```markdown
1 | To compile `itxns.ts`, generate the algokit client, and run `demo.ts` run `yarn itxns`
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/tealscript:examples_reti_README.md:
--------------------------------------------------------------------------------

```markdown
1 | Reti contracts from https://github.com/TxnLab/reti/tree/2567018024ab8c2b3c59142e26cb55ce78bd2414
2 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_amount_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/amount.spec
2 | 
3 | # Module: types/amount.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.request.md:
--------------------------------------------------------------------------------

```markdown
1 | # POST Assertion Request
2 | 
3 | This endpoint is used to request assertion options from the FIDO2 service.
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/liquid-auth:services:liquid-auth-api-js:src:assertion:assertion.controller.post.response.md:
--------------------------------------------------------------------------------

```markdown
1 | # POST Assertion Response
2 | 
3 | This endpoint is used to request assertion options from the FIDO2 service.
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_app_client_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/app-client.spec
2 | 
3 | # Module: types/app-client.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_client_manager_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/client-manager.spec
2 | 
3 | # Module: types/client-manager.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/developer:docs:details:dapps:writing-contracts:python.md:
--------------------------------------------------------------------------------

```markdown
1 | title: Python
2 | 
3 | Follow [this](https://algorandfoundation.github.io/puya/) link for the Algorand Python GitHub docs.
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_account_manager_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/account-manager.spec
2 | 
3 | # Module: types/account-manager.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_algorand_client_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/algorand-client.spec
2 | 
3 | # Module: types/algorand-client.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_dispenser_client_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/dispenser-client.spec
2 | 
3 | # Module: types/dispenser-client.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_async_event_emitter_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/async-event-emitter.spec
2 | 
3 | # Module: types/async-event-emitter.spec
4 | 
```

--------------------------------------------------------------------------------
/packages/server/src/resources/knowledge/taxonomy/algokit:utils:typescript:code:modules:types_algorand_client_asset_spec.md:
--------------------------------------------------------------------------------

```markdown
1 | [@algorandfoundation/algokit-utils](../README.md) / types/algorand-client.asset.spec
2 | 
3 | # Module: types/algorand-client.asset.spec
4 | 
```
Page 1/93FirstPrevNextLast