dank-mcp is a Model Context Protocol (MCP) server for querying cannabis datasets. It is brought to you by AgentDank for educational and legal purposes.
Note
Status: under refactor. dank-mcp is being reworked toward a generic, declarative dataset-binding architecture (see Notes on Design). You can bootstrap a dataset via --fetch <id>, which downloads a prebuilt snapshot from dank-data. Today the only dataset is us/ct.
AgentDank_CT.mp4
- Installation
- Using with LLMs
- Loading Data
- Command Line Usage
- Building
- Notes on Design
- Contribution and Conduct
- Credits and License
Snapshots of cannabis datasets are curated at the AgentDank dank-data repository; you can point dank-mcp at any DuckDB file via --db.
While we'd like to have pre-built binaries and Homebrew packages, we're having an issue with that right now. So the preferred way to install is using go install or building from source:
$ go install github.com/AgentDank/dank-mcp@latestIt will be installed in your $GOPATH/bin directory, which is often ~/go/bin.
To use this dank-mcp MCP server, you must configure your host program to use it. We will illustrate with Claude Desktop. We must find the dank-mcp program on our system; the example below shows where dank-mcp is installed with my go install.
The following configuration JSON (also in the repo as mcp-config.json) sets this up:
{
"mcpServers": {
"dank": {
"command": "~/go/bin/dank-mcp",
"args": [
"--root", "~"
]
}
}
}Using Claude Desktop, you can follow their configuration tutorial but substitute the configuration above. With that in place, you can ask Claude questions and it will use the dank-mcp server.
I'm currently having issues with this working well, but leaving instructions for those interested.
For local inferencing, there are MCP hosts that support Ollama. You can use any Ollama LLM that supports "Tools". We experimented with mcphost, authored by the developer of the mcp-go library that performed the heavy lifting for us.
Here's how to install and run it with the configuration above, stored in mcp-config.json:
$ go install github.com/mark3labs/mcphost@latest
$ ollama pull llama3.3
$ mcphost -m ollama:llama3.3 --config mcp-config.json
...chat away...
dank-mcp can download a prebuilt DuckDB snapshot from the AgentDank dank-data repo:
$ dank-mcp --list # show available datasets
$ dank-mcp --fetch us/ct # download and serve
$ dank-mcp --fetch us/ct --fetch-only # download and exit
$ dank-mcp --fetch us/ct --force # force re-downloadDownloads are cached at .dank/cache/<id>/dank-data.duckdb under --root (or the current directory). The cache is re-used for 7 days before a new download happens; use --force to override.
The snapshot's SHA-256 is verified against the catalog before install, and the local file is atomically replaced via rename — there's no window where a torn file is visible.
Here is the command-line help:
usage: ./bin/dank-mcp [opts]
--db string DuckDB data file to use, use ':memory:' for in-memory. Default is '.dank/dank-mcp.duckdb' under --root
--fetch string Dataset id to download from dank-data (e.g., us/ct)
--fetch-only Download only; do not start the MCP server
--force Force re-download even if cache is fresh (requires --fetch)
-h, --help Show help
--list List datasets from the dank-data catalog and exit
-l, --log-file string Log file destination (or MCP_LOG_FILE envvar). Default is stderr
-j, --log-json Log in JSON (default is plaintext)
--root string Set root location of '.dank' dir (Default: current dir)
--sse Use SSE Transport (default is STDIO transport)
--sse-host string host:port to listen to SSE connections
-v, --verbose Verbose logging
The server currently registers a single MCP tool, query, which takes a sql string argument and returns CSV. The DuckDB is opened read-only and further locked down via SET enable_external_access=false, so only pure SQL over local data is permitted.
Building is performed with task:
$ task
task: [build] go build -o bin/dank-mcp
dank-mcp is being reworked around a small set of ideas:
- Locked-down read-only DuckDB — the server opens DuckDB with
access_mode=read_onlyand appliesSET enable_external_access=falseso exposing a generic SQL tool is safe. - Generic
queryMCP tool — rather than hand-rolling per-dataset tools,dank-mcpexposes onequery(sql)tool that runs against whatever DuckDB you point it at. - Declarative dataset bindings (in progress) —
pkg/dankdefines aRegistrarinterface and JSON-taggableBinding/ResourceQuery/ToolQuerystructs. The intent is that new datasets can be added as config-driven bindings rather than bespoke Go code.
The previous surface bundled a Connecticut cannabis brands dataset directly into the binary. That code has been removed; datasets will be re-introduced via the binding mechanism above.
If all you want is SQL access to a DuckDB file, MotherDuck's mcp-server-motherduck is a more general-purpose alternative. The goal of dank-mcp is to bundle cannabis-specific prompts, resources, and tools on top of that.
Pull requests and issues are welcome. Or fork it. You do you.
Either way, obey our Code of Conduct. Be shady, but don't be a jerk.
Copyright (c) 2025 Neomantra Corp. Authored by Evan Wies for AgentDank.
Released under the MIT License, see LICENSE.txt.
Made with 🌿 and 🔥 by the team behind AgentDank.