mcp-inscription
MCP-Inscription Server
Überblick
Ein Model Context Protocol (MCP)-Server, der es KI-Modellen ermöglicht, mit Ordinals Inscriptions zu interagieren und so Inhalte aus einer Transaktion anzuzeigen.
Related MCP server: MCP Bitcoin CLI
🎮 Demo
Goose- Demovideo |
💼 Inhaltsverzeichnis
🔧 Funktionen
Ordinalerkennung : Automatische Erkennung und Analyse von Bitcoin-Transaktionen in Ordinalzahlen. Unterstützung von textbasierten Formaten, Bildern, JSON und weiteren Beschriftungsformaten.
🦆 Goose-Integration
Goose ist ein Open-Source-KI-Agenten-Framework von Block, das Erweiterungen über das Model Context Protocol unterstützt. Sie können den MCP-Inscription-Server als Goose-Erweiterung integrieren, um Goose die Interaktion mit Ordinals Inscriptions zu ermöglichen. Goose unterstützt zwei Integrationsmodi für MCP-Server: den Betrieb des Servers als lokaler Prozess (STDIO) oder die Verbindung als Remote-Dienst über Server-Sent Events (SSE). Nachfolgend finden Sie Anweisungen für beide Methoden:
Verwenden von STDIO (lokale Erweiterung)
Diese Methode führt den MCP-Inscription-Server lokal als Unterprozess von Goose aus und kommuniziert über die Standard-Eingabe/Ausgabe.
Klonen und erstellen Sie das MCP-Inscription-Repository (falls Sie dies noch nicht getan haben):
git clone https://github.com/Laz1mov/mcp-inscription cd mcp-inscription npm install npm run buildNotieren Sie sich den vollständigen absoluten Pfad zum Repository, da Sie ihn im nächsten Schritt benötigen.
Fügen Sie eine neue Erweiterung in Goose hinzu: Öffnen Sie die Konfigurationsoberfläche von Goose. Sie können dies über die Kommandozeile tun, indem Sie
goose configure“ ausführen, oder in der Goose Desktop-App, indem Sie zu Einstellungen > Erweiterungen gehen. Wählen Sie im Menü „Erweiterung hinzufügen“. ( Verwenden von Erweiterungen | goose )Wählen Sie den Erweiterungstyp – Befehlszeilenerweiterung: Wenn Sie nach dem Erweiterungstyp gefragt werden, wählen Sie „Befehlszeilenerweiterung“ (im CLI-Menü oder in der Benutzeroberfläche), damit Goose weiß, dass es einen lokalen Befehl ( Verwenden von Erweiterungen | goose ) starten soll (und nicht eine integrierte oder Remote-Erweiterung).
Geben Sie die Erweiterungsdetails ein: Geben Sie einen Namen und einen Befehl für den MCP-Inscription-Server an:
ID :
mcp-inscriptionName: Sie können es „mcp-inscription“ oder eine beliebige Kennung nennen (so beziehen Sie sich auf die Erweiterung).
Befehl: Geben Sie den vollständigen Pfad zum erstellten CLI-Skript an. Beispiel:
node /absolute/path/to/mcp-inscription/build/cli.jsErsetzen Sie
/absolute/path/to/mcp-inscriptiondurch den tatsächlichen Pfad, unter dem Sie das Repository geklont haben.Normalerweise müssen Sie über den Skriptpfad hinaus keine Argumente hinzufügen (es sei denn, Ihr Server erfordert spezielle Flags).
Abschließen und aktivieren: Schließen Sie das Hinzufügen der Erweiterung ab. Goose fügt die neue Erweiterung seiner Konfiguration hinzu (normalerweise
~/.config/goose/config.yaml). Stellen Sie sicher, dass die Erweiterung aktiviert ist (bei Verwendung des CLI-Assistenten sollte sie standardmäßig aktiviert sein; in der Goose Desktop-App können Sie die Erweiterungsliste überprüfen und sie aktivieren, falls sie noch nicht aktiviert ist ( Verwenden von Erweiterungen | goose ).Starten Sie eine Goose-Sitzung mit der neuen Erweiterung: Sie können die Erweiterung jetzt in Goose verwenden. Wenn Sie Goose über die Befehlszeilenschnittstelle ausführen, starten Sie eine Sitzung mit der Erweiterung, indem Sie Folgendes ausführen:
goose session --with-extension "mcp-inscription"
Ersetzen Sie „ordinals“ durch den Namen, den Sie der Erweiterung gegeben haben ( Verwenden von Erweiterungen | goose ). (Dadurch wird sichergestellt, dass die Sitzung die Erweiterung lädt. Alternativ ist die Erweiterung global aktiviert und steht über Goose Desktop oder die CLI automatisch in allen Sitzungen zur Verfügung.)
Verwenden von SSE (Remote Extension)
Diese Methode verbindet Goose über einen HTTP-SSE-Stream mit einem bereits laufenden MCP-Server. Verwenden Sie diese Methode, wenn Sie den MCP-Inscription-Server als eigenständigen Dienst ausführen möchten (möglicherweise auf einem anderen Rechner oder unabhängig von Goose).
Starten Sie den MCP-Server als eigenständigen Dienst: Führen Sie den MCP-Inscription-Server im SSE-Modus aus, um auf Verbindungen zu warten:
# Navigate to your mcp-inscription directory cd /path/to/mcp-inscription # If you havent built it yet npm install npm run build # Run in SSE mode on port 3000 (default) SERVER_MODE=sse node build/cli.js # Alternatively, specify a different port SERVER_MODE=sse PORT=9000 node build/cli.jsDadurch wird der Server im SSE-Modus gestartet und ist unter
http://localhost:3000(oder Ihrem angegebenen Port) verfügbar.Fügen Sie eine neue Erweiterung in Goose (Remote) hinzu: Führen Sie wie zuvor
goose configureaus oder verwenden Sie die Goose-Benutzeroberfläche, um eine Erweiterung hinzuzufügen ( Verwenden von Erweiterungen | goose ). Wählen Sie dieses Mal „Remote-Erweiterung“, wenn Sie nach dem Erweiterungstyp gefragt werden ( Verwenden von Erweiterungen | goose ). Dadurch wird Goose informiert, dass es über SSE eine Verbindung zu einem externen Server herstellt.Geben Sie die Details der Remote-Erweiterung ein: Benennen Sie die Erweiterung (z. B. „ordinals“) und geben Sie die URL des Servers an. Geben Sie als URL die Basisadresse des MCP-Servers ein. Wenn Ihr Server beispielsweise Port 9000 auf Ihrem lokalen Rechner nutzt, geben Sie
http://localhost:9000ein. Goose versucht dann, eine Verbindung zum SSE-Endpunkt des MCP-Servers unter dieser Adresse herzustellen. (Goose verwendet den Standard-MCP-SSE-Pfad, der sich üblicherweise unter der Route/mcp/sseauf dem Server befindet. Sie müssen in der Regel nur Host und Port angeben, Goose erledigt den Rest.)Aktivieren Sie die Erweiterung: Stellen Sie nach dem Hinzufügen der Remote-Erweiterung sicher, dass sie in den Goose-Einstellungen aktiviert ist (genau wie im STDIO-Fall). Es muss nur eine der STDIO- oder SSE-Erweiterungen (mit denselben Tools) aktiviert werden. Sollten Sie versehentlich sowohl eine lokale als auch eine Remote-Version desselben Servers aktivieren, deaktivieren Sie am besten eine davon, um Verwirrung zu vermeiden.
Verwendung der MCP-Inscription-Erweiterung in Goose: Sobald die Erweiterung (mit einer der oben genannten Methoden) eingerichtet und aktiviert ist, können Sie mit Goose interagieren und Bestelldaten darüber abfragen. Stellen Sie in einem neuen Goose-Chat oder einer neuen Goose-Sitzung einfach wie gewohnt Fragen. Goose erkennt automatisch, wann die MCP-Inscription-Tools zur Bearbeitung Ihrer Anfrage eingesetzt werden müssen. Beispiel:
"Zeigen Sie mir die Ordnungszahlen: 0169d12c4edf2026a67e219c10207438a080eb82d8f21860f6784dd66f281389?"
Wenn Sie diese Fragen stellen, ruft Goose die Tools des MCP-Inscription-Servers auf und gibt die Antwort zurück (z. B. die neuesten Bitcoin-Blockinformationen). Goose sollte mit aktuellen Informationen aus der Bitcoin-Blockchain über den MCP-Inscription-Server antworten.
Wenn Goose die Erweiterung scheinbar nicht verwendet (z. B. wenn die Meldung angezeigt wird, dass die Informationen nicht gefunden werden können), stellen Sie sicher, dass die Erweiterung aktiviert ist und der Server läuft (im SSE-Modus für Remote-Zugriff). Sie können auch die Goose-CLI mit ausführlicher Protokollierung ausführen, um zu prüfen, ob die Erweiterung aufgerufen wurde. Bei korrekter Konfiguration erkennt Goose die Funktionen des MCP-Inscription-Servers automatisch und nutzt sie gegebenenfalls.
Weitere Ressourcen: Weitere Informationen zu Goose-Erweiterungen und dem MCP finden Sie in der offiziellen Goose-Dokumentation ( Verwendung von Erweiterungen | goose ). Die Dokumentation enthält eine Liste der integrierten und Community-Erweiterungen und erklärt, wie sich MCP-Server in Goose integrieren. Ein Verzeichnis der verfügbaren MCP-Server sowie zusätzliche Konfigurationstipps finden Sie ebenfalls in der Goose-Dokumentation und der Dokumentation zum Model Context Protocol. Dies kann hilfreich sein, wenn Sie weitere Erweiterungen erkunden oder eigene entwickeln möchten.
🔑 Claude Desktop Integration
Um den MCP-Inscription-Server mit Claude Desktop (Anthropics Desktop-App für Claude) zu verwenden, folgen Sie diesen Schritten:
Claude Desktop herunterladen und installieren: Besuchen Sie die offizielle Downloadseite von Claude Desktop und laden Sie die App für Ihr Betriebssystem (macOS oder Windows) herunter ( Installation von Claude für Desktop | Anthropic Help Center ). Installieren Sie die App und stellen Sie sicher, dass Sie die neueste Version verwenden (Updates finden Sie im App-Menü).
Klonen und Erstellen des MCP-Inscription-Repository:
git clone https://github.com/Laz1mov/mcp-inscription cd mcp-inscription npm install npm run buildKonfigurieren Sie Claude Desktop für die Verwendung des MCP-Inscription-Servers: Öffnen Sie die Konfigurationsdatei von Claude Desktop (sie wird erstellt, wenn Sie die Einstellungen in Claude Desktop zum ersten Mal bearbeiten):
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Fügen Sie in dieser JSON-Konfiguration im Abschnitt"mcpServers"einen Eintrag für den MCP-Inscription-Server hinzu. Beispiel:
{ "mcpServers": { "mcp-inscription": { "command": "node", "args": ["/absolute/path/to/mcp-inscription/build/cli.js"] } } }Im obigen Snippet ist
"mcp-inscription"eine Kennung für den Server (Sie können ihn beliebig benennen). Ersetzen Sie/absolute/path/to/mcp-inscriptiondurch den vollständigen Pfad zum geklonten Repository.Starten Sie Claude Desktop neu: Speichern Sie die Datei
claude_desktop_config.json, schließen Sie Claude Desktop und öffnen Sie es erneut. Beim nächsten Start startet Claude den MCP-Inscription-Server automatisch wie konfiguriert. Falls Claude Desktop bereits ausgeführt wurde, müssen Sie es neu starten, damit die Änderungen wirksam werden.
Testen der Claude Desktop-Integration
Sobald Claude Desktop neu gestartet ist, können Sie testen, ob der MCP-Inscription-Server ordnungsgemäß funktioniert:
Überprüfen Sie die Antwort: Claude sollte eine detaillierte Antwort (z. B. die Inschrift selbst oder Runeninformationen) ohne Fehler zurückgeben. Wenn Sie eine Fehlermeldung oder keine nützliche Antwort erhalten, ist der MCP-Server möglicherweise nicht richtig verbunden.
Überprüfen Sie Claudes Protokolle (falls erforderlich): Claude Desktop stellt Protokolldateien bereit, die beim Debuggen von MCP-Integrationen helfen können. Falls das Tool nicht reagiert, überprüfen Sie die Protokolldateien in:
macOS:
~/Library/Logs/Claude/Windows:
%APPDATA%\Claude\logs\
Suchen Sie inmcp.lognach allgemeinen MCP-Verbindungsmeldungen und in der Dateimcp-server-mcp-inscription.log(oder einem anderen von Ihnen gewählten Namen) nach den Ausgaben/Fehlern des MCP-Servers. Diese Protokolle zeigen an, ob der Server gestartet wurde oder ob Fehler aufgetreten sind (z. B. ein falscher Pfad oder Ausnahmen im Server). Sollten Fehler auftreten, korrigieren Sie die Konfiguration oder Umgebung entsprechend, starten Sie Claude Desktop neu und testen Sie es erneut.
Installation über Smithery
So installieren Sie Inscription Server für Claude Desktop automatisch über Smithery :
npx -y @smithery/cli install @Laz1mov/mcp-inscription --client claude📂 Projektstruktur
mcp-inscription/
├── src/
│ ├── ordinals_client.ts # Bitcoin ordinals and runestone utility functions
│ ├── servers/
│ │ ├── index.ts # Server exports and factory functions
│ │ ├── sse.ts # Server implementation using SSE transport
│ │ ├── stdio.ts # Server implementation using STDIO transport
│ │ └── base.ts # Base server implementation with shared functionality
│ ├── index.ts # Main entry point
│ ├── cli.ts # CLI launcher
│ ├── mcp_inscription_types.ts # Shared types and schemas for the MCP-Inscription server
│ └── utils/
│ ├── logger.ts # Logger setup
│ ├── cache.ts # Caching implementation
│ ├── error_handlers.ts # Error handling utilities
│ ├── json_utils.ts # JSON processing utilities
│ ├── img_utils.ts # Image processing and conversion utilities
│ └── version.ts # Version information
├── .env.example # Example environment configuration file
├── package.json
├── tsconfig.json
└── README.md📦 Verfügbare Tools
Ordinalzahlen anzeigen
Beschreibung:
Dekodiert ordinale Inschriftdaten aus den Zeugendaten einer Transaktion.
Eingabeschema:
{
"txid": "string"
}Beispieleingabe:
{
"txid": "0169d12c4edf2026a67e219c10207438a080eb82d8f21860f6784dd66f281389"
}Ausgabe:
Gibt den dekodierten Beschriftungsinhalt zurück, der im Text-, JSON-, HTML- oder anderen Formaten vorliegen kann.
🚨 Fehlerbehandlung
Der Server verwendet benutzerdefinierte Fehlertypen zur Verarbeitung von Bitcoin-Operationen und Blockchain-Abfragen. Detaillierte Fehlermeldungen werden mit Pino protokolliert und in die Client-Antworten integriert, um die Fehlersuche zu vereinfachen.
🤝 Beitragen
Beiträge und Funktionsanfragen sind willkommen! Sie können gerne Pull Requests oder offene Probleme auf GitHub einreichen.
📝 Lizenz
Dieses Projekt ist unter der MIT-Lizenz lizenziert.
Available Tools
1 toolshow_ordinalsB
🔹 Bitcoin Ordinals Expert Assistant
🚀 MANDATORY TWO-RESPONSE PROCESS FOR IMAGES
I strictly follow a two-step structured workflow for processing Bitcoin Ordinal inscriptions. STRICT ADHERENCE IS REQUIRED.
📌 Required Tools & Workflow
🔍 Tools Used:
1️⃣ show_ordinals (MANDATORY FIRST STEP)
Fetches inscription data.
If the inscription is an image, it MUST:
Save it locally and return the
local_file_path.(Code currently does NOT return a separate displayable source, only the local path)
2️⃣ image_processor / vision (OCR & Visual Analysis ONLY)
MUST be used for extracting textual/visual data from the image.
Takes
local_file_pathas input.
🚀 MANDATORY TWO-STEP RESPONSE WORKFLOW (FOR IMAGES)
📌 RESPONSE 1: Display Attempt + Technical Details (NON-TERMINAL)
✔ Execute show_ordinals FIRST.
✔ Return an <img> tag using the local_file_path provided by show_ordinals as the src attribute.
✔ Follow with detailed technical metadata.
✔ STOP HERE. NO ANALYSIS YET.
✅ RESPONSE FORMAT (STRICTLY ENFORCED):
<!-- Attempting display using local path. Note: May not render in standard browsers due to security restrictions. -->
<img src="[local_file_path from show_ordinals]" alt="Ordinal Image Inscription" style="max-width: 100%; height: auto;" />
### 📊 Technical Details
* **MIME Type:** [MIME type]
* **Size:** [Size]
* **Transaction ID:** [Tx ID]
* **Status:** [Status]
* **Inscription Input:** [Input]
* **Local Path (for analysis):** `[local_file_path from show_ordinals]`
* [Other available details]🔹 End FIRST response here. No OCR, No AI-generated descriptions. This response is intended to be NON-TERMINAL to allow for Step 2.
📌 RESPONSE 2: OCR & Content Analysis (Using Designated Tools ONLY)
✔ AFTER Response 1, consult available tools.
✔ Execute image_processor OR vision using the local_file_path from Response 1.
✔ Strictly use ONLY tool-generated analysis.
✔ If BOTH tools fail, state failure explicitly.
✔ Return a new markdown response with the extracted data.
✅ RESPONSE FORMAT (STRICTLY ENFORCED):
### 📝 Detailed Image Analysis (Result from '[Executed Tool Name]')
[Extracted OCR text, visual description, or failure message from the tool ONLY]⚠ No hallucinations. No AI-generated assumptions.
📌 FALLBACK MECHANISM (IF OCR TOOLS FAIL)
If BOTH
image_processorANDvisionfail, use a verified fallback OCR tool (if available).If no fallback exists, explicitly state failure instead of hallucinating content.
🎯 Summary: Strict 2-Response Workflow
✅ Step 1: Execute show_ordinals → Attempt Image Display (using local path) + Metadata. (Response intended as Non-Terminal)
✅ Step 2: Execute image_processor / vision → Analysis Description. (Separate Response)
💡 This ensures clarity, prevents AI hallucinations, and provides structured responses. 🚀
| Name | Required | Description | Default |
|---|---|---|---|
| txid | Yes | The unique 64-character hexadecimal identifier of the Bitcoin transaction to inspect for Ordinals. Example: 'f1d2d3...a8b9c0'. | |
| inscription_index | No | Optional. The specific index (starting from 0) of the inscription to retrieve within the transaction, if there are multiple. | |
| content_type_filter | No | Optional. Filter inscriptions by content type, e.g., 'image/png', 'text/plain', 'application/json'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does disclose important behavioral traits: it fetches inscription data, saves images locally, returns a local_file_path, and is part of a mandatory two-response workflow. It explains that code 'currently does NOT return a separate displayable source, only the local path' which is valuable behavioral context. However, it doesn't mention error conditions, rate limits, or authentication requirements.
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 extremely verbose (over 800 words) and poorly structured for a tool definition. It's front-loaded with workflow instructions rather than tool purpose. Most content is about the mandatory two-response process, fallback mechanisms, and response formats rather than concisely describing the tool itself. Every sentence does not earn its place in a tool description context.
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 3 parameters with 100% schema coverage but no annotations and no output schema, the description provides extensive workflow context but lacks critical tool-specific information. It doesn't explain what the tool returns (beyond mentioning local_file_path for images), error conditions, or performance characteristics. The workflow instructions are comprehensive but don't compensate for missing tool behavior documentation.
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 already documents all three parameters thoroughly. The description adds no parameter-specific information beyond what's in the schema. It mentions the tool fetches inscription data but doesn't explain how parameters affect this process. Baseline 3 is appropriate when schema does the heavy lifting.
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 states 'Fetches inscription data' which is a vague purpose statement. While it mentions Bitcoin Ordinals context, it doesn't specify what data is fetched (metadata, content, both) or how it differs from other potential tools. The description is primarily workflow instructions rather than a clear tool purpose definition.
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 explicit, detailed guidance on when to use this tool: 'MANDATORY FIRST STEP' for processing Bitcoin Ordinal inscriptions, specifically for images where it must save locally and return the local_file_path. It clearly states this is step 1 of a two-step workflow and specifies when to use sibling tools (image_processor/vision) in step 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
- First observed
show_ordinals
TDQS
With only one tool, there is no possibility of ambiguity or overlap between tools. The tool 'show_ordinals' has a singular, clear purpose of fetching Bitcoin Ordinal inscription data, so agents cannot misselect among multiple options.
The single tool name 'show_ordinals' follows a clear verb_noun pattern (show + ordinals), which is consistent and predictable. Since there is only one tool, there is no inconsistency to evaluate, and the naming convention is straightforward.
The server has only one tool, which is too few for its stated purpose of being a 'Bitcoin Ordinals Expert Assistant' with a mandatory two-step workflow involving multiple tools. The description references other tools like 'image_processor' and 'vision' that are not provided, creating a significant mismatch between the expected scope and the actual tool surface.
The tool set is severely incomplete. The server description mandates a two-response process using multiple tools (e.g., 'show_ordinals', 'image_processor', 'vision'), but only 'show_ordinals' is available. This leaves obvious gaps that will cause agent failures, as critical analysis steps cannot be performed without the missing 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
Bitcoin and YouTube video intelligence for AI agents. Pay-per-call via x402 USDC on Base.
Bitcoin wallet intelligence for AI agents: trust, labels, tx verify, fees, and timestamps.
Provide AI agents and automation tools with contextual access to blockchain data including balance…
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with the Stacks blockchain through Claude Desktop. Manage wallets, trade tokens on DEXs, stack STX for Bitcoin rewards, and track portfolio—all through natural conversation.306MIT
- AlicenseBqualityDmaintenanceEnables interaction with Bitcoin's blockchain through Claude to embed and read data using OP_RETURN, create timestamps, deploy BRC-20 tokens, and store documents up to 100KB on-chain.162MIT

MIDL MCP Serverofficial
FlicenseAqualityDmaintenanceEnables AI assistants to interact with the MIDL blockchain, supporting smart contract deployment, balance queries, asset bridging, Bitcoin Rune management, and more through natural language.291-- AlicenseCqualityDmaintenanceEnables AI applications to interact with the Bitcoin Network, manage wallets, check balances, convert prices, and send transactions.4616MIT
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/Laz1mov/mcp-inscription'
If you have feedback or need assistance with the MCP directory API, please join our Discord server