Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
DMINE_DBNoPath to the SQLite archive database~/.config/dmine/archive.sqlite
DMINE_PORTNoPort for the Chrome daemon's remote debugging endpoint9223
DMINE_MEDIANoPath to the directory where media is downloaded~/.config/dmine/media
DMINE_STATENoDirectory for locks and pid files~/.config/dmine
DMINE_PROFILENoPath to the browser profile directory~/.config/dmine/profile
DMINE_EXPORT_DIRNoMCP export sandbox directory~/.config/dmine/exports
DMINE_MAX_MEDIA_MBNoPer-file media download cap in megabytes1024

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
captureA

Archive a Discord channel into the SQLite archive.

Incremental by default: only messages newer than the stored watermark (MAX message id per channel) are fetched. Use full=True for a one-time backfill. Requires the persistent Chrome daemon (auto-starts; the user must have logged into Discord in its profile at least once).

Long jobs run in the background: the call waits up to wait seconds (default 45) and returns the full result if the capture finished in time. If it is still running, it returns {"status": "running", ...} immediately and the capture continues — call capture() again for the same channel to fetch the final result, or watch progress via status()/recent(). Never fire captures for several channels in parallel: they queue on the global capture lock and serialize automatically (capture() reports waiting_for_lock while queued).

Args: channel: channel ID or full discord.com/channels/... URL. full: backfill the entire history instead of incrementing. since: explicit watermark message ID (overrides the stored one). limit: hard cap on messages (test runs). no_media: skip attachment + embed-image downloads (CDN links expire!). refresh: re-extract ALL visible messages, retrofitting embed images onto rows captured before image extraction existed (combine with full=True for the whole channel). wait: seconds to wait synchronously for completion before returning a "running" summary (keep below your client's request timeout (many clients cap it at ~60 s). Returns: Dict with new_messages, seen, stop_reason, total_in_db — or a {"status": "running", "job": {...}} summary for long backfills.

recentA

Read the most recent archived messages of a channel (no browser needed).

Args: channel: channel ID or full URL. since: only messages with id > this message ID (e.g. the watermark from status() before a capture, to see what's new). limit: max messages (default 100). include_embeds: include embed text (tweet payloads live there). Returns: Dict: {"messages": [ {id, ts, author, content, embeds, attachments}, ... ]}.

searchA

Substring search over the archive (message content, embeds, author).

Without scope this spans every archived server. Use server= or channel= to restrict; every hit carries its server_id/server_name.

Args: query: search term (substring match; % and _ match literally). server: optional server ID or name (case-insensitive, unique substring ok) to restrict to. channel: optional channel ID/URL to restrict to (applies within the server scope, if any). limit: max hits (default 50). Returns: Dict: {"hits": [ {id, server_id, server_name, channel_id, author_name, ts, content}, ... ]}.

statusB

Archive status: total messages, per-channel watermark and counts.

Args: channel: optional channel ID/URL to show only that channel. Returns: Dict with totals, per-channel rows (id, name, msgs, watermark) and active_captures (background capture/backfill jobs currently running or queued on the capture lock, if any).

serversB

List Discord servers known to the archive (id, name, channels, messages).

channelsA

List channels known to the archive (optionally of one server).

Args: server: optional server ID or name to restrict to. Returns: Dict: {"channels": [ {id, server_id, server_name, name, last_message_id}, ... ]}.

mediaA

List attachments AND embed images archived for a channel.

Downloaded files live under DMINE_MEDIA (default ~/.config/dmine/media//, embed images in /embeds/). Entries without local_path only carry the CDN URL, which may already be expired. Use remedia() to (re-)download while the links are valid.

Args: channel: channel ID or full URL. limit: max messages to scan (default 200). message_since: only messages with id > this message ID. Returns: Dict: {"media_dir": str, "count": int, "attachments": [ ... ]} with per-entry kind ("attachment"|"embed_image"), message_id, ts, author, filename, downloaded, local_path, url.

remediaA

Re-download media (attachments + embed images) for ALREADY archived messages and persist local paths (idempotent, skips existing files). Also retries entries whose earlier download failed (no local file).

Like capture(), long runs continue in the background: the call returns a {"status": "running", ...} summary after wait seconds at the latest and the download continues — call remedia() again for the same channel to fetch the final result.

Args: channel: channel ID or full URL. limit: only the N most recent messages (None = all). wait: seconds to wait synchronously before returning a running summary. Returns: Dict: {"channel_id", "messages_with_media", "media_entries"}.

exportA

Export a channel from the archive to a file (jsonl or markdown).

The output path is sandboxed to the export directory (DMINE_EXPORT_DIR, default ~/.config/dmine/exports/) — absolute paths and '..' traversal are rejected.

Args: channel: channel ID or full URL. format: "jsonl" or "md". since: only messages with id > this message ID. out: filename relative to the export dir (default .). Returns: Dict with path, message_count.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct action on the Discord archive: capture ingests messages, recent/search read them, export writes them to a file, media/remedia manage attachments, and servers/channels/status provide metadata. No two tools have overlapping primary purposes, so an agent can select unambiguously.

Naming Consistency4/5

All names are lowercase single tokens without underscores or camelCase, which is a consistent format. However, the set mixes verbs (export, capture, search, remedia) and nouns/adjectives (status, servers, channels, media, recent), making the pattern slightly less predictable than a pure verb_noun scheme.

Tool Count5/5

Nine tools is well within the ideal 3–15 range for a focused archive server. Each tool corresponds to a clear capability (ingest, monitor, read, search, export, navigate, media management) and none feels redundant.

Completeness4/5

The set covers the core archive lifecycle: capture, status, recent, search, export, channel/server listing, and media listing/re-download. Minor gaps exist, such as no delete/prune operation for messages or channels and no way to cancel a running background capture, but these are workaround-able or outside typical agent workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues