DexScreener MCP Server
The DexScreener MCP Server provides real-time access to decentralized exchange (DEX) pair data, token information, and market statistics across multiple blockchains. With this server, you can:
Fetch latest token profiles
Retrieve latest boosted tokens
Identify top boosted tokens
Check orders paid for specific tokens (requires chain ID and token address)
Get pairs by chain and pair address
Find pairs by token addresses (supports up to 30 comma-separated token addresses)
Search for pairs matching a query
The API is rate-limited with 60 requests per minute for token profiles/boosts and 300 requests per minute for DEX/pairs data. The server provides type-safe interfaces for reliable development and handles various error scenarios.
Provides access to Solana blockchain data through DexScreener API, allowing retrieval of DEX pair data and token information on the Solana network.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DexScreener MCP Serversearch for SOL pairs on Solana"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DexScreener MCP Server
An MCP server implementation for accessing the DexScreener API, providing real-time access to DEX pair data, token information, and market statistics across multiple blockchains.
One-line install (automatically adds to Claude Desktop):
curl -L https://raw.githubusercontent.com/opensvm/dexscreener-mcp-server/main/install.sh | bashFeatures
Rate-limited API access (respects DexScreener's rate limits)
Comprehensive error handling
Type-safe interfaces
Support for all DexScreener API endpoints
Integration tests
Related MCP server: dex-kline-mcp
Installation
Manual installation:
npm install
npm run build
npm run setupTesting
npm testUsage
Available Tools
get_latest_token_profilesGet the latest token profiles
No parameters required
const result = await mcpClient.callTool('dexscreener', 'get_latest_token_profiles');get_latest_boosted_tokensGet the latest boosted tokens
No parameters required
const result = await mcpClient.callTool('dexscreener', 'get_latest_boosted_tokens');get_top_boosted_tokensGet tokens with most active boosts
No parameters required
const result = await mcpClient.callTool('dexscreener', 'get_top_boosted_tokens');get_token_ordersCheck orders paid for a specific token
const result = await mcpClient.callTool('dexscreener', 'get_token_orders', { chainId: 'solana', tokenAddress: 'So11111111111111111111111111111111111111112' });get_pairs_by_chain_and_addressGet one or multiple pairs by chain and pair address
const result = await mcpClient.callTool('dexscreener', 'get_pairs_by_chain_and_address', { chainId: 'solana', pairId: 'HxFLKUAmAMLz1jtT3hbvCMELwH5H9tpM2QugP8sKyfhc' });get_pairs_by_token_addressesGet one or multiple pairs by token address (max 30)
const result = await mcpClient.callTool('dexscreener', 'get_pairs_by_token_addresses', { tokenAddresses: 'So11111111111111111111111111111111111111112' });search_pairsSearch for pairs matching query
const result = await mcpClient.callTool('dexscreener', 'search_pairs', { query: 'SOL' });
Rate Limits
The server implements rate limiting to comply with DexScreener's API limits:
Token Profile/Boost endpoints: 60 requests per minute
DEX/Pairs endpoints: 300 requests per minute
Error Handling
The server handles various error scenarios:
Rate limit exceeded
Invalid parameters
Network errors
API errors
Errors are returned in a standardized format with appropriate error codes and messages.
API Documentation
For detailed API documentation, see docs/api-reference.md.
Development
Project Structure
.
├── src/
│ ├── types/ # TypeScript interfaces and types
│ ├── services/ # API service implementations
│ ├── tests/ # Integration tests
│ └── index.ts # Main server implementation
├── scripts/ # Setup and utility scripts
├── docs/ # Documentation
└── README.md # This fileAdding New Features
Define types in
src/types/Implement service methods in
src/services/Add tool handlers in
src/index.tsUpdate documentation
Add tests
License
MIT
Available Tools
7 toolsget_latest_boosted_tokensC
Get the latest boosted tokens
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states what the tool does ('Get the latest boosted tokens') without explaining behavioral traits like whether it's read-only, requires authentication, has rate limits, or what 'latest' means (e.g., time-based, count-based). This is a significant gap for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's appropriately sized for a simple tool and front-loaded with the core action. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (simple retrieval) but lack of annotations and output schema, the description is incomplete. It doesn't explain what 'boosted tokens' are, how 'latest' is defined, or what the return format looks like. For a tool with no structured data to rely on, this leaves critical gaps in understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it doesn't introduce any confusion. A baseline score of 4 is appropriate as the description doesn't compensate for missing param info, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get the latest boosted tokens' states a clear verb ('Get') and resource ('boosted tokens'), but it's vague about what 'boosted tokens' means and doesn't distinguish it from sibling tools like 'get_top_boosted_tokens' or 'get_latest_token_profiles'. It provides a basic purpose but lacks specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions, such as how it differs from 'get_top_boosted tokens' or other siblings. This leaves the agent with no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_token_profilesC
Get the latest token profiles
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but only states the action without any behavioral traits. It does not cover aspects like read-only vs. destructive operations, authentication needs, rate limits, or response format, making it inadequate for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with a single sentence, but it is under-specified rather than efficiently structured. It lacks front-loaded critical information and does not earn its place by adding value, resulting in a mediocre score for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It does not explain what 'latest' means, what data 'token profiles' include, or how results are returned, failing to provide sufficient context for the agent to understand the tool's behavior and output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so no parameter information is needed. The description does not add semantics beyond the schema, but this is acceptable as the baseline for zero parameters is 4, since there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get the latest token profiles' restates the tool name 'get_latest_token_profiles' almost verbatim, making it tautological. It provides a vague purpose without specifying what 'latest' means (e.g., by time, update frequency) or what 'token profiles' entail, failing to distinguish it from sibling tools like 'get_top_boosted_tokens' or 'get_latest_boosted_tokens'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives. It does not mention context, prerequisites, or exclusions, and fails to differentiate it from sibling tools such as 'get_latest_boosted_tokens' or 'search_pairs', leaving the agent with no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pairs_by_chain_and_addressC
Get one or multiple pairs by chain and pair address
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | Yes | Chain ID (e.g., "solana") | |
| pairId | Yes | Pair address |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only states the basic function. It doesn't disclose behavioral traits such as read-only nature, error handling, rate limits, or response format, leaving significant gaps for a tool with two required parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste, clearly front-loading the purpose. It's appropriately sized for the tool's complexity, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It lacks details on return values, error cases, or behavioral context needed for effective use, especially with required parameters and sibling tools present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters. The description adds minimal value by mentioning 'chain and pair address' but doesn't provide additional semantics beyond what's in the schema, aligning with the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('pairs'), specifying retrieval by chain and pair address. It distinguishes from siblings like 'search_pairs' by focusing on direct address lookup rather than search, though it doesn't explicitly contrast with 'get_pairs_by_token_addresses'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'search_pairs' or 'get_pairs_by_token_addresses'. The description implies usage for direct address-based retrieval but lacks explicit context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pairs_by_token_addressesC
Get one or multiple pairs by token address (max 30)
| Name | Required | Description | Default |
|---|---|---|---|
| tokenAddresses | Yes | Comma-separated token addresses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions a limit ('max 30'), which is useful context, but lacks other critical details such as whether this is a read-only operation, potential rate limits, error handling, or the format of returned data. The description is minimal and leaves significant behavioral aspects unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose and a key constraint ('max 30'). It is front-loaded with essential information and contains no unnecessary words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is insufficiently complete. It omits details about the return format (e.g., what data fields are included for pairs), error conditions, or dependencies. For a tool with one parameter but no structured output documentation, more context is needed to guide effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the parameter 'tokenAddresses' documented as 'Comma-separated token addresses'. The description adds no additional semantic information beyond what the schema provides, such as examples or constraints on address format. Baseline score of 3 is appropriate since the schema adequately covers the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('one or multiple pairs'), with the specific mechanism 'by token address'. It distinguishes from siblings like 'get_pairs_by_chain_and_address' by focusing solely on token addresses. However, it doesn't explicitly differentiate from 'search_pairs' which might also involve token addresses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_pairs_by_chain_and_address' or 'search_pairs'. It mentions a constraint ('max 30') but doesn't explain why this tool is preferred over others for fetching pairs by token addresses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_ordersC
Check orders paid for a specific token
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | Yes | Chain ID (e.g., "solana") | |
| tokenAddress | Yes | Token address |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'Check orders paid' but doesn't clarify if this is a read-only operation, what data is returned, potential rate limits, authentication needs, or error conditions. This leaves significant gaps for an agent to understand how to use it effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no wasted words, making it highly concise and front-loaded. It efficiently communicates the core purpose without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'orders paid' entails, the format of returned data, or how results are structured, leaving the agent with insufficient context to handle responses or understand the tool's full behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with clear documentation for chainId and tokenAddress parameters. The description adds no additional semantic context beyond what the schema provides, such as example values or usage notes, so it meets the baseline but doesn't enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Check orders') and the target ('paid for a specific token'), making the purpose understandable. However, it doesn't differentiate this tool from its siblings (e.g., get_latest_boosted_tokens, search_pairs), which might also involve token-related queries, so it falls short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With siblings like get_latest_boosted_tokens and search_pairs available, there's no indication of context, prerequisites, or exclusions for selecting this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_boosted_tokensB
Get tokens with most active boosts
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool 'gets' tokens, implying a read operation, but doesn't specify any behavioral traits such as rate limits, authentication needs, data freshness, or what constitutes 'most active boosts.' This leaves significant gaps in understanding how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence: 'Get tokens with most active boosts.' It is front-loaded and wastes no words, making it highly concise and well-structured for its purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'most active boosts' means, how results are sorted or limited, or what the return format looks like. For a tool that likely returns a list of tokens, more context is needed to understand its output and usage fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description doesn't add parameter semantics, but this is acceptable given the lack of parameters, aligning with the baseline expectation for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get tokens with most active boosts.' It uses a specific verb ('Get') and identifies the resource ('tokens with most active boosts'). However, it doesn't explicitly differentiate from sibling tools like 'get_latest_boosted_tokens' or 'get_latest_token_profiles,' which appear related but have different scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions, nor does it reference sibling tools like 'get_latest_boosted_tokens' or 'get_token_orders' that might be used in similar scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pairsC
Search for pairs matching query
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action ('Search') without details on permissions, rate limits, pagination, or what 'matching query' entails (e.g., fuzzy vs. exact matches). This leaves significant gaps for a search tool with no structured safety or operational hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste: 'Search for pairs matching query'. It is appropriately sized and front-loaded, clearly stating the core action without unnecessary elaboration, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a search tool with no annotations and no output schema, the description is incomplete. It doesn't explain what 'pairs' are, the search behavior, or return values, leaving the agent with insufficient context to use the tool effectively beyond the basic parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'query' parameter documented as 'Search query'. The description adds no additional meaning beyond this, such as query syntax or examples. With high schema coverage, the baseline score of 3 is appropriate, as the schema handles the parameter documentation adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Search for pairs matching query' states a clear verb ('Search') and resource ('pairs'), but it's vague about what 'pairs' refers to in this context. It doesn't distinguish from siblings like 'get_pairs_by_chain_and_address' or 'get_pairs_by_token_addresses', leaving ambiguity about the search scope or criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. With siblings like 'get_pairs_by_chain_and_address' and 'get_pairs_by_token_addresses', the description lacks context for choosing this general search over more specific retrieval methods, offering no explicit when/when-not or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes, with clear separation between boosted tokens, token profiles, pairs retrieval, token orders, and pair search. However, get_latest_boosted_tokens and get_top_boosted_tokens could potentially cause some confusion regarding whether they serve overlapping or complementary functions, as both relate to boosted tokens with slightly different focuses.
All tool names follow a consistent verb_noun pattern with underscores, using descriptive and predictable naming conventions. The structure is uniform across all seven tools, making it easy for agents to understand and predict tool purposes based on their names.
With 7 tools, the server is well-scoped for its purpose of providing DexScreener data access. Each tool appears to serve a specific and necessary function without redundancy, covering key operations like retrieving tokens, pairs, orders, and searches in a focused manner.
The tool set covers essential operations for accessing DexScreener data, including token and pair retrieval, orders, and search. A minor gap exists in the lack of update or management tools, but this is reasonable for a read-only data access server, and agents can work effectively with the provided query-focused tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Unlock the power of real-time cryptocurrency data with our Crypto Price Insights MCP server.
MCP server giving AI agents one-connection access to crypto & DeFi data: DeFi protocol TVL, stableco
DEX Screener MCP — DEX price/liquidity/volume data
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server for querying Uniswap pools/pairs by token address, delivering clean, structured results for easy integration and analysis.54MIT
- AlicenseAqualityDmaintenanceAn MCP server that streams K-line (candlestick) data from decentralized exchanges (DEXs) to power your AI agents and workflows.14MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides AI agents with real-time access to DEX liquidity pool data, enabling smarter trading, analytics, and automated strategies.101MIT
- AlicenseNot gradedqualityAmaintenanceMCP server providing market data for 15,000+ cryptocurrencies including prices, history, trends, and deep coin metadata via CoinGecko.1221Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/openSVM/dexscreener-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server