06mcp server

Connect Claude, Cursor, or any Model Context Protocol client directly to our METRC bulletin archive and state resource data. Your assistant can then search and cite bulletins on its own, without you copying anything into the chat.

Transport
Streamable HTTP
Access
Read-only
Tools
7

What you get

overview

The Model Context Protocol (MCP) is an open standard that lets an AI assistant call external tools. Our server exposes the same bulletin and state resource data that sits behind the REST API, as tools your assistant can invoke while you talk to it.

Everything is read-only. There is no tool that can write, edit, or delete anything, so connecting is safe to experiment with.

The most useful tool is search_metrc_bulletin_content, which runs a semantic search over the text of every bulletin and returns only the relevant passages. That keeps large PDFs from flooding your assistant's context window, so questions like “what changed for California transporters this quarter?” work well.

01Get an API key

same keys as the REST API

The MCP server uses the same keys as the REST API. If you already have one, it works here with no extra steps.

  1. Sign in and open your API Keys page.
  2. Choose Create New API Key, give it a name that says where it will live (for example Laptop — Claude), and optionally set an expiry date.
  3. Copy the key immediately. It is shown once. Afterwards the page displays only the first 8 characters, which is enough to identify a key but not to use it.
Keep it secret
Treat the key like a password. Give each device or tool its own key — that way you can revoke one without disturbing the others. Deleting a key from that page cuts off access immediately.

02Connect your client

streamable http · stateless
Endpoint

The server speaks the Streamable HTTP transport and is stateless, so there is no session id to manage. Point your client at this URL:

Endpoint
https://mcp.sebastiantidwell.com/mcp

Note the /mcp on the end. The bare hostname is not the endpoint and will return 404.

Authentication

Send your key as either header — the server accepts both:

Headers
X-API-Key: YOUR_API_KEY

# or

Authorization: Bearer YOUR_API_KEY

If your client lets you choose, prefer X-API-Key. Some tools split header arguments on whitespace, which corrupts the Bearer <key> form.

Claude Code

One command, from your terminal:

Terminal
claude mcp add --transport http metrc https://mcp.sebastiantidwell.com/mcp \
  --header "X-API-Key: YOUR_API_KEY"
Cursor, Claude Desktop, and other config-file clients

Clients that support remote MCP servers natively take a block like this in their MCP settings:

mcp.json
{
  "mcpServers": {
    "metrc": {
      "type": "http",
      "url": "https://mcp.sebastiantidwell.com/mcp",
      "headers": {
        "X-API-Key": "YOUR_API_KEY"
      }
    }
  }
}
Clients without remote support

Older clients can only launch a local process. The community mcp-remote bridge closes that gap. Pass --transport http-only so it does not waste a round trip probing for an SSE endpoint that does not exist here:

mcp.json
{
  "mcpServers": {
    "metrc": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://mcp.sebastiantidwell.com/mcp",
        "--transport", "http-only",
        "--header", "X-API-Key:YOUR_API_KEY"
      ]
    }
  }
}

The colon in X-API-Key:YOUR_API_KEY has no space after it on purpose.

03Check it works

work up from the bottom

If your client will not connect, work up from the bottom. This should return {"status":"ok"}, and confirms you can reach the server at all:

Terminal
curl -i https://mcp.sebastiantidwell.com/health

Then confirm your key is accepted, and see the tools you have access to:

Terminal
curl -s -X POST https://mcp.sebastiantidwell.com/mcp \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}'

Responses come back in Server-Sent Events framing, which is normal for this transport — you will see a data: prefix on the JSON.

Available tools

7 tools · read-only

Your assistant picks these up automatically once connected, and decides which to call. You do not need to memorise them.

Tool 01list_metrc_bulletinsList bulletins with optional state, distribution date range, limit and offset. Returns metadata only.
Tool 02search_metrc_bulletin_contentSemantic search across bulletin text. Returns the most relevant excerpts rather than whole documents — use this for questions and summaries.
Tool 03get_metrc_bulletinFetch a single bulletin by id. Optionally include the extracted text, or the PDF as base64.
Tool 04get_metrc_bulletin_pdfFetch the PDF for one bulletin by id, base64 encoded.
Tool 05get_state_resourcesRegulatory resources for a single state, by two-letter code.
Tool 06list_all_state_resourcesResources for every state, grouped by state. Accepts an optional list of state codes to narrow the result.
Tool 07get_api_documentationThe REST API reference — base URL, endpoints, query parameters, examples, auth and rate limits.

Troubleshooting

common errors
404Why does the MCP server return a 404?The endpoint is at the /mcp path, not the root. Pointing a client at the bare hostname will always 404. There is also no legacy /sse endpoint, so clients that probe for Server-Sent Events first will 404 on that too; tell yours to use HTTP only.
405Why does GET /mcp return a 405?That is expected, and a good sign: it means routing works. MCP traffic is POST only, so a browser or a plain curl will always see the 405.
401Why does the MCP server return a 401?The key is missing, misspelled, expired or deactivated. Check it against the list on your API Keys page, which shows the first 8 characters of each key so you can tell them apart.
HeaderWhat if my MCP client mangles the Authorization header?Some bridges split header arguments on whitespace, which breaks the "Bearer <key>" form. Use the X-API-Key header instead; its value has no spaces, so it survives.

Still stuck? Get in touch and include the exact error your client shows.